c# - 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 中的相同。奇怪的是,即使我按下登录按钮,似乎什么也没有发生。无论。为什么?
解决方案
如果您不介意,我会尝试在您的答案@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
或使用协程,但我认为最好匹配你当前的风格)。我在这篇博文和这段视频中更详细地介绍了这一点。
推荐阅读
- javascript - 第 530 行的错误 1062 (23000):重复条目 '20190617051131-apply-schema.js' 用于键 'PRIMARY'
- laravel - Laravel 附加在关联键上
- opencv - 将 numpy ndarray (1, 160, 160) 保存到灰度图像中
- java - 创建一个 ID 数组并随机化他们的年龄
- arrays - 如何分配 ID 来识别重复的数组元素?
- node.js - 如何在猫鼬中为模式类型日期分配日期值
- algorithm - Big-o 复杂性问题 - 线性累积功率
- node.js - NodeJS 执行一个提示键盘输入的 bash 脚本
- java - 如何在 `var` 关键字上抑制此警告?
- mysql - 调用未定义的方法 PDO::last_Insert_Id()