13

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

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

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

问题可能是什么?奇怪的是,开发团队的设备还没有发生这种情况。或者在无数次应用程序更新、操作系统更新等之后仍然有用户没有遇到过这个错误。这种情况只发生在一小部分用户身上。所有用户都是 iOS7+,它发生在不同的设备型号和 iOS 版本上。

我使用此代码获取他们的 ID:

static let DeviceId = UIDevice.currentDevice().identifierForVendor.UUIDString

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

NSUserDefaults.standardUserDefaults().setBool(true, forKey: "User" + DeviceId)
NSUserDefaults.standardUserDefaults().synchronize()

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

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
    }
}

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

4

3 回答 3

7

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

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

于 2015-10-14T16:18:57.943 回答
0

将 vendorID 保存在 KeyChain 中,这将在删除或任何更新后保留。

-(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;
}

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

于 2015-05-28T15:33:45.353 回答
0

我很困惑为什么您首先将 IFV 保存到 NSUserDefaults 然后检查该密钥是否存在。我觉得你应该...

1)先检查NSUserDefaults,看看你创建的IFV键是否存在

2)如果 NSUserDefaults 键确实存在,很好地做你需要的,这个用户的配置文件已经存在

3)如果key不存在,获取IFV并将其保存到NSUserDefaults

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

if ([defaults valueForKey:@"IFV"]) {
    //this user already exists, do what you need to do next with IFV
}

else{
    //this is their first time using the app
    NSString *ifvString = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    [defaults setValue:ifvString forKey:@"IFV"];

    //do what you need to do next with IFV
}
于 2015-10-28T03:12:46.790 回答