iPhone / iPad的唯一标识符BESIDES UUID / UDID?

我所在的项目正在从iPhone或iPad请求两个(甚至三个)唯一标识符。 我知道,我知道… UDID应该足够了,但我们正试图查看是否还有其他可以使用的唯一标识符。

我可以使用IOKit.framework从手机上获取IMEI,序列号,MAC地址等,但显然苹果不赞成使用此框架的任何应用程序。

有没有人有任何其他的想法,或我缺less可以使用的标识符?

谢谢!

这个问题是旧的,但是现在已经添加了一个新的独特的,基于供应商的标识符来replaceiOS 6中的弃用UUID。

现在应该使用[UIDevice identifierForVendor]而不是[UIDevice uniqueIdentifier] ,现在在iOS 5.0

用法示例:

 NSUUID *uuid = [[UIDevice currentDevice] identifierForVendor]; NSString *uuidString = [uuid UUIDString]; 

你可以得到ICCID和IMSI(如果存在的话)。

 NSString *commcenter = @"/private/var/wireless/Library/Preferences/com.apple.commcenter.plist"; NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:commcenter]; NSString *ICCID = [dict valueForKey:@"ICCID"]; NSString *IMSI = [dict valueForKey:@"IMSI"]; 

我认为这是你会得到的。 我不知道获得通用ID的其他选项。

UPDATE 2013-03-13:自从我近两年前写这个答案以来,这可能已经改变了。 我甚至不记得目前iOS版本是什么。 也正如@joshis在评论中正确指出的那样:“你不能合法地这样做,因为你的应用程序会从应用程序沙箱外部读取东西,因此它将被拒绝,正如AppStore Review Guidelines中所指定的…”。

获取UDID的方法已经被弃用了,现在你应该使用CFUUIDCreate ,我想如果需要的话可以多次使用它来获得更多的标识符

也许你应该澄清你的问题。

从iPhone或iPad请求两个(甚至三个)唯一的标识符

…是矛盾的。 如果您的目的是跟踪特定的物理设备,那么根据定义,一个唯一的标识符就足够了。 这是什么独特的手段。

也许,你真正想要的是跟踪每个用户使用你的应用程序的多个事情,而不是设备。 说你的networking游戏应用程序允许用户1个,2个或3个不同的个性。 当用户创build一个独特的个性时,您必须跟踪其他所有用户的个性中的每个用户的个性。

为了这种目的,生成并存储一个UUID *是一个适当而常见的解决scheme。 iOS包括用来生成UUID值的库。 唯一的问题是,如果用户删除并重新安装应用程序,该UUID的存储可能会丢失。 针对这一挑战有一些解决方法,您可以通过search关于用生成的UUID值replaceUDID跟踪的讨论来了解这个问题。


这个问题有点老。 所以我应该提到:在iOS 5中,Apple 不赞成使用UDID。 截至2013年5月1日苹果拒绝任何访问UDID的应用程序。


(*)不要将UUID与UDID混淆。 UUID是一个标准的 128位(32位hex数字)编号,在许多技术场景中经常用作一个真正唯一的标识符。 UDID是Apple的每个iOS设备中的40位hex数字string,用于唯一标识每个设备。

从苹果:

此应用程序(或来自同一供应商的另一个应用程序)安装在iOS设备上时,此属性中的值保持不变。 当用户从设备上删除所有供应商的应用程序并随后重新安装其中的一个或多个应用程序时,值会更改

因此,如果您使用[UIDevice identifierForVendor]并且用户删除应用程序并重新安装,则ID将会不同(因此没有真正的物理设备跟踪)

你为什么不使用SecureUDID

 NSString *domain = @"com.example.app"; NSString *key = @"mykey"; NSString *udid = [SecureUDID UDIDForDomain:domain usingKey:key]; 

这样,即使用户删除了应用程序并重新安装,UDID也是一样的。 这会给你一致的跟踪(或任何你想要做的UDID)。 顺便说一句,上述仍然是从苹果允许的。 玩的开心。

iOS 11中的DeviceCheck API是获得唯一标识符的一个有趣的解决scheme,它的优点是 – 即使在卸载应用程序之后,该值仍将保留。 所以开发人员可以有效地控制试用安装和奖励等用例。