-
现在常用的是用UUID+keychain结合来实现这个需求。
// 获取一个UUID
// 注意:每次调用这个方法或者卸载应用重新安装,生成UUID都是不同的。
- (NSString*)uuid {
CFUUIDRef uuid = CFUUIDCreate( nil );
CFStringRef uuidString = CFUUIDCreateString( nil, uuid );
NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
CFRelease(uuid);
CFRelease(uuidString);
return result;
}
// 将生成的UUID保存到 keychain(钥匙串) 中
// keychain 是苹果公司Mac OS中的密码管理系统,keychain 是独立在App之外的,是和系统同一等级的。保存在里面的值不会随着卸载应用再重新安装而改变。只有手机系统恢复出厂设置或者抹掉所有数据才会重置掉钥匙串里保存的值。
- (void)saveUuidWithKeyChain {
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"UUID" accessGroup:@"com.xxx.www"];
NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData];
if (strUUID == nil || [strUUID isEqualToString:@""]) {
[keychainItem setObject:[self uuid] forKey:(id)kSecValueData];
}
}
// 从keychain中获取UUID的值
- (NSString *)getKeychain {
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]initWithIdentifier:@"UUID" accessGroup:@"com.xxx.www"];
NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData];
return strUUID;
}
整个逻辑是这样的:先从keychain取UUID,如果能取到,就用这个比对,如果取不到就重新生成一个保存起来。