获取到UUID,然后把UUID保存到KeyChain里面。
这样以后即使卸载APP,也可以从KeyChain中读取回来。
但是刷机或重装系统后uuid还是会改变。
代码采用CFUUID+KeyChain的实现方式:
1.创建KeyChain管理类
@implementation ZZKeyChainManager
+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
return [NSMutableDictionary dictionaryWithObjectsAndKeys:
(__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,
service, (__bridge_transfer id)kSecAttrService,
service, (__bridge_transfer id)kSecAttrAccount,
(__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,
nil];
}
+ (void)save:(NSString *)service data:(id)data {
//Get search dictionary
NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
//Delete old item before add new item
SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
//Add new object to search dictionary(Attention:the data format)
[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
//Add item to keychain with the search dictionary
SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
}
+ (id)load:(NSString *)service {
id ret = nil;
NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
//Configure the search setting
[keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
[keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
CFDataRef keyData = NULL;
if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
@try {
ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
} @catch (NSException *e) {
NSLog(@"Unarchive of %@ failed: %@", service, e);
} @finally {
}
}
return ret;
}
+ (void)deleteUUID:(NSString *)service {
NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
}
@end
2.创建UUID管理类
#import "ZZUUIDManager.h"
@implementation
ZZUUIDManager
static
NSString
*
const
KEY_IN_KEYCHAIN = @
"com.zzuuid.uuid"
;
+(
void
)saveUUID:(
NSString
*)
uuid
{
if
(
uuid
&&
uuid
.length > 0) {
[ZZKeyChainManager save:KEY_IN_KEYCHAIN data:
uuid
];
}
}
+(
NSString
*)getUUID{
NSString
*getUDIDInKeychain = (
NSString
*)[ZZKeyChainManager load:KEY_IN_KEYCHAIN];
if
(!getUDIDInKeychain || [getUDIDInKeychain isEqualToString:@
""
] || [getUDIDInKeychain isKindOfClass:[
NSNull
class
]]) {
CFUUIDRef puuid = CFUUIDCreate(
nil
);
CFStringRef uuidString = CFUUIDCreateString(
nil
, puuid );
NSString
* result = (
NSString
*)CFBridgingRelease(CFStringCreateCopy(
NULL
, uuidString));
CFRelease(puuid);
CFRelease(uuidString);
getUDIDInKeychain = result;
[ZZKeyChainManager save:KEY_IN_KEYCHAIN data:result];
getUDIDInKeychain = (
NSString
*)[ZZKeyChainManager load:KEY_IN_KEYCHAIN];
}
return
getUDIDInKeychain;
}
+(
void
)deleteUUID{
[ZZKeyChainManager deleteUUID:KEY_IN_KEYCHAIN];
}