对于一个内部应用,我们使用以下代码UIDevice+serialNumber获取设备序列号。 然而,似乎在iOS 8中,注册表键“IOPlatformSerialNumber”为空。 是否还有其他方法可以获取序列号?
对于一个内部应用,我们使用以下代码UIDevice+serialNumber获取设备序列号。 然而,似乎在iOS 8中,注册表键“IOPlatformSerialNumber”为空。 是否还有其他方法可以获取序列号?
答案:不可以。
目前有一些滥用.mobileconfig文件的浮动解决方案,但由于它们的性质,它们会带来其他问题。
UUID被删除是有原因的。请参考2011年美国参议院关于隐私问题和苹果公司的召唤,了解为什么必须进行更改。 http://arstechnica.com/apple/2011/04/apple-google-asked-to-join-judiciary-hearing-on-mobile-device-privacy/
滥用底层端口以获取设备序列号作为UUID的替代方案并不是解决方法。同样的,滥用移动配置文件也不是长久之计。
您有很多合理的方式来处理以前使用设备标识的任何情况。特别是在企业环境中,在那里您拥有加密和MDM,跟踪设备没有任何意义。
在iOS中,直接获取设备序列号已不再可能。
然而,如果只是为了内部企业应用,我所在的公司将要实现以下方案:
在设备配置期间,复制序列号并将设备名称设置为序列号。
然后使用苹果的UIDevice API来检索设备名称。
identifierForVendor
或advertisingIdentifier
。请查看UDID Replacement APIs。+ (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来实现此目的。不知道它是否仍然有效。
[[NSUUID UUID] UUIDString]
。此外,使用@autoreleasepool
和synchronize
没有任何意义。将[NSUserDefaults standardUserDefaults]
和[[NSBundle mainBundle] bundleIdentifier]
分解为变量将简化代码并减少打字错误的可能性。为了代码安全起见,最好始终在所有if
语句中使用大括号"{}
"。 - zaph