12

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

我可以使用 IOKit.framework 从手机上获取 IMEI、序列号、MAC 地址等,但显然 Apple 不赞成这种做法,任何使用此框架的应用程序都将被拒绝。

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

谢谢!

4

6 回答 6

8

这个问题很老,但是现在添加了一个新的唯一的、基于供应商的标识符来替换 iOS 6 中已弃用的 UUID。

从iOS 5.0 开始,[UIDevice identifierForVendor]现在应该使用,而不是[UIDevice uniqueIdentifier]现在已弃用

示例用法:

NSUUID *uuid = [[UIDevice currentDevice] identifierForVendor];
NSString *uuidString = [uuid UUIDString];
于 2013-08-19T00:19:55.410 回答
3

来自苹果:

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

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

你为什么不使用SecureUDID

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

这样,即使用户删除应用程序并重新安装它,UDID 也将是相同的。这将为您提供一致的跟踪(或您想要对 UDID 执行的任何操作)。顺便说一句,苹果仍然允许上述内容。玩得开心。

于 2014-05-25T07:14:14.603 回答
3

您可以获得 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 的任何其他选择。

更新 2013-03-13:自从我差不多两年前写这个答案以来,这可能已经改变了。我什至不记得当时的iOS版本是什么。同样正如@joshis 在评论中正确指出的那样:“您不能合法地这样做,因为您的应用程序会从应用程序沙箱外部读取内容,因此,它将被拒绝,如 AppStore 审查指南中所述......”。

于 2011-04-08T21:26:29.127 回答
1

获取 UDID 的方法已被弃用,您现在应该使用CFUUIDCreate我认为可以多次使用的方法,以便在需要时获取更多标识符

于 2012-02-01T10:31:17.843 回答
1

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

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

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

也许,您真正想要的是跟踪每个用户对您的应用程序的使用的多项内容,而不是设备。假设您的联网游戏应用程序允许用户 1、2 或 3 种不同的个性。当他们的用户创建一个独特的个性时,您必须在所有其他用户的个性中跟踪该用户的每个个性。

出于这种目的,生成和存储UUID*是一种适当且常见的解决方案。iOS 包含用于生成 UUID 值的库。唯一的问题是,如果用户删除并重新安装应用程序,该 UUID 的存储可能会丢失。这个挑战有一些解决方法,你可以通过谷歌搜索来了解用生成的 UUID 值替换 UDID 跟踪的讨论。


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


(*) 不要将 UUID 与 UDID 混淆。UUID 是一个标准的128 位(32 位十六进制数字)数字,通常在许多技术场景中用作几乎唯一的标识符。UDID 是 Apple 的 40 位十六进制数字字符串,烧录到每台 iOS 设备中,以唯一标识每台设备。

于 2013-08-18T23:47:58.763 回答
1

iOS 11 中的 DeviceCheck API 是一个有趣的获取唯一标识符的解决方案,它的优点是 - 即使在卸载应用程序后,该值也会保留。因此,开发人员可以有效地控制试用安装和奖励等用例。

于 2017-08-15T19:34:33.933 回答