总是在iOS 7中获得唯一的设备ID

我们的iOS应用程序是为特定的用户。 所以,我们使用设备唯一标识符来识别用户。 这种方法直到iOS 6都能正常工作,因为我们每次都获得相同的值

NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier]; 

在iOS 7中,上述方法正在返回不同的值,并且在用户识别中遇到问题。 iOS 7提供以下备用

 NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor]; [strApplicationUUID setString:[oNSUUID UUIDString]]; 

我们用identifierForVendorreplace了uniqueIdentifier ,并创build了一个Ad-hoc构build。 然后,我们在iOS 7和iOS 6设备上安装了这个版本。 到目前为止,在iOS 7中,我们每次都获得相同的值 ,但是iOS 6每次删除并重新安装应用程序时都会给出不同的值

使用这个小帮手方法来保持在应用的安装/删除会话之间的钥匙串中的标识符

 -(NSString *)getUniqueDeviceIdentifierAsString { NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]; NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"]; if (strApplicationUUID == nil) { strApplicationUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"]; } return strApplicationUUID; } 

将SSKeychain库添加到您的项目中,例如通过带有pod 'SSKeychain'

什么是UDID取代?

现在看来,苹果计划用两种不同的标识符replaceUDID:供应商ID和广告ID。

供应商ID

来自同一开发人员的应用程序之间的ID相同。 删除该团队ID的最后一个应用。

广告ID

设备的独特之处 适用于所有应用程序; 用于广告 – iAd从iOS 6及更高版本的UDID转换而来。 使用“清除所有内容和设置”重置。

在大多数情况下,供应商ID将允许具有多个应用程序的开发人员在所有应用程序中将您识别为同一用户。 这可以帮助开发人员更好地了解他们的受众并提供更好的服务。

广告ID仍会为设备创build一个唯一的标识符,但与UDID不同的是,可以closures或重置该设备,就像可以在台式机或笔记本电脑上的浏览器中控制Cookie一样。

随着本周早些时候iOS7的宣布,苹果公司又采取了另一个步骤,closures另一个唯一的标识符 – 应用程序开发商和广告公司可以使用的“MAC地址”,而不是新的广告ID。 通过消除这个漏洞,苹果正在采取强制措施,迫使这些公司只使用用户可以控制的跨应用标识符。

还有待观察的是,目标公司是否会继续寻求解决苹果的任务。 其他技术,如“设备指纹识别”,已经被开发出来,可以在苹果的框架之外唯一识别您的设备。 苹果是否会打击这些方法还有待观察。

identifierForVendor的UIDevice类引用 :

当用户从设备上删除所有供应商的应用程序并随后重新安装其中的一个或多个应用程序时,值会更改。 当使用Xcode安装testing版本或者在使用ad-hoc分发的设备上安装应用程序时,该值也可以。 因此,如果您的应用程序在任何位置存储此属性的值,则应优雅地处理标识符更改的情况。

iOS7设备上是否安装了同一供应商的其他应用程序? 根据文件 :

此应用程序(或来自同一供应商的另一个应用程序)安装在iOS设备上时,此属性中的值保持不变。 当用户从设备上删除所有供应商的应用程序并随后重新安装其中的一个或多个应用程序时,值会更改。 当使用Xcode安装testing版本或者在使用ad-hoc分发的设备上安装应用程序时,该值也可以。 因此,如果您的应用程序在任何位置存储此属性的值,则应优雅地处理标识符更改的情况。

你通过AppStore提供的应用程序? 如果不:

如果应用程序未从应用程序商店安装(例如应用程序仍在开发中),则根据应用程序的捆绑ID确定供应商。 假设包ID是反向DNS格式,前两个组件用于生成供应商ID。 例如,com.example.app1和com.example.app2似乎具有相同的供应商ID。

如果设备上没有其他已安装的应用程序,则供应商的标识符可以更改。 此外,如果您通过不同的分发方法安装应用程序,供应商的标识符可能会更改。 当通过XCode安装并通过TestFlight或HockeyApp分发时,应用程序可能没有相同的标识符。

尝试清除您的机器上的应用程序的caching,然后检查。 这可能是你的caching问题

为了给nerowolfe的答案添加一些东西,有一个很好的钥匙串包装器名为MCSMKeychainItem ,除了其他一些东西之外,还允许您用单行代码生成和检索唯一的设备ID:

 [MCSMApplicationUUIDKeychainItem applicationUUID]; 

所以基本的用法会是这样的

 + (NSString *)deviceId { // load unique device ID or generate new one return [MCSMApplicationUUIDKeychainItem applicationUUID]; } 

它在钥匙串的基础上工作,在那里存储一次生成的唯一标识符(如nerowolfbuild议)。 它是开源的,你可以在这里下载它在Github上 。

注:我不是延期的作者,也不以任何方式了解他/她。