为什么iOS会在应用更新时获得新的identifierForVendor?

Esq*_*uth 13 user-identification userid udid ios

每次我的应用程序从App Store更新时,由于某种原因,少数用户会获得新的identifierForVendor.我的用户没有注册或登录.它们都是匿名的,因此我需要通过供应商ID将它们分开.

我认为在某些设备上可能没有足够的空间,导致应用程序被删除并重新安装,但事实并非如此,因为在上一次更新中,我的一个朋友有超过2GB的空闲空间.

我知道删除并重新安装应用程序的用户更改了identifierForVendor.但这不是这里的情况,因为应用程序刚刚更新.

问题是什么?奇怪的是,尚未发现开发团队设备.或者仍然有用户在无数的应用更新,操作系统更新等之后没有遇到此错误.这只发生在一小部分用户身上.所有用户都是iOS7 +,它适用于不同的设备型号和iOS版本.

我使用此代码获取其ID:

static let DeviceId = UIDevice.currentDevice().identifierForVendor.UUIDString
Run Code Online (Sandbox Code Playgroud)

然后我将它们保存到NSUserDefaults中:

NSUserDefaults.standardUserDefaults().setBool(true, forKey: "User" + DeviceId)
NSUserDefaults.standardUserDefaults().synchronize()
Run Code Online (Sandbox Code Playgroud)

然后我会在每次新登录时检查用户是否存在:

static func doesUserExist() -> Bool {
    var userDefaultValue: AnyObject? = NSUserDefaults.standardUserDefaults().valueForKey("User" + DeviceId)

    if defaultValue == true {
        println("Userdefaults already has this guy, moving on")
        FirstTime = false
        return true
    } else {
        println("First time in the app!")
        FirstTime = true
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

如果用户确实存在,则启动登录过程.如果用户不存在,则向他们显示注册过程.我使用Parse.com作为后端,deviceID用作用户名.当少量用户遇到此错误时,我会看到一个新用户名和一个新帐户.

cha*_*ite 7

在5月到7月期间从应用商店更新应用时,存在影响identifierForVendor计算的错误.Apple声称他们已经解决了这个问题并推动另一次更新应该在关键日期之前恢复原始值.参考:https://openradar.appspot.com/22677034

请注意,一些用户甚至在7月之后的几周内仍然观察到此问题.所以仍有可能某些bug仍然存在,或者它可能在将来的任何时候重新出现.因此,如果您将此数据用作加密的一部分,最好将其保存到钥匙串中.


dog*_*god 0

将供应商 ID 保存在 KeyChain 中,该 ID 在删除或任何更新后仍将保留。

-(NSString *)getUniqueDeviceIdentifierAsString
{

NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];

NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"];
if (strApplicationUUID == nil)
{
    strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"];
}

return strApplicationUUID;
}
Run Code Online (Sandbox Code Playgroud)

免责声明:我不久前从其他一些SO答案中获取了代码,所以我不记得该赞扬谁,但最终不是我
@Jonny找到了来源

  • 谢谢你的代码。这将有助于解决这个问题。然而这篇文章更多地关注问题可能是什么,而不是解决方案。 (2认同)
  • 如果您在保存到钥匙串时使用本机安全框架,则有一个属性可以使钥匙串项目只能由设备访问。也就是说,它不会同步到 iTunes 或 iCloud。您可以将此值添加到属性中:CFDictionaryAddValue(attributes, kSecAttrAccessible, kSecAttrAccessibleWhenUnlockedThisDeviceOnly) (2认同)