【问题标题】:Identify same user on different Android devices在不同的 Android 设备上识别同一用户
【发布时间】:2018-04-28 21:45:51
【问题描述】:

我正在开发一款 Unity 游戏,玩家在其中建造一座城市,并将用户进化数据保存在服务器上。 考虑到这一点,我需要检测玩家何时连接到不同的设备,以便为他提供自己的城市(而不是新城市)。实现这一目标的最佳方式是什么?如果可能的话,不需要玩家采取任何行动,例如点击登录按钮或接受权限?

目前我只为 Android 开发,我的理解是我需要应用程序为服务器提供一个它可以验证的 TokenId(并检索相关的玩家 ID)。我该怎么做?我正在尝试使用 Google Play Games(Unity 插件),但它似乎有很多我不需要的功能。除此之外,可能是因为这些功能,在我第一次尝试时,我要求用户授予以下权限:

  • 了解您在 Google 上的身份
  • 管理此游戏的游戏活动

我玩过其他与 Google Play 帐户关联的游戏,不要求此类权限,只需说“欢迎 XXX”。 谁能给我一些关于如何做到这一点的提示?

【问题讨论】:

    标签: c# android unity3d device gnupg


    【解决方案1】:

    实现这一目标的最佳方法是什么,如果可能,最好的方法是什么? 要求玩家采取行动,例如点击登录按钮或 接受权限?

    无法在未经许可的情况下在不同设备上检测到同一用户。您必须有一种方法来检测这些不同设备上的共同点,以确定它是否是同一用户。

    在这种情况下,唯一可能的信息是设备上注册的帐户,它需要权限。没有其它的方法。这可能是做到这一点的唯一方法。

    这是唯一需要的权限,可以很容易地added 访问您的 Unity 项目。无需插件:

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    

    获取绑定到设备的帐户或电子邮件,并使用WWWUnityWebRequest API 确定它是否在服务器上,然后提取保存在该帐户上的数据。

    这里是如何使用 C# 获取 Android 设备上的所有帐户:

    string[] getAllEmailAccounts()
    {
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
    
        AndroidJavaClass ACManager = new AndroidJavaClass("android.accounts.AccountManager");
        AndroidJavaObject ACManagerAct = ACManager.CallStatic<AndroidJavaObject>("get", currentActivity);
    
        AndroidJavaObject accounts = ACManagerAct.Call<AndroidJavaObject>("getAccountsByType", "com.google");
        AndroidJavaObject[] accountArray = AndroidJNIHelper.ConvertFromJNIArray<AndroidJavaObject[]>(accounts.GetRawObject());
    
        string[] accountName = new string[accountArray.Length];
    
        for (int i = 0; i < accountName.Length; i++)
        {
            accountName[i] = accountArray[i].Get<string>("name");
        }
    
        return accountName;
    }
    

    通过这样做,您将避免为此使用 Google Play 游戏插件。

    【讨论】:

    • 感谢您的详细解答。这样如何保证服务器端从App接收到的数据的真实性?想象一下,有人创建了一个脚本来尝试不同的帐户名称,并且幸运地得到了一个有效的。
    • 上次我检查时,该数组中返回的第一个帐户链接到需要用户名和密码的 android 市场,这意味着使用第一个项目是安全的。我不知道从那以后这是否发生了变化。我建议你在使用它之前运行测试和验证。
    • 在我之前的回答中,也许我没有正确解释,但我需要验证服务器上收到的用户标识数据。否则,一个玩家可以操纵数据并从另一个玩家那里获得城市。按照 Google Developers 网站 (developers.google.com/identity/sign-in/android/backend-auth) 上的建议,我们不应该接受普通的用户 ID,因此我将使用 TokenId 方法(使用 Unity 的 Google Play Games 插件)。尽管如此,我还是很感谢您的回答,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多