只要在设备上卸载并重新安装应用程序,iOS 设备的唯一持久标识符就会发生变化。 出于隐私方面的考虑,iOS 对唯一持久标识符进行了严格限制。
我怎样才能得到一个唯一的、固定的身份ID?
我正在尝试这段代码,但在我卸载应用程序并重新安装后,我的唯一 ID 发生了变化。
var uuidKey = new NSString("myDeviceUUID");
string bundleId = NSBundle.MainBundle.BundleIdentifier;
string uuid = null;
if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0))
{
uuid = UIDevice.CurrentDevice.IdentifierForVendor.AsString();
}
else
{
uuid = NSUserDefaults.StandardUserDefaults.StringForKey(uuidKey);
}
if (uuid == null)
{
uuid = Guid.NewGuid().ToString();
}
string uniqueId = $"{bundleId}-{uuid}";
NSUserDefaults.StandardUserDefaults.SetString(uuid, uuidKey);
Xamarin.Forms.Application.Current.Properties["DeviceId"] = uniqueId;
Xamarin.Forms.Application.Current.SavePropertiesAsync();
您可以将自定义 UUID 存储在钥匙串或 iCloud 键值存储中,即使在卸载并重新安装应用程序后也能保持唯一标识符。有两种方法:
使用钥匙串
您可以生成自定义 UUID 并将其存储在钥匙串中。应用程序卸载并重新安装时不会删除钥匙串数据,因此您可以在重新安装时检索 UUID。但是,当启用钥匙串同步时,这种方法可能不起作用,因为所有同步的设备都将获得相同的供应商 ID。
var appName = NSBundle.MainBundle.InfoDictionary["CFBundleName"].ToString();
var strApplicationUUID = SSKeychain.PasswordForService(appName, "incoding");
if (strApplicationUUID == null)
{
strApplicationUUID = Guid.NewGuid().ToString();
SSKeychain.SetPassword(strApplicationUUID, appName, "incoding");
}
使用 iCloud 键值存储
另一种选择是将自定义 UUID 存储在用户的 iCloud 键值存储中。此标识符将特定于用户而不是特定于设备,并将在应用程序卸载和重新安装过程中持续存在。
var uuidKey = new NSString("myDeviceUUID");
string uuid = NSUbiquitousKeyValueStore.DefaultStore.StringForKey(uuidKey);
if (uuid == null)
{
uuid = Guid.NewGuid().ToString();
NSUbiquitousKeyValueStore.DefaultStore.SetString(uuid, uuidKey);
NSUbiquitousKeyValueStore.DefaultStore.Synchronize();
}
请记住,Apple 有严格的隐私政策,您必须向用户公开您对他们数据的使用情况。如果您出于广告目的需要跟踪用户,则必须通过 AppTrackingTransparency 框架获得他们的许可。