获取iOS 8设备的序列号

9

对于一个内部应用,我们使用以下代码UIDevice+serialNumber获取设备序列号。 然而,似乎在iOS 8中,注册表键“IOPlatformSerialNumber”为空。 是否还有其他方法可以获取序列号?


你的意思是,你想要设备ID/UDID吗?对吗? - Er.Shreyansh Shah
您可以创建一个唯一的随机ID来识别设备,除非您重置设备,否则它不会更改。如果您想要实现这个功能,我可以提供代码。 - souvickcse
4
我需要实际的序列号。这不是用于应用商店应用程序,而是用于公司内部应用程序。我们需要序列码而不是UUID,因为这是用于通过移动设备管理管理应用程序所使用的序列码的关联。 - quentinadam
@ goldmine,你搞定了吗? - kgu87
2
不幸的是,我不得不改变应用程序的工作方式,不再依赖于序列号。 - quentinadam
自iOS8起,苹果已删除了对序列号的访问权限。您可以使用供应商标识号作为替代解决方案。 - A Salcedo
4个回答

2

答案:不可以。

目前有一些滥用.mobileconfig文件的浮动解决方案,但由于它们的性质,它们会带来其他问题。

UUID被删除是有原因的。请参考2011年美国参议院关于隐私问题和苹果公司的召唤,了解为什么必须进行更改。 http://arstechnica.com/apple/2011/04/apple-google-asked-to-join-judiciary-hearing-on-mobile-device-privacy/

滥用底层端口以获取设备序列号作为UUID的替代方案并不是解决方法。同样的,滥用移动配置文件也不是长久之计。

您有很多合理的方式来处理以前使用设备标识的任何情况。特别是在企业环境中,在那里您拥有加密和MDM,跟踪设备没有任何意义。


@HelgeBecker 我在想,如果我的应用程序使用.mobileconfig解决方案,它是否会被App Store接受?您是否尝试过使用.mobileconfig发布应用程序以获取UDID? - Moumou
不同的解决方案用于在App Store识别设备或具体的Apple ID。在我们的内部应用程序中,我们目前使用供应商设备标识符来监测所有应用程序的健康状况。这提供了足够的信息,以查看问题是否与一个或多个用户有关,而无需具体识别他们。但这也是可能的。 - Helge Becker

1

在iOS中,直接获取设备序列号已不再可能。

然而,如果只是为了内部企业应用,我所在的公司将要实现以下方案:

在设备配置期间,复制序列号并将设备名称设置为序列号。

然后使用苹果的UIDevice API来检索设备名称。


0
如Helger所述,由于安全/隐私原因,在iOS 6+中不再提供UDID。相反,请使用identifierForVendoradvertisingIdentifier。请查看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可以解决问题,我也可以接受,因为这个应用是通过企业许可证分发的。 - quentinadam
从iOS 8开始,IOPlatformSerialNumber属性已被移除,调用以检索其值的操作现在返回nil。如果我有误解,很抱歉。 - iAhmed
在ObjC中获取uuid的最简单方法是:[[NSUUID UUID] UUIDString]。此外,使用@autoreleasepoolsynchronize没有任何意义。将[NSUserDefaults standardUserDefaults][[NSBundle mainBundle] bundleIdentifier]分解为变量将简化代码并减少打字错误的可能性。为了代码安全起见,最好始终在所有if语句中使用大括号"{}"。 - zaph

-10
苹果设备的序列号可以在 设置 -> 通用 -> 关于本机 -> 序列号 下找到。

1
问题是如何通过编程获取,而不是通过设置获取。 - Johan Karlsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接