今天玩著應(yīng)用突然想起了這個問題谆甜,之前對設(shè)備的唯一標(biāo)識的概念停留在“刷優(yōu)惠券”的理解上。霸妹。。
“刷優(yōu)惠券”就是刷美團或者大眾這些做首單優(yōu)惠的App的優(yōu)惠券知押,它們?yōu)椤笆讍巍眲?chuàng)造了幾個制約因素叹螟,其中一個就是設(shè)備的唯一性——參加過的不能再參加,這就要獲取的設(shè)備的唯一標(biāo)識台盯。這項技能一度使我在大學(xué)里吃牛排看電影不要錢罢绽。
有點跑題,回到正題上静盅。我查閱了一些資料良价,了解了一下iOS下是如何做到“設(shè)備標(biāo)識的唯一性的”。不得不說iOS在用戶隱私政策和權(quán)限上做的非常好蒿叠,一個App能獲得的權(quán)限(沒越獄的情況下)是非常有限的棚壁,之前的很多方法比如UDID都被棄用禁止了。
那么就說現(xiàn)在還能用的栈虚,現(xiàn)在常用的是用UUID + keychain
結(jié)合來實現(xiàn)這個需求袖外。
UUID是Universally Unique Identifier的縮寫,中文意思是通用唯一識別碼魂务。它是讓分布式系統(tǒng)中的所有元素曼验,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定粘姜。這樣鬓照,每個人都可以建立不與其它人沖突的 UUID。在此情況下孤紧,就不需考慮數(shù)據(jù)庫建立時的名稱重復(fù)問題豺裆。蘋果公司建議使用UUID為應(yīng)用生成唯一標(biāo)識字符串。
首先我們要獲取一個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;
}
現(xiàn)在我們獲取到了一個UUID臭猜,雖然這個標(biāo)識是唯一的,但是這樣還是無法保證每一次的唯一性押蚤,因為當(dāng)你每次調(diào)用這個方法或者把應(yīng)用卸載了蔑歌,UUID會重新生成一個不同的。這個時候keychain就起到了作用揽碘。所以整個邏輯是這樣的:先從keychain取UUID次屠,如果能取到园匹,就用這個比對,如果取不到就重新生成一個保存起來劫灶。
keychain獨立在App之外裸违,是和系統(tǒng)統(tǒng)一等級的,所以你不用擔(dān)心它掛掉本昏。
keychain是蘋果公司Mac OS中的密碼管理系統(tǒng)累颂。它在Mac OS 8.6中被導(dǎo)入,并且包括在了所有后續(xù)的Mac OS版本中凛俱,包括Mac OS X。一個鑰匙串可以包含多種類型的數(shù)據(jù):密碼(包括網(wǎng)站料饥,F(xiàn)TP服務(wù)器蒲犬,SSH帳戶,網(wǎng)絡(luò)共享岸啡,無線網(wǎng)絡(luò)原叮,群組軟件,加密磁盤鏡像等)巡蘸,私鑰奋隶,電子證書和加密筆記等。iOS端同樣有個keychain幫助我們管理這些敏感信息悦荒。
使用過keychain保存過賬號密碼的童鞋應(yīng)該對這個工具非常了解唯欣,在這里不做過多解釋。使用keychain需要導(dǎo)入Security.framework
和KeychainItemWrapper.h/.m
搬味,KeychainItemWrapper.h/.m
搜一下可以下載下來境氢,拖入工程中。保存UUID代碼如下:
- (void)saveUuidWithKeyChain {
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
initWithIdentifier:@"UUID" accessGroup:@"com.QiuYunxiang.www"];
NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData];
if (strUUID == nil || [strUUID isEqualToString:@""])
{
[keychainItem setObject:[self uuid] forKey:(id)kSecValueData];
}
}
注:這個方法中accessGroup:
這個參數(shù)如果一些App設(shè)置相同的話碰纬,是可以共享的萍聊。
從keychain獲取UUID的方法如下:
- (NSString *)getKeychain {
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
initWithIdentifier:@"UUID" accessGroup:@"com.QiuYunxiang.com"];
NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData];
return strUUID;
}
至此,基本上唯一標(biāo)識的幾個方法算是寫完了悦析,大家可以測試一下寿桨,卸載應(yīng)用再重新裝,從keychain讀取的UUID還是和之前一樣强戴。
但這里有個不確定因素亭螟,就是手機系統(tǒng)恢復(fù)出廠設(shè)置或者抹掉所有數(shù)據(jù)的話,這個方法也可能不起作用了骑歹,因為它是依靠鑰匙串在生存媒佣,鑰匙串掛掉的話它也就失效了。
獻給以前刷優(yōu)惠券的日子
個人原創(chuàng)陵刹,轉(zhuǎn)載請注明出處默伍,謝謝欢嘿。