iOS 7.0及以上版本的iOS设备唯一标识

16

寻求您的帮助

我在获取设备标识符时遇到了问题。实际上,我正在使用UIDevice+IdentifierAddition.h和NSString+MD5Addition.h类来获取标识符,但其对于所有我的设备都返回相同的标识符,即iPhone 4s(iOS 7.1)和 iPhone 5(iOS 7.1.1)。

有没有解决此问题的方法。因为我想要一个与设备特定相关的独特标识符,这是我的应用程序需求。

重要提示:我想将此应用程序提交到应用商店,因此请回答必须符合指南。


你有检查过 UUID 吗?https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSUUID_Class/Reference/Reference.html - Kumar KL
可能是重复问题:https://dev59.com/3mw05IYBdhLWcg3wYw1s#8677177 - Mateusz Szlosek
@KumarKL 感谢您的回复。它返回UUID,这意味着它在每次启动应用程序时都会给出不同的标识符。我需要像UDID这样的东西。它将对每个设备都是唯一的。 - Karamjeet Singh
@MateuszSzlosek 谢谢您的回复。如果您已经查看了您提供给我的链接,那么您会发现Drabuna在评论中指出它每次都会返回新的UUID。但是我需要像UDID这样特定于设备的唯一标识符。 - Karamjeet Singh
1
@karam:有一种解决方案,可以将UUID存储在钥匙串中。您只需要生成一次即可,在下一次启动时从钥匙串中读取该值。 - Mateusz Szlosek
@MateuszSzlosek 谢谢您的回复。我已经实现了它。希望苹果不会有任何问题。 - Karamjeet Singh
6个回答

27

自从iOS 7之后,不再可能获取任何唯一设备标识符。

你的选项是:

  • 创建自己的唯一ID并将其保存在钥匙串中。
  • 使用供应商ID,如果同一供应商的所有应用程序都从设备中移除,则该ID将被重置。

+1 并且为了完整起见,这里是链接,说明唯一设备标识符在 iOS6.1 后停止使用。https://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instp/UIDevice/uniqueIdentifier - HpTerm
@rckoenes 感谢您的回复。我已经实现了它。希望苹果不会有任何问题。 - Karamjeet Singh
@rckoenes-对于第一个选项(创建自己的唯一身份标识并保存在钥匙串中),用户是否可以通过重置设备上的位置和隐私或进行恢复出厂设置来重置此项? - rak appdev
@rakappdev 是的,用户可以重置它。但是,如果用户将其钥匙串保存在云中,则应该将您的值保存在那里。另一个选项是将密钥保存在用户的iCloud驱动器上。但是,没有办法将其限制为物理设备,也不应该这样做。 - rckoenes

15
现在在iOS 11.0+中,苹果引入了一个名为DeviceCheck API的新API,开发者可以使用它来唯一标识设备。
文档中所述:
使用DeviceCheck API与服务器对接的API相结合,您可以为每个设备设置和查询两位数据,同时保护用户隐私。您可以使用此数据来识别已经利用您提供的促销优惠的设备,或者标记被您确定为欺诈性的设备。DeviceCheck API还允许您验证您收到的令牌来自包含您的应用程序的真实Apple设备。
另外,请查看以下WWDC17视频(从第24分钟开始):https://developer.apple.com/videos/play/wwdc2017/702/
编辑: 可在此处找到有关此Device Check主题的详细教程:here

1
这个功能与唯一标识符(Unique identifier)有些不同,因为您不能将其存储在服务器上。但它确实允许您的应用程序在Apple的服务器上存储2位数据,并能在应用程序中检索。 - rckoenes
WWDC17的视频似乎已经不再可用。 - Simon Pickup

8

在Objective-C中

NSString *uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

在Swift中

 var uniqueId=UIDevice.currentDevice().identifierForVendor.UUIDString as String
 println("Your device identifires =>\(uniqueId)")

1
每次应用程序重新安装时,这将会改变。它不是真正的UDID。 - Nathan F.
@NathanFiscaletti 你是在模拟器上测试吗?建议在真实设备上进行测试。 - Avijit Nagare
不,我正在真实设备上进行测试。identifierForVendor的工作方式是,一旦来自供应商的所有应用都被删除,identifierForVendor就会重置为新的标识符。它只用于在特定供应商的应用程序之间共享值。 - Nathan F.
2
@NathanFiscaletti 谢谢。identifierForVendor对于来自同一供应商且在同一设备上运行的应用程序是相同的。对于来自不同供应商的同一设备上的应用程序以及不考虑供应商的不同设备上的应用程序,返回不同的值。因此,建议使用NSUUID生成自定义UUID并将其存储在钥匙串中(因为如果应用程序被删除并重新安装,则钥匙串不会被删除)。 - Avijit Nagare

5
很遗憾,当您卸载应用程序时,identifierForVendor 会发生变化,为确保它不会改变,请将其保存在钥匙串中。
我使用了pod 'SSKeychain',主页:https://github.com/soffes/sskeychain 以下是代码:
 + (NSString *)getDeviceId {
           NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
           NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"MY_KEY"];
           if (strApplicationUUID == nil) {
               strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
               [SSKeychain setPassword:strApplicationUUID forService:appName account:@"MY_KEY"];
            }
    return strApplicationUUID;
}

0
如果您只想识别设备一次,例如估计唯一用户的数量,则建议使用ASIdentifierManager的“advertisingIdentifier”。 苹果文档

0

[UIDevice uniqueIdentifier]; 在iOS 5及以上版本中已被弃用。

您可以使用以下代码获取供应商标识符: NSString *udid = [[UIDevice currentDevice] uniqueIdentifier]; 并将其存储在钥匙串中以便以后使用。

此外,您还可以检查以下两种方式: 1)NSUUID 2)CFUUID

您可以在iOS中的唯一设备标识中获取详细描述。


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