【问题标题】:Get serial number of device on iOS 8在 iOS 8 上获取设备的序列号
【发布时间】:2014-09-19 04:12:45
【问题描述】:

对于内部应用程序,我们使用以下代码 UIDevice+serialNumber 来获取设备序列号。 但是,似乎在 iOS 8 中,注册表项“IOPlatformSerialNumber”为空。 可以通过其他方式获取序列号吗?

【问题讨论】:

  • 您的意思是,您想要设备 ID/UDID。?对吧。?
  • 您可以创建一个唯一的随机 id 来识别设备,除非您重置设备,否则它不会改变。如果你想实现这个,我可以提供代码。
  • 我想要实际的序列号。这不是针对应用商店应用程序,而是针对内部应用程序。我们需要序列号而不是 UUID,因为这是通过移动设备管理与用于管理应用程序的序列号链接回。
  • @goldmine 你让它工作了吗?
  • 很遗憾没有。我不得不改变应用程序的工作方式,不再依赖序列号。

标签: ios iphone ios8 iokit


【解决方案1】:

答案:没有。

目前有围绕滥用 .mobileconfig 的浮动解决方案,但由于其性质,它们会增加其他问题。

UUID 被删除是有原因的。请参阅 2011 年有关隐私和美国参议院召集 Apple 的新闻,以了解为什么必须改变这一点。 http://arstechnica.com/apple/2011/04/apple-google-asked-to-join-judiciary-hearing-on-mobile-device-privacy/

滥用底层 March 端口获取设备序列号作为 UUID 的替换不是解决方案。现在同样滥用移动配置并猜测它会工作多长时间。

您有很多不错的方法来处理您之前使用设备识别的任何情况。尤其是在企业环境中,您拥有加密技术和 MDM 绝对没有必要跟踪这样的设备。

【讨论】:

  • @HelgeBecker 我想知道,如果我的应用使用 .mobileconfig 解决方案,它会被应用商店接受吗?您是否尝试过使用 .mobileconfig 发布应用以获取 UDID ?
  • 没有。我们为 App-Store 使用不同的解决方案来识别设备或具体的苹果 ID。在我们的内部应用程序中,我们目前确实使用供应商的设备标识符来监控所有应用程序的健康状况。有足够的信息来查看问题是否与一个或多个用户相关,而无需具体识别它们。但这也是可能的。
【解决方案2】:

在 iOS 中不再可以直接检索设备序列号。

但是,如果它只是用于内部企业应用程序,我工作的公司将要实施的是:

在设备配置过程中,复制序列号并将设备名称设置为序列号。

然后使用 Apple 的 UIDevice API 检索设备名称。

【讨论】:

    【解决方案3】:

    如上所述,由于安全/隐私原因,UDID 在 iOS 6+ 中不再可用。相反,请使用 identifierForVendor 或 advertisingIdentifier 请查看UDID Replacement APIs

    适用于 iOS 8+

    + (NSString *)deviceUUID
    {
    if([[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]])
        return [[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]];
    
    @autoreleasepool {
    
        CFUUIDRef uuidReference = CFUUIDCreate(nil);
        CFStringRef stringReference = CFUUIDCreateString(nil, uuidReference);
        NSString *uuidString = (__bridge NSString *)(stringReference);
        [[NSUserDefaults standardUserDefaults] setObject:uuidString forKey:[[NSBundle mainBundle] bundleIdentifier]];
        [[NSUserDefaults standardUserDefaults] synchronize];
        CFRelease(uuidReference);
        CFRelease(stringReference);
        return uuidString;
     }
    }
    

    您可以使用identifierForVendor,然后将它们存储到钥匙串并稍后使用。因为重新安装应用时钥匙串的值不会改变。

    我曾经为此使用Open UDID。不知道还能不能用。

    【讨论】:

    • 我知道 UUID,谢谢。但是,我的问题是关于如何获取序列号(不是 UDID 或 UUID)。使用私有 API 的解决方案我会很好,因为这个应用程序是通过企业许可证分发的。
    • 从 iOS 8 开始,IOPlatformSerialNumber 属性已被移除,检索其值的调用现在返回 nil。对不起,如果我误解了。
    • 在 ObjC 中获取 uuid 的最简单方法是:[[NSUUID UUID] UUIDString]。使用@autoreleasepool 和synchronize 也没有任何意义。分解成变量[NSUserDefaults standardUserDefaults] 和[[NSBundle mainBundle] bundleIdentifier] 将简化代码并减少拼写错误的可能性。为了代码安全,最佳实践是在所有 if 语句中始终使用大括号“{}”。
    【解决方案4】:

    Apple 设备的序列号可在设置 -> 常规 -> 关于 -> 序列号下找到。

    【讨论】:

    • 问题是关于如何以编程方式而不是通过设置来获取它。
    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2020-10-22
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    相关资源
    最近更新 更多