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


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

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

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

谢谢!


12709
2018-04-08 18:44


起源

你总是可以用一些神秘的方式对UUID进行哈希处理以获得两个以上的ID :) - Nick Weaver
@Nick:我认为OP不想以任何方式使用UDID,因为它很容易伪造,例如从越狱设备上下载Cydia的UDIDFaker。 - Richard J. Ross III
苹果对IMEI皱眉?这并不好,因为它限制了这个价值的好处。 - KevinDTimm
...因为不是每个iOS设备都有IMEI。 - Nicholas Riley
如果您想要一个唯一的ID,请让用户创建一个。 - Black Frog


答案:


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

[UIDevice identifierForVendor] 现在应该用来代替 [UIDevice uniqueIdentifier] 自iOS 5.0起,现已弃用

用法示例:

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

8
2017-08-19 00:19





您可以获得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 Review Guidelines ...中所指定的那样”。


3
2018-04-08 21:26



“合法”究竟是什么意思?应用程序是否会被拒绝捕获这些? - edcincy
不,您不能合法地执行此操作,因为您的应用程序将从应用程序沙箱外部读取内容,因此,它将被拒绝,如AppStore Review Guidelines,2.6中所指定的:在指定容器区域外读取或写入数据的应用程序将被拒绝 - joshis
我无法在/private/var/wireless/Library/Preferences/com.apple.commcenter.plist中打开这样的目录:“wireless”。我试图在非越狱设备上这样做 - Sergio
自从我两年前写这篇答案以来,这可能已经发生了变化。我甚至不记得目前iOS版本是什么。 - ascandroli
我需要ICCID用于企业分发应用程序。当我尝试上面的代码时,我的ICCID为空。知道如何在iOS 6上实际获得它吗? - c1pherB1t


来自Apple:

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

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

你为什么不用 SecureUDID

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

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


2
2018-05-25 07:14





不推荐使用获取UDID的方法,您现在应该使用它 CFUUIDCreate 我认为可以多次使用,以便在需要时获得更多标识符


1
2018-02-01 10:31





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

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

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

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

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


这个问题有点老了。所以我应该提一下:在iOS 5中,Apple 弃用 使用UDID。截至2013-05-01 Apple是 拒绝 任何访问UDID的应用程序。


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


1
2017-08-18 23:47





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


0
2017-08-15 19:34