iOS設(shè)備唯一標(biāo)識(shí)符解決方案

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í)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容