You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:14:06