获取唯一设备ID
[[[UIDevice currentDevice] identifierForVendor] UUIDString];
根据APP供应商分配,APP卸载重装后,会重新生成。
需要通过keychain存储配合使用。
@interface YLKeyChainStore : NSObject
/**保存数据至钥匙串中*/
- (void)save:(NSString)service data:(id)data;
/**从钥匙串中加载数据/ - (id)load:(NSString)service;
/**删除数据/ - (void)deleteKeyData:(NSString)service;
/** 获取UUID/ - (NSString *)getUUIDByKeyChain;
@end
/**通过 key 获取数据*/
-
(NSMutableDictionary)getKeychainQuery:(NSString)service {
service = [self handleServiceKeyWith:service];
return[NSMutableDictionary dictionaryWithObjectsAndKeys:
(id)kSecClassGenericPassword,(id)kSecClass,
service,(id)kSecAttrService,
service,(id)kSecAttrAccount,
(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
nil];
} -
(NSString)handleServiceKeyWith:(NSString)service {
return [NSString stringWithFormat:@"%@%@",AppBundleID(),service];
} -
(void)save:(NSString)service data:(id)data{
//Get search dictionary
NSMutableDictionarykeychainQuery = [self getKeychainQuery:service];
//Delete old item before add new item
SecItemDelete((CFDictionaryRef)keychainQuery);
//Add new object to searchdictionary(Attention:the data format)
[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data]forKey:(id)kSecValueData];
//Add item to keychain with the searchdictionary
SecItemAdd((CFDictionaryRef)keychainQuery,NULL);
} -
(id)load:(NSString)service {
id ret =nil;
NSMutableDictionarykeychainQuery = [self getKeychainQuery:service];
//Configure the search setting
//Since in our simple case we areexpecting only a single attribute to be returned (the password) wecan set the attribute kSecReturnData to kCFBooleanTrue
[keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
[keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
CFDataRef keyData =NULL;
if(SecItemCopyMatching((CFDictionaryRef)keychainQuery,(CFTypeRef)&keyData) ==noErr){
@try{
ret =[NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData)keyData];
}@catch(NSException *e) {
NSLog(@"Unarchiveof %@ failed: %@",[self handleServiceKeyWith:service], e);
}@finally{
}
}
if(keyData)
CFRelease(keyData);
return ret;
} -
(void)deleteKeyData:(NSString)service {
NSMutableDictionarykeychainQuery = [self getKeychainQuery:service];
SecItemDelete((CFDictionaryRef)keychainQuery);
}
/** 获取UUID*/
- (NSString )getUUIDByKeyChain {
NSStringkey = @"uuid";
// 这个key的前缀最好是你的BundleID
NSStringstrUUID = (NSString)[YLKeyChainStore load:key];
//首次执行该方法时,uuid为空
if([strUUID isEqualToString:@""] || !strUUID)
{
strUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
//将该uuid保存到keychain
[YLKeyChainStore save:key data:strUUID];
}
return strUUID;
}