Unity安卓应用Firebase邮箱密码认证移动端无法正常工作
Hey,我之前开发Unity安卓应用时也踩过Firebase Auth登录的这个坑,编辑器里跑的好好的,一到真机就炸,结合你给出的截断日志来看,大概率是几个常见的问题导致的,给你梳理下排查和解决的方向:
排查与解决步骤
1. 先确认Firebase安卓配置没漏
- 首先检查
Assets/Plugins/Android目录下的google-services.json是不是从Firebase控制台下载的、对应你当前安卓包名的版本——包名大小写、字符都得完全匹配,差一点都不行。 - 然后去Player Settings的Publishing Settings里,确保勾选了
Custom Main Gradle Template和Custom Launcher Gradle Template,Firebase需要通过Gradle加载安卓端的SDK,没开这俩的话真机上会缺失核心组件,直接导致后续事件调用失败。
2. 异步回调的线程问题是重灾区
Firebase的登录接口是异步的,回调默认跑在后台线程,但Unity的UI操作(比如按钮事件、更新UI文本)必须在主线程执行。编辑器里线程管控比较松,可能没报错,但安卓端严格执行线程规则,就会触发你看到的Unity事件调用异常。
解决办法很简单:把UI相关的操作切回主线程。可以用现成的UnityMainThreadDispatcher,或者自己写个简单的调度器:
示例登录代码(带主线程切换)
public void OnLoginButtonClicked(string email, string password) { FirebaseAuth.DefaultInstance.SignInWithEmailAndPasswordAsync(email, password) .ContinueWith(task => { if (task.IsCompletedSuccessfully) { // 把UI操作扔到主线程执行 MainThreadDispatcher.Instance().Enqueue(() => { Debug.Log("登录成功!"); // 这里放跳转页面、显示成功提示等UI操作 }); } else { MainThreadDispatcher.Instance().Enqueue(() => { Debug.LogError($"登录失败:{task.Exception?.InnerException?.Message}"); // 显示错误提示给用户 }); } }); }
自定义主线程调度器代码
如果不想找第三方插件,自己写个轻量版的:
using UnityEngine; using System.Collections.Generic; public class MainThreadDispatcher : MonoBehaviour { private static MainThreadDispatcher _instance; private readonly Queue<System.Action> _pendingActions = new Queue<System.Action>(); private readonly object _lockObj = new object(); public static MainThreadDispatcher Instance() { if (_instance == null) { _instance = FindObjectOfType<MainThreadDispatcher>(); if (_instance == null) { var dispatcherObj = new GameObject("MainThreadDispatcher"); _instance = dispatcherObj.AddComponent<MainThreadDispatcher>(); DontDestroyOnLoad(dispatcherObj); } } return _instance; } private void Update() { lock (_lockObj) { while (_pendingActions.Count > 0) { _pendingActions.Dequeue().Invoke(); } } } public void Enqueue(System.Action action) { lock (_lockObj) { _pendingActions.Enqueue(action); } } }
3. 检查安卓权限与网络配置
- 确保安卓Manifest里加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />,Firebase Auth要联网验证,没权限的话会默默失败,进而触发后续的事件异常。 - 如果你的应用目标是Android 11+,可以确认下是否需要
QUERY_ALL_PACKAGES权限(一般登录场景不需要,但保险起见可以检查)。
4. 打包设置优化
- 把Player Settings里的
Scripting Backend设为IL2CPP,Api Compatibility Level设为.NET 4.x——Firebase对.NET 4.x的支持比.NET Standard 2.0更稳定。 - 如果打包时勾选了
Strip Engine Code,一定要在Link.xml里添加Firebase代码的保留规则,避免核心代码被剥离:
<linker> <assembly fullname="Firebase.Auth" preserve="all"/> <assembly fullname="Firebase.Core" preserve="all"/> </linker>
5. 补全错误日志
你给出的日志被截断了,建议用adb logcat -s Unity Firebase命令在电脑上获取完整的安卓日志,这样能精准定位到底是Firebase初始化失败,还是Auth本身的错误导致后续事件调用出问题。
内容的提问来源于stack exchange,提问作者DannyFar94
相关产品推荐
相关产品推荐

