我的应用程序具有应用内货币和非消费品,它存储用户配置文件并将值发布到我服务器上的排行榜。
在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持久性,即使用户重新安装应用程序?
答案 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);
}