自从iOS5之后,苹果废除了通过代码获取UDID的权限。所以理论上不存在绝对的唯一标识符。通过各种方法达到类似唯一标识符的效果但是都有瑕疵。
1、通过广告标识符确认唯一设备。弊端:如果用户完全重置系统((设置程序 ->通用 ->还原 ->还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序->通用 ->关于本机 ->广告 -> 还原广告标示符),那么广告标示符也会重新生成。
2、通过推送的token确认唯一设备。弊端:该方法并不是依赖于设备本身,而是依赖于apple push机制,所以当苹果push做出改变时,获取所谓的唯一标识也就随之失效了。
3、通过UUID确认唯一设备。弊端:恢复出厂设置、刷机等操作标识符会改变。另外此方法是通过生成一个标识符存到钥匙串中,只能是同一个开发者账号下的多个APP可以共享,对于多个开发者账号多个APP的需求无法满足。
获取UUID并存入钥匙串代码如下:(这里用了 SAMKeychain 这个三方库,用cocoapods导一下就好了)
+ (NSString *)getDeviceID {
NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *strApplicationUUID = [SAMKeychain passwordForService:appName account:@"uuid"];
if (strApplicationUUID == nil)
{
strApplicationUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
NSError *error = nil;
SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init];
query.service = appName;
query.account = @"uuid";
query.password = strApplicationUUID;
//keychain在同账号下不同设备间是同步的,设置这个保证不同设备间的值不同
query.synchronizationMode = SAMKeychainQuerySynchronizationModeNo;
[query save:&error];
}
return strApplicationUUID;
}