我们的iOS应用程序适用于特定用户。因此,我们使用设备唯一标识符进行用户识别。这种方法适用于iOS 6,因为我们每次都获得相同的值。
NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];
在iOS 7中,上述方法返回不同的值,我们在用户识别方面遇到问题。 iOS 7提供以下备用。
NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor];
[strApplicationUUID setString:[oNSUUID UUIDString]];
我们将uniqueIdentifier
替换为identifierForVendor
,并创建了一个Ad-hoc版本。然后,我们在iOS 7和iOS 6设备上安装了构建版本。到目前为止,在iOS 7中,我们每次都获得相同的值,但每次删除并重新安装应用时,iOS 6都会提供不同的值。
答案 0 :(得分:31)
使用这个小助手方法将密钥链中的标识符保存在app的安装/删除会话
之间-(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库添加到您的项目中,例如通过Cocoapods与pod 'SSKeychain'
答案 1 :(得分:8)
什么是UDID替换为?
目前,Apple似乎计划用两种不同的标识符替换UDID:供应商ID和广告ID。
供应商ID
来自同一开发者的应用之间的ID相同。 删除了该团队ID的最后一个应用程序。
广告ID
该设备的独特之处。 适用于所有应用;用于广告 - iAd已从iOS 6及更高版本的UDID转换而来。 重置“删除所有内容&设置”。
在大多数情况下,供应商ID将允许具有多个应用程序的开发人员将您识别为所有应用程序中的同一用户。这可以帮助开发人员更好地了解他们的受众并提供更好的服务。
广告ID仍会为设备创建唯一标识符,但与UDID不同,可以关闭或重置广告ID,就像可以在桌面或笔记本电脑上的浏览器中控制Cookie一样。
随着本周早些时候iOS7的发布,Apple又采取了一个步骤,即关闭另一个唯一标识符 - 应用程序开发商和广告公司可以使用的“MAC地址”,而不是新的广告ID。通过弥补这个漏洞,Apple正在采取措施,迫使这些公司只使用用户可以控制的跨应用程序标识符。
还有待观察的是,目标公司是否会继续寻求解决Apple的授权问题。其他技术,如“设备指纹识别”,已经开发出来,可以在Apple框架之外唯一地识别您的设备。苹果是否会打击这些方法还有待观察。
答案 2 :(得分:2)
来自identifierForVendor
的{{3}}:
当用户从设备中删除所有该供应商的应用程序并随后重新安装其中一个或多个应用程序时,该值会更改。使用Xcode安装测试版本或使用ad-hoc分发在设备上安装应用程序时,也可以使用该值。因此,如果您的应用程序将此属性的值存储在任何位置,则应优雅地处理标识符更改的情况。
答案 3 :(得分:2)
iOS7设备上是否安装了来自同一供应商的其他应用程序?根据{{3}}:
此应用程序(或其他应用程序)中此属性的值保持不变 iOS设备上安装了来自同一供应商的应用程序。价值 当用户从中删除所有该供应商的应用程序时更改 设备,然后重新安装其中一个或多个。价值可以 在使用Xcode安装测试版本或安装应用程序时也是如此 在使用ad-hoc分发的设备上。因此,如果您的应用程序存储 这个属性的值在任何地方,你应该优雅地处理 标识符发生变化的情况。
您是否通过AppStore提供应用程序?如果不是:
如果未从应用商店安装应用(例如应用时) 仍在开发中,供应商是根据应用程序确定的 捆绑ID。假设捆绑ID是反向DNS格式,并且 前两个组件用于生成供应商ID。对于 例如,com.example.app1和com.example.app2似乎有 相同的供应商ID。
答案 4 :(得分:1)
如果您在设备上没有安装其他应用程序,则可以更改供应商的标识符。此外,如果您通过不同的分发方法安装应用程序,供应商的标识符可能会更改,即。通过XCode安装时以及通过TestFlight或HockeyApp分发时,应用程序可能没有相同的供应商标识符。
答案 5 :(得分:0)
尝试清除计算机上的应用缓存,然后检查。这可能是您的缓存问题
答案 6 :(得分:0)
要向nerowolfe's answer添加内容,有一个很棒的Keychain Wrapper,名为MCSMKeychainItem
,除了其他几项外,还允许您使用单行代码生成和检索唯一设备ID:
[MCSMApplicationUUIDKeychainItem applicationUUID];
所以基本用法就像是
+ (NSString *)deviceId {
// load unique device ID or generate new one
return [MCSMApplicationUUIDKeychainItem applicationUUID];
}
它在Keychain的基础上工作,它存储一次生成的唯一标识符(如nerowolf建议的那样)。它是开源的,你可以下载它here on github。
注意:我不是分机的作者,也不以任何方式了解他/她。