- 現(xiàn)在常用的UUID + keychain結(jié)合來實現(xiàn)這個需求歉铝。
// 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.現(xiàn)在我們獲取這個UUID雖然是唯一的,但是不能保證每一次的唯一性凑耻,因為當您每一次調(diào)用或app卸載的時候太示,UUID會生成一個不同的。這個時候keychain就起到了作用拳话。
2.所以整個邏輯為:從keychain獲取UUID先匪。如果能獲取到就去比對,如果獲取不到就生成一個保存起來弃衍。keychain獨立在app之外,是和系統(tǒng)統(tǒng)一等級的坚俗,所以您不用擔心關掉镜盯。
- 使用 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:這個參數(shù)如果設置相同的話速缆,是可以共享的。
- 從keychain獲取UUID的方法如下:
- (NSString *)getKeychain {
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper
alloc]
initWithIdentifier:@"UUID" accessGroup:@"com.xxx.www"];
NSString *strUUID = [keychainItem objectForKey:
(id)kSecValueData];
return strUUID;
}
- 至此恩闻,唯一標示的幾個方法算是寫完了艺糜,大家可以測一下,寫在應用在重新安裝幢尚,從keychain獲取的UUID和之前一樣破停。
- 但這里有個不確定因素,就是系統(tǒng)恢復出廠設置或抹掉所有數(shù)據(jù)的話尉剩,這個方法也有可能就不起作用了真慢,因為他是依靠鑰匙串在生存,秘鑰掛掉的話理茎,他也就失效了黑界。