iOS設(shè)備唯一標(biāo)識(shí)符解決方案
記得當(dāng)時(shí)做過一個(gè)電商項(xiàng)目,甲方提出的要求是這樣的:用戶可以在不登錄的情況下,以游客模式下單購(gòu)物,而不被注冊(cè)or登錄打斷購(gòu)物流程。這個(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í)。