- 现在常用的UUID + keychain结合来实现这个需求。
// 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;
}
1.现在我们获取这个UUID虽然是唯一的,但是不能保证每一次的唯一性,因为当您每一次调用或app卸载的时候,UUID会生成一个不同的。这个时候keychain就起到了作用。
2.所以整个逻辑为:从keychain获取UUID。如果能获取到就去比对,如果获取不到就生成一个保存起来。keychain独立在app之外,是和系统统一等级的,所以您不用担心关掉。
- 使用 keychain需要导入 Security.framework和KeychainItemWrapper.h/.m 但是KeychainItemWrapper.h/.m 搜索可以下载下来。拖入工程中。
- 保存UUID的代码如下:
- (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];
} }
这个方法中accessGroup:这个参数如果设置相同的话,是可以共享的。
- 从keychain获取UUID的方法如下:
- (NSString *)getKeychain {
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper
alloc]
initWithIdentifier:@"UUID" accessGroup:@"com.xxx.www"];
NSString *strUUID = [keychainItem objectForKey:
(id)kSecValueData];
return strUUID;
}
- 至此,唯一标示的几个方法算是写完了,大家可以测一下,写在应用在重新安装,从keychain获取的UUID和之前一样。
- 但这里有个不确定因素,就是系统恢复出厂设置或抹掉所有数据的话,这个方法也有可能就不起作用了,因为他是依靠钥匙串在生存,秘钥挂掉的话,他也就失效了。