iOS中的用户ID用于存储配置文件并检查IAP

时间:2016-06-08 11:28:58

标签: ios iphone xamarin.ios in-app-purchase

我的应用程序具有应用内货币和非消费品,它存储用户配置文件并将值发布到我服务器上的排行榜。

在Android(纯java)中我有LVL用户ID - 对于开发者 - 客户来说它是唯一的,所以我可以在他的所有设备上轻松管理用户配置文件,我可以区分使用IMEI或Android ID的设备。

在Windows / Windows Phone(monogame)中,我有LiveID,但设备没有ID,除了用于统计/广告的自生成UUID。无法确定它是否会持续重新安装和更新。

iOS(也许是OSX)(Xamarin.iOS / monogame)怎么样? 据我记得在iOS中是设备ID,但后来api被弃用了。 你用什么作为设备/用户ID? 也许StoreKit在幕后有一些用户唯一ID? 或者与云ID相关的东西,区分用户,而不是设备? 如果没有可用 - 有没有办法在设备上保持随机UUID持久性,即使用户重新安装应用程序?

1 个答案:

答案 0 :(得分:1)

当Apple删除了UUID时,他们提供了identifierForVendor方法(在UIDevice中)来替换它。它为特定设备的您(开发人员)提供了唯一的UUID。我不能告诉你如何从xamarin那里打电话,但会认为它是可能的。

如果您想要在删除应用程序时保留的内容,您可以创建自己的UUID并将其保存到钥匙串中。您可以使用应用程序组为所有应用程序创建共享钥匙串,如果删除并重新安装应用程序,则会保留钥匙串条目。

Tertium:以下是示例代码(已测试)。如果您将其存储在云中,则可以在所有用户的设备上使用它。

        void SaveValueToKeychain(string key, String value)
        {
            var s = new SecRecord(SecKind.GenericPassword)
            {
                ValueData = NSData.FromString(value),
                Generic = NSData.FromString(key),
                Invisible = true,
                CreationDate = NSDate.Now

            };
            var err = SecKeyChain.Add(s);

        }

        public String GetValueFromKeychain(string key)
        {
            String ret = null;
            SecStatusCode res;
            var rec = new SecRecord(SecKind.GenericPassword)
            {
                Generic = NSData.FromString(key)
            };
            var match = SecKeyChain.QueryAsRecord(rec, out res);
            if (match != null)
            {
                ret = match.ValueData.ToString();
            }
            return ret;
        }

...

        string UUID_KEY = "com.my.app";
        String id = GetValueFromKeychain(UUID_KEY);

        if (id == null)
        {
            Guid g = Guid.NewGuid();
            String gs = g.ToString().Replace("-", "");
            Debug.Write("ID not found, generating: " + gs);
            SaveValueToKeychain(UUID_KEY, gs);
            id = GetValueFromKeychain(UUID_KEY);
        }
        else
        {
            Debug.Write("ID found: " + id);
        }