【问题标题】:Unique identifier for an iPhone appiPhone 应用程序的唯一标识符
【发布时间】:2010-09-18 15:51:57
【问题描述】:

对于将图像提交到服务器的 iPhone 应用,我需要以某种方式将来自特定手机的所有图像绑定在一起。每次提交时,我都想发送一些唯一的电话号码。看过了

[[UIDevice mainDevice] 唯一标识符]
和 [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]

但在模拟器中出现错误。

有苹果认可的方法吗?

【问题讨论】:

  • 可以访问序列号吗?
  • 使用
    [[UIDevice mainDevice] uniqueIdentifier]
    时出现错误,但
     [[UIDevice currentDevice] uniqueIdentifier]
    似乎有效。
  • 请参阅 stackoverflow.com/questions/193182/… 了解获取 SBFormattedPhoneNumber 不再有效的原因。

标签: iphone ios-simulator


【解决方案1】:

您遇到了什么错误? [[UIDevice currentDevice] uniqueIdentifier]已编辑以修复 API,感谢 Martin!)是官方推荐的这样做方式。

【讨论】:

  • *** +[UIDevice mainDevice]: unrecognized: 但是尝试了 [UIDevice currentDevice] 并且它在 sim 中工作
  • [[UIDevice currentDevice] uniqueIdentifier] 从 iOS 5.0 开始已被弃用 - 不要使用它。我读到这个 ​​GitHub 存储库正在生成一个带有开源库的唯一 ID:github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5
【解决方案2】:

您还可以使用 CFUUID 生成 UUID。这是一些代码:

NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
  uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
  [uuid autorelease];
  CFRelease(theUUID);
}

【讨论】:

  • 不,每次都不一样,所以通常你会在第一次启动时生成它,然后使用 NSUserDefaults 将它保存到你的偏好中。
  • 这样做的缺点是,如果应用程序被删除并重新安装,或者设备从备份中恢复,您将丢失保存的 UUID,并且无法识别来自同一设备的内容。
  • 我必须将 UUID 键入为 CFUUIDRef,而不是 CFUUID。并且不要忘记将 CoreFoundation 添加到您的项目中,并导入
【解决方案3】:

到目前为止,获取唯一标识符最简单、最合适的方法是使用 Apple 明确提供的获取唯一标识符的机制 - [[UIDevice currentDevice] uniqueIdentifier]。您不能保证电话号码对于设备是唯一的,或者设备甚至会有电话号码。除此之外,这样做是一个可怕的想法,因为它肯定是对用户隐私的侵犯。如果您打算以任何方式存储它,即使是 uniqueidentifier 也应该进行哈希处理。

【讨论】:

  • +1 用于提出隐私问题。很多人只是忽略了这方面。
  • 正如在其他答案中指出的那样,从 iOS 5.0 开始,这已被弃用
【解决方案4】:

为了在安装之间保留您创建的唯一标识符,您可以使用钥匙串Made easy with SSKeychain:只需按如下方式设置您的 UUID:

        [SSKeychain setPassword:@"Your UUID" forService:@"com.yourapp.yourcompany" account:@"user"];

然后在需要时再次调用它:

NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"];

注意:服务和帐户必须完全匹配

然后,如果应用程序被删除并重新安装,UUID 将与重新安装保持一致。

如果您想跨设备共享此 UUID,请将您的应用设置为使用 iCloud。然后,您可以将 UUID 存储在 NSUserDefaults 中,与 KeyValueStore 同步,然后使用上面的代码在新设备钥匙串中设置 UUID。

如果我为以上所有内容输入代码,这个答案会变得非常长,但这里有大量示例代码可以解决所有问题。

【讨论】:

    【解决方案5】:

    不要忘记在 iOS 5 中 uniqueIdentifier 将被弃用,您应该使用 CFUUID 而不是那个

    【讨论】:

      【解决方案6】:

      有趣的是,Apple 已经在 iOS 5 中弃用了 uniqueIdentifier(如 gN0Me 所述)。这是相关的 TechCrunch 文章: http://techcrunch.com/2011/08/19/apple-ios-5-phasing-out-udid/

      Apple 建议您不再唯一标识设备,而是标识用户。在大多数情况下,这是一个很好的建议,尽管在某些情况下仍需要全局唯一的设备 ID。这些场景在广告中很常见。因此,我编写了一个非常简单的插件库,它准确地复制了现有的行为。

      在一个无耻的自我推销中,我将它链接在这里,希望有人觉得它有用。此外,我欢迎所有和任何反馈/批评: http://www.binpress.com/app/myid/591

      尽管如此,在您的特殊情况下,我建议您跳过我的库提供的全局唯一 ID 功能,因为这对您的情况来说有点过头了。相反,我会生成一个简单的 CFUUID 并将其存储在 NSUserDefaults 中。此 ID 将特定于您的应用程序,但允许您在数据库中对“应用程序安装”的所有照片进行分组。

      换句话说,通过弃用 uniqueIdentifier 方法,Apple 建议您不要识别每个设备,而是每个应用程序安装。除非您在特定条件下操作,否则每个应用 ID 可能更适合您的产品。

      【讨论】:

      • 您的解决方案不可用。
      【解决方案7】:

      这是一个有趣的问题,我也在寻求解决。这是我想解决的一个场景。

      当您将手机卖给另一个人时会发生什么...该设备 ID 将属于其他人,因此即使应用程序从 iPhone 中删除,它也可以重新添加,然后所有数据都将被重新关联到新用户...这很糟糕。

      使用带有设备 ID MD5 的电话号码将是一个很好的解决方案。我们想出的另一个方法是拥有一个 SQL Lite DB,其中包含一些使用设备 ID 散列的令牌。然后,当应用程序被删除时,数据库被杀死并且所有数据都被取消关联。我认为这可能太脆弱了。

      还有其他想法吗?

      Rob Ellis(PhoneGap/Nitobi)

      【讨论】:

      • 或者手机出现问题并在保修期内更换 - 同一用户,新手机。存储在 NSUserDefaults 解决方案中生成的 UUID 将在这里获胜,因为首选项已同步回来。
      【解决方案8】:

      【讨论】:

      • 只包含链接的答案是considered bad practice。请在此处总结内容(请勿复制/粘贴),以便答案可以独立存在。如果您不这样做,您的答案将面临被删除的风险,尤其是在链接失效的情况下。
      【解决方案9】:

      还没有完成 iphone 的工作,但是对手机独有的东西进行哈希处理如何...哦,说出电话号码?

      Getting iphone number

      【讨论】:

      • 这通常有效,但在很多情况下会返回不正确的信息。它获取一个电话号码,但不保证是当前电话号码、有效电话号码,甚至是唯一号码。
      • iPod Touch 多久有一次电话号码?
      • 电话号码绝对不是唯一的。这也是很多人都知道的事情,因此对于保护 Web 服务背后的任何类型的数据来说,这是一个糟糕的选择。进一步 - 当您更改电话号码时会发生什么?
      【解决方案10】:

      片段:

      NSString *phoneNumber = (NSString *) [[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"]; // Will return null in simulator!
      NSLog(@"Formatted phone number [%@]", phoneNumber);
      

      我 [最近] 在 OS 2.2.1 [和 OS 3.0] 上按原样运行此代码。

      它在设备上运行时按预期工作,并返回我的电话号码以及完整的国际拨号代码 [在我的情况下为 1]。

      在模拟器上运行时,[returned] 是一个空字符串,所以它只适用于实际的 iPhone 设备。

      我没有在 iPod Touch 上测试它。

      ...

      本周在另一台设备上运行此代码,得到一个空值而不是数字。

      经过进一步研究,此代码片段返回的数字似乎是在 iTunes 中为设备设置的数字。

      如果您在设备激活时没有在 iTunes 中输入 iPhone 的号码,或者可能(在我的情况下)默认值不是 iPhone 的号码并且您仍然单击了“确定”,这样 iTunes 就不会列出插入 iPhone 时的电话号码,此代码将返回一个空字符串。

      [以上是我最近在http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]发布的另一篇关于此主题的文章中编辑的cmets 连接

      【讨论】:

        【解决方案11】:

        Here 是有关从 iTunes 获取它的方法的更多信息,可能对测试有用。

        【讨论】:

          【解决方案12】:

          我用这样的代码成功了:

          - (NSString *)stringUniqueID {
              NSString *  result;
              CFUUIDRef   uuid;
              CFStringRef uuidStr;
              uuid = CFUUIDCreate(NULL);
              assert(uuid != NULL);
              uuidStr = CFUUIDCreateString(NULL, uuid);
              assert(uuidStr != NULL);
              result = [NSString stringWithFormat:@"%@", uuidStr];
              assert(result != nil);
              NSLog(@"UNIQUE ID %@", result);
              CFRelease(uuidStr);
              CFRelease(uuid);
              return result;
          }    
          

          【讨论】:

            【解决方案13】:

            您可以使用 MAC 地址作为唯一 ID。以下链接将为您提供帮助

            How can I programmatically get the MAC address of an iphone

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-14
              • 1970-01-01
              • 2013-07-05
              • 2011-11-13
              • 1970-01-01
              • 2018-05-23
              相关资源
              最近更新 更多