经过一些列与苹果的大战之后,UDID已经彻底凉凉.
现在已经没有一种完全可以获取不变的手机设备识别码了
官方提供的idfv大家嫌弃的不能再嫌弃
真的没有更好的方式吗?
有的!
那就是keyChain和uuid的结合版本(暂且叫KCID)
众所周知.keyChain中的数据,除非重装系统,否则是不会丢失的.
这样我们就可以利用这个特性
安装app的时候,生成一个uuid字符串,然后手动写入keyChain中.
这样就大功告成了
达到的效果就是:
除非用户抹掉用户数据或者重装系统,否则这个存在keyChain中的uuid字符串永远不会改变!
懒人代码:
#pragma mark - 保存在Keychian中的KCID
+(NSString *)getKCID
{
NSString *KCID =[self loadStringDataWithIdentifier:@"JD_KCID"];
if (!uuid) {
NSString *uuid = [NSUUID UUID].UUIDString;
[self saveStringWithdIdentifier:@"JD_KCID" data:uuid];
KCID =uuid;
}
return KCID;
}
//重置
+ (BOOL)resetUUID
{
NSMutableDictionary *keychainQuery = [self getKeychainQuery:@"JD_UUID" accessGroup:nil];
SecItemDelete((CFDictionaryRef)keychainQuery);
return YES;
}
+ (BOOL)saveStringWithdIdentifier:(NSString *)identifier data:(NSString *)str;
{
//Get search dictionary
NSMutableDictionary *keychainQuery = [self getKeychainQuery:identifier accessGroup:nil];
//Delete old item before add new item
SecItemDelete((CFDictionaryRef)keychainQuery);
//Add new object to search dictionary(Attention:the data format)
[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:str] forKey:(id)kSecValueData];
//Add item to keychain with the search dictionary
OSStatus status = SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
if (status != noErr) {
return NO;
}
return YES;
}