【问题标题】:iPhone/iPad unique identifier BESIDES UUID/UDID?除了 UUID/UDID 之外的 iPhone/iPad 唯一标识符?
【发布时间】:2011-08-01 18:01:50
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 你总是可以用某种神秘的方式散列 UUID 以获得另外两个 ID :)
  • @Nick:我认为 OP 不想以任何方式使用 UDID,因为它很容易伪造,例如在越狱设备上从 Cydia 下载 UDIDFaker。
  • 苹果对 IMEI 不满意?这不好,因为它限制了太多该值的好处。
  • ...因为不是每个 iOS 设备都有 IMEI。
  • 如果你想要一个唯一的 id,让用户创建一个。

标签: ios iphone objective-c ipad udid


【解决方案1】:

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

【讨论】:

  • “合法”到底是什么意思?应用程序会因为捕获这些而被拒绝吗?
  • 不,您不能合法地这样做,因为您的应用程序会从应用程序沙箱外部读取内容,因此,它将被拒绝,如 AppStore 审查指南 2.6 中所述:读取或写入数据的应用程序超出其指定容器区域的将被拒绝
  • 我无法打开这样的目录:/private/var/wireless/Library/Preferences/com.apple.commcenter.plist 中的“无线”。我正在尝试在非越狱设备上执行此操作
  • 自从我差不多两年前写这个答案以来,这可能已经改变了。我什至不记得当时的 iOS 版本是什么。
  • 我需要 ICCID 用于企业分发应用程序。当我尝试上面的代码时,ICCID 为空。知道如何在 iOS 6 上实际获取它吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

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


    这个问题有点老了。所以我要提一下:在 iOS 5 中,Apple deprecated 使用了 UDID。截至 2013 年 5 月 1 日,Apple 是 rejecting 任何访问 UDID 的应用程序。


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

    【讨论】:

      【解决方案4】:

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

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

      示例用法:

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

      【讨论】:

        【解决方案5】:

        来自苹果:

        此属性中的值在应用程序(或其他 来自同一供应商的应用程序)安装在 iOS 设备上。价值 当用户从 设备,然后重新安装其中的一个或多个。

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

        为什么不使用SecureUDID

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-15
            • 2014-09-11
            • 1970-01-01
            • 1970-01-01
            • 2010-09-18
            • 1970-01-01
            • 2012-10-08
            • 1970-01-01
            相关资源
            最近更新 更多