iOS設(shè)備唯一標(biāo)識(shí)符解決方案
記得當(dāng)時(shí)做過一個(gè)電商項(xiàng)目,甲方提出的要求是這樣的:用戶可以在不登錄的情況下,以游客模式下單購物纷铣,而不被注冊(cè)or登錄打斷購物流程。這個(gè)技術(shù)難點(diǎn)主要是怎么永久保存App的用戶數(shù)據(jù)案站,要做到用戶卸載重裝App后,還能識(shí)別是哪個(gè)用戶棘街。
UUID
UUID是Universally Unique Identifier的縮寫蟆盐,中文意思是通用唯一識(shí)別碼。它是讓分布式系統(tǒng)中的所有元素蹬碧,都能有唯一的辨識(shí)資訊舱禽,而不需要透過中央控制端來做辨識(shí)資訊的指定。這樣恩沽,每個(gè)人都可以建立不與其它人沖突的 UUID誊稚。蘋果公司建議使用UUID為應(yīng)用生成唯一標(biāo)識(shí)字符串。 iOS 6中介紹的Vendor或Advertising標(biāo)示符,通過下面的代碼可以獲得一個(gè)UUID字符串:
如何獲取UUID
方法1.
NSString *uuid = [[NSUUID UUID] UUIDString];
也可以保存在iOS 6中新增的Vindor標(biāo)示符 (IDFV-identifierForVendor),獲取這個(gè)IDFV的新方法被添加在已有的UIDevice類中里伯。跟advertisingIdentifier一樣城瞎,該方法返回的是一個(gè)NSUUID對(duì)象。
方法2.
NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
方法3.
NSString *uuid = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
Keychain
開發(fā)者可以在應(yīng)用第一次啟動(dòng)時(shí)調(diào)用一次疾瓮,然后將該串存儲(chǔ)起來脖镀,以便以后替代UDID來使用。但是狼电,如果用戶刪除該應(yīng)用再次安裝時(shí)蜒灰,又會(huì)生成新的字符串,所以不能保證唯一識(shí)別該設(shè)備肩碟。由于IOS系統(tǒng)存儲(chǔ)的數(shù)據(jù)都是在sandBox里面强窖,一旦刪除App,sandBox也不復(fù)存在削祈。好在有一個(gè)例外翅溺,那就是keychain(鑰匙串)。通常情況下髓抑,IOS系統(tǒng)用NSUserDefaults存儲(chǔ)數(shù)據(jù)信息咙崎,但是對(duì)于一些私密信息,比如密碼吨拍、證書等等褪猛,就需要使用更為安全的keychain了。
keychain里保存的信息不會(huì)因App被刪除而丟失密末。所以握爷,可以利用這個(gè)keychain這個(gè)特點(diǎn)來保存設(shè)備唯一標(biāo)識(shí)。所以這里要用到KeyChain來保存严里。
那么,如何在應(yīng)用里使用使用keyChain呢追城,可以使用第三方庫的YYKeychain來實(shí)現(xiàn)刹碾,我們可以使用蘋果已經(jīng)封裝好了的工具類KeychainItemWrapper來對(duì)keychain進(jìn)行操作。
實(shí)現(xiàn)
+ (NSString *)getUUID {
NSError *error;
NSString *uuid = [YYKeychain getPasswordForService:@"YouAppleTeamID.com.test.porject"
account:@"UUID"
error:&error];
if (uuid) {
return uuid;
}
if(error){
NSLog(@"從Keychain里獲取密碼出錯(cuò):%@", error);
}
//首次執(zhí)行該方法時(shí)座柱,uuid為空
if ([uuid isEqualToString:@""] || !uuid) {
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
uuid = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
/** 保存用戶的密碼*/
BOOL saved = [YYKeychain setPassword:uuid forService:@"YouAppleTeamID.com.test.porject" account:@"UUID" error:&error];
if (!saved) {
NSLog(@"保存密碼時(shí)出錯(cuò):%@", error);
}
}
return uuid;
}
在首次打開App的時(shí)候迷帜,會(huì)給用戶生成一個(gè)唯一的UUID并存儲(chǔ)在keychain中,當(dāng)用戶卸載App后色洞,重新安裝打開后戏锹,會(huì)從Keychain中獲取存儲(chǔ)的UUID,這樣就能實(shí)現(xiàn)用戶的唯一標(biāo)識(shí)火诸。