如果我们正在使用PhoneGap,我们如何未雨绸缪,以应对iOS 6即将删除UDID / UUID的情况?

3

我们目前在使用PhoneGap开发移动应用程序,我知道他们有device.udid (http://docs.phonegap.com/en/1.0.0/phonegap_device_device.md.html#device.uuid) 来获取唯一标识符。为了使我们当前的应用程序在iOS 6发布后仍能正常工作,最好的方法是什么?我们是否应该开始使用其他解决方案(如MAC地址等)来确保未来兼容性?

2个回答

15

查看 CFUUIDCreate 的文档:

https://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFUUIDRef/Reference/reference.html

我使用下面的方法创建一个UUID,并在第一次启动应用程序时将其保存到用户首选项中:

- (NSString *)getUUID
{
    NSString *UUID = [[NSUserDefaults standardUserDefaults] objectForKey:@"uniqueID"];
    if (!UUID)
    {
        CFUUIDRef theUUID = CFUUIDCreate(NULL);
        CFStringRef string = CFUUIDCreateString(NULL, theUUID);
        CFRelease(theUUID);
        UUID = [(__bridge NSString*)string stringByReplacingOccurrencesOfString:@"-"withString:@""];
        [[NSUserDefaults standardUserDefaults] setValue:UUID forKey:@"uniqueID"];
    }
    return UUID;
}

2
太好了!在将uniqueID保存到用户默认设置后,我会添加[[NSUserDefaults standardUserDefaults] synchronize];。此外,在某些情况下,使用iCloud同步UniqueID似乎是一个好主意,因为它可以识别一个特定的用户,无论他/她有多少设备。 - Ben
这种方法的缺点是UUID可以通过复制默认文件从一个设备复制到另一个设备。因此,不能使用它使例如InAppPurchases无法在不通过应用商店恢复购买的情况下转移到另一个设备。 - cat
@cat 你可以将这个存储在非备份位置或钥匙串中,避免备份问题吗? - Glen T
1
iOS6提供了一个很好的UUID替代方案:[UIDevice identifierForVendor]。它的优点是不需要存储。然而,“Bill the Lizard”在这里删除了答案,但你可能可以自己找到文档。 - cat

6

我喜欢这种方法,但是因为使用MAC地址生成设备唯一标识码而导致应用被拒绝的情况是否存在?这似乎会给苹果带来与UUID相同的问题。 - Ben
1
@Ben 你的情况可能会有所不同,但我在应用商店中使用这种方法没有遇到问题。从隐私角度来看,使用MAC地址更糟糕,因为UDID在设置为新设备时会更改,而MAC地址则不会。但是当你取消一个API并且没有用适当的替代品取代它时,人们会找到实现相同结果的方法,这就是生活。 - Wayne Hartman
在提交消息中有一个冗长的讨论,指出该库存在严重的隐私泄露问题。任何想要替换设备特定 UUID 的人应该考虑不使用这个库,否则会危及他们的用户隐私。 - Alan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接