iOS 设备的唯一持久标识符会在应用程序卸载并重新安装到设备上时发生变化

问题描述 投票:0回答:1

只要在设备上卸载并重新安装应用程序,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();
c# xamarin xamarin.forms xamarin.ios
1个回答
0
投票

您可以将自定义 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 框架获得他们的许可。

© www.soinside.com 2019 - 2024. All rights reserved.