首页 > 解决方案 > Unity3D firebase AUTH 不适用于 ANDROID

问题描述

因此,我正在制作的应用程序使用 firebase auth 进行注册和登录。注册成功,用户在统一编辑器、iPhone 和 Android 上添加到我的 firebase 控制台。但登录仅适用于统一编辑器和 iOS。它不适用于Android,我不知道为什么。我什么都试过了。我的登录代码与此处基本相同: https ://github.com/misskaseyann/firebase-unity-auth/blob/master/Scripts/Authentication/SignInHandler.cs 唯一的区别在于我不显示 UI' t 在场景之间切换但启用不同的面板,例如:

void Start()
{
    auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    signinButton.onClick.AddListener(() => {
        SigninWithEmailAsync();
    });
    createAccountButton.onClick.AddListener(() => {
        FindObjectOfType<LoginManagerScript>().LoginPanel.SetActive(false);  
        FindObjectOfType<LoginManagerScript>().RegisterPanel.SetActive(true);
    });
}

由于某种原因,android 上的 signinButton.onClick 无法正常工作。即使我在监听器中放了其他东西(比如调试),当我点击它时它也不会显示。但它显示在编辑器和 iPhone 上。我在这里做错了什么?当我打开应用程序时,ADB logcat 会这样说:

InvalidOperationException:在 CheckDependencies 完成之前不要调用 Firebase 函数

我检查了应用程序包 ID,它与 Firebase 中的相同。奇怪的是,即使我按下登录按钮,似乎什么也没有发生。无论。为什么?

标签: c#androidfirebaseunity3dfirebase-authentication

解决方案


如果您不介意,我会尝试在您的答案@sesmajster 周围添加更多上下文(在评论中需要做很多事情)。

您的解决方法是基本上调用CheckAndFixDependenciesAsync. 这样做是因为在 Android 上,Firebase 的许多功能都依赖于 Google Play 服务 (GPS)。此调用将确保 GPS 可用,并在 GPS 过期时提示玩家升级 GPS。如果玩家决定退出更新或拥有无法访问 GPS 的设备(在美国,最常见的是 Kindle 平板电脑或 VR 耳机),您将获得DependencyStatus.Unavailable可以采取进一步行动的结果。请注意,在 Android 上,GPS 并不是普遍需要的——将来可能不需要此调用。

在桌面平台(MacOS、Windows 和 Linux——最常见于在 Unity 编辑器中开发时)和 iOS 中,没有等效的外部依赖项。此调用在此处是可选的,但仍建议在它出现的情况下进行。

对于您的回答,我将推荐一项额外的更改。你所做的有点不安全,firebaseReady应该标记为volatile,你可以做得比轮询每一帧更好。我确定您已经意识到ContinueWith在后台线程上触发并可能导致 Unity 出现一些问题,但是 Firebase 提供了一种扩展方法ContinueWithOnMainThread,可以像这样简化您的代码:

public class FirebaseINIT : MonoBehaviour
{
    void Start()
    {
        CheckIfReady();
    }

    public static void CheckIfReady()
    {

        Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
            Firebase.DependencyStatus dependencyStatus = task.Result;
            if (dependencyStatus == Firebase.DependencyStatus.Available)
            {

                Firebase.FirebaseApp app = Firebase.FirebaseApp.DefaultInstance;
                SceneManager.LoadScene("LoginScene");
                Debug.Log("Firebase is ready for use.");
            }
            else
            {
                UnityEngine.Debug.LogError(System.String.Format(
                  "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
            }
        });
    }
}

(你也可以选择async/await或使用协程,但我认为最好匹配你当前的风格)。我在这篇博文这段视频中更详细地介绍了这一点。


推荐阅读