iOS7 - 设备唯一标识符

23

我们的iOS应用是针对特定用户的。因此,我们使用设备唯一标识符进行用户识别。这种方法在iOS 6之前很好用,因为我们每次都得到相同的值。

NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];
在iOS 7中,上述方法返回不同的值,并且我们在用户识别方面遇到了问题。 iOS 7 API提供以下替代方法。
NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor];
[strApplicationUUID setString:[oNSUUID UUIDString]];

我将 "uniqueIdentifier" 替换为 "identifierForVendor",并创建了临时构建。在iOS 7和iOS 6设备上安装了构建。到目前为止,在iOS 7上每次都会得到相同的值,但是在iOS 6上,当我们删除并重新安装应用程序时,每次都会给出不同的值。

目前该应用程序在App Store上不可用。因此,我不确定此api如何适用于App Store构建。

问题: 1)对于App Store应用程序,“identifierForVendor”在iOS 7中每次返回相同的值吗?还是当用户在未来删除并重新安装应用程序时,它可能会发生变化? 2)iOS 7 api中是否有其他替代方法可以返回与iOS 6和7的相同值的“唯一标识符”? 3)其他建议......

2个回答

30
正如您在这里的文档中所看到的:

此属性的值对于来自同一供应商并在相同设备上运行的应用程序是相同的。对于来自不同供应商的相同设备上的应用程序以及来自不同设备的应用程序,将返回不同的值。

如果应用程序在后台运行,并且在用户第一次解锁设备之前设备已重新启动,则此属性的值可能为nil。如果该值为nil,请稍后再获取该值。

当iOS设备上安装了应用程序(或来自同一供应商的其他应用程序)时,此属性中的值保持不变。当用户从设备中删除该供应商的所有应用程序,然后重新安装一个或多个应用程序时,该值会更改。因此,如果您的应用程序在任何地方都存储了此属性的值,应优雅地处理标识符更改的情况。

简而言之,只要有至少一个该供应商的应用程序保留在设备上,特定供应商的标识符就会保持不变。但一旦没有应用程序剩余(或在单个应用程序的情况下进行重新安装),标识符便会改变。就我所知,在iOS 6与iOS 7上没有区别,因此您看到的任何差异都是巧合。

5

3) 其他建议...

您应该考虑采用识别和授权用户的策略,而不是设备。依赖于特定设备标识符会导致授权用户无法在没有管理员干预的情况下更换设备,并且如果非授权用户偶然发现/盗窃/借用了一个授权设备,则可以访问该设备。通过依赖用户凭据而不是设备标识符,可以避免这些问题。


43
他可能应该这样做,但这并不是对实际问题的答案,只是一次讲解... - Chad Robinson
@ChadRobinson OP询问“有其他建议吗?”,正如你从引语中看到的那样,这是我回答的部分。 - Caleb
2
好的,但我认为你的答案不应该被标记为正确的。 - arniotaki
这有点失去了整个重点,不是吗? - user435779
一个有效的使用案例是当您已经对用户进行了身份验证,并且您想要区分使用的是用户的哪个设备。您不关心设备的任何细节,只想唯一地标识设备。 - user435779
@user435779 不,这一点都没有错过重点。如果你只想区分一个用户拥有的多个设备,只需自己生成UUID并使用它即可。或者,如果你的应用程序依赖于服务器,服务器可以分配标识符。或者,你可以要求用户为每个设备命名。有很多可能性,所有这些都属于其他建议,因为苹果几年前决定提高用户安全性,尽管这给应用程序开发人员带来了不便,但移除了对设备ID的访问权限。 - Caleb

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