[iOS]重装都不会改变的UUID

经过一些列与苹果的大战之后,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;

}

你可能感兴趣的:([iOS]重装都不会改变的UUID)