首页 > 解决方案 > Unity 在 Android 上登录 anynomous

问题描述

我正在尝试在我开发的游戏中在我的 android 设备上登录 anynomous。当我在我的 Macbook 上的 Unity 编辑器中运行游戏时,一切运行顺利并且数据库正在更新。

但是当我在我的三星设备上编译并运行它时,什么也没有发生,它只是冻结了。有谁知道为什么?我尝试将 sha1 密钥添加到我在 Firebase 上的项目的指纹中,但没有运气。

这是代码:

private void anonymousSignIn()
{
    auth = Firebase.Auth.FirebaseAuth
        .DefaultInstance;
    auth.SignInAnonymouslyAsync().ContinueWith(task => {
        if (task.IsCanceled)
        {
            Debug.LogError("SignInAnonymouslyAsync was canceled.");
            return;
        }
        if (task.IsFaulted)
        {
            Debug.LogError("SignInAnonymouslyAsync encountered an error: " + task.Exception);
            return;
        }

        user = task.Result;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
        print("User signed in");
        removeUser();
    });
    print("Auth done");
}

private void prepareDatabase()
{
    FirebaseApp.DefaultInstance
        .SetEditorDatabaseUrl("mydatabaseadress/");
    DatabaseReference reference =
        FirebaseDatabase.DefaultInstance.RootReference;
    string userId = "Erik";
    User user = new User(userId, 24);
    string json = JsonUtility.ToJson(user);
    reference.Child("highscore").Child(userId).SetRawJsonValueAsync(json);
}

标签: androidfirebaseunity3dfirebase-authentication

解决方案


我需要在冻结点或 Android logcat 输出时进行堆栈跟踪,以查看到底发生了什么*我推荐这个 Unity 插件来帮助解析 LogCat)。在不知道所有这些是如何联系在一起的情况下,很难说出“冻结”在您的游戏上下文中可能意味着什么,或者哪个调用可能导致您的问题。我确实看到了一些可能的问题:

1)SetEditorDatabaseUrl不是必需的,我从不在自己的项目中使用它。我假设这"mydatabaseadress/"是这个堆栈溢出问题的一个临时值,但如果您的项目中只有一个数据库,它也是一个不必要的潜在错误表面。

2)removeUser可能在 Unity 中做一些工作。出于这个原因,您应该替换ContinueWithContinueWithOnMainThread(see this )。这也将确保您获得所有必要的日志记录。

3)auth.CurrentUser将在您的游戏运行之间持续存在。每次调用auth.SignInAnonymouslyAsync都会创建一个新用户——即使已经注册了一个用户。您应该将您的身份验证代码更改为:

auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
if (auth.CurrentUser == null) {
    auth.SignInAnonymouslyAsync().ContinueWithOnMainThread(task => {

并记住removeUser()else.

4)在您的prepareDatabase通话中,您有一个硬编码的string userId = "Erik". 如果您有如下数据库规则:

{
  "rules": {
    "highscore": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

那么它将永远被拒绝。

5) 同样,如果你没有等待auth.SignInAnonymouslyAsync完成才调用prepareDatabase,默认"auth != null"可能会自动失败。

我希望这会有所帮助!

——帕特里克


推荐阅读