23

我们的 iOS 应用程序适用于特定用户。因此,我们使用设备唯一标识符进行用户识别。这种方法在 iOS 6 之前都可以正常工作,因为我们每次都得到相同的值。

NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

在 iOS 7 中,上述方法正在重新调整不同的值,我们在用户识别方面遇到了问题。iOS 7 apis 提供以下替代。

NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor];
[strApplicationUUID setString:[oNSUUID UUIDString]];

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

目前应用程序在 App Store 上不可用。所以我不确定这个 api 如何用于 App Store 构建。

问题:1)对于appstore应用程序,“identifierForVendor”是否每次都为iOS 7返回相同的值?或者当用户将来删除并重新安装应用程序时它可能会改变?2)iOS 7 api中的“唯一标识符”是否有任何其他替代方法,它们为iOS 6和7返回相同的值?3) 任何其他建议...

4

2 回答 2

30

正如您在此处的文档中看到的:

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

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

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

简而言之,如果该供应商的至少一个应用程序保留在设备上,则特定供应商的标识符将保持不变。一旦没有更多的应用程序(或者在单个应用程序的情况下,它被重新安装),标识符可以并且将会改变。据我所知,iOS 6 和 iOS 7 应该没有区别,所以你看到的任何区别都是巧合。

于 2013-09-25T19:14:20.247 回答
5

3) 任何其他建议...

您应该考虑识别和授权用户而不是设备的策略。根据特定于设备的标识符可防止授权用户在没有某种管理员交互的情况下切换设备,并允许非授权用户在碰巧找到/窃取/借用授权设备时访问。您可以通过依赖用户凭据而不是设备标识符来避免这些问题。

于 2013-09-25T19:23:43.430 回答