获取iOS 8设备的序列号

获取iOS 8设备的序列号

问题描述:

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

+0

你的意思是,你想要设备ID/UDID。?对。? – 2014-09-19 04:33:31

+0

您可以创建一个唯一的随机ID来标识设备,除非您重置设备,否则它不会更改。如果你想实现这个我可以提供代码。 – souvickcse 2014-09-19 06:33:10

+4

我想要实际的序列号。这不适用于应用商店应用,它适用于内部应用。我们需要串行代码而不是UUID,因为这是通过移动设备管理与用于管理应用程序的序列代码链接的。 – quentinadam 2014-09-19 08:21:29

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

+1

问题在于如何以编程方式获取此内容,而不是通过设置。 – 2014-09-19 05:53:29

答:不可以

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

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

滥用底层行军端口获取设备序列号作为UUID的替代不是解决方案。现在滥用移动配置,并猜测将工作多久。

您有很多体面的方式来处理您以前使用设备标识的任何情况。特别是在拥有加密技术和MDM的企业环境中,绝对没有必要跟踪这样的设备。

+0

这是一个资讯性评论,但不是答案。 – zaph 2015-10-02 12:47:56

+0

明白了。让我用一个具体的答案来更新它。 – 2015-10-02 13:21:09

+0

@HelgeBecker我想知道,如果我的应用使用.mobileconfig解决方案,它会被应用商店接受吗?您是否尝试使用.mobileconfig发布应用程序以获取UDID? – Moucheg 2015-12-02 10:58:36

正如Helger所述,由于安全/隐私的原因,UDID在iOS 6+中不再可用。相反,使用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。不知道它是否仍然有效。

+0

我知道UUID,谢谢。但是,我的问题是关于如何获取序列号(不是UDID或UUID)。我会很好的使用私有API的解决方案,因为这个应用程序是通过企业许可证分发的。 – quentinadam 2015-10-02 11:06:08

+0

从iOS 8开始,IOPlatformSerialNumber属性被删除,现在检索其值的调用返回nil。对不起,如果我误解了。 – iAhmed 2015-10-02 12:01:49

+0

在ObjC中获取uuid最简单的方法是:'[[NSUUID UUID] UUIDString]'。也没有使用'@ autoreleasepool'和'synchronize'的目的。分解变量'[NSUserDefaults standardUserDefaults]'和[[NSBundle mainBundle] bundleIdentifier]'可以简化代码并减少拼写错误的可能性。对于代码安全性来说,最好的做法是总是使用大括号“'{}'”和所有'if'语句。 – zaph 2015-10-02 13:42:43

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

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

在设备配置,复制序列号和设置设备名称为序列号。

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