在不同的Android设备上识别相同的用户

时间:2018-04-28 21:45:51

标签: c# android unity3d device gnupg

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

目前我只针对Android进行开发,我的理解是我需要App为服务器提供可以验证的TokenId(并检索相关的玩家ID)。我该怎么做?我正在尝试使用Google Play游戏(Unity插件),但它似乎有很多我不需要的功能。除此之外,可能是因为这些功能,在我的第一次尝试中询问用户的权限:

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

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

1 个答案:

答案 0 :(得分: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游戏插件。