iOS怎樣獲取裝置唯一識別符號

3033發表於2017-12-14

###開篇 我又來寫簡書了,今天說一下裝置的唯一識別碼,和怎麼使用它吧。IOS系統中,獲取裝置唯一標識的方法有很多,我們來介紹一下。 ####各種裝置識別碼的介紹

  • UDID(Unique Device Identifier) UDID的全稱是Unique Device Identifier,顧名思義,它就是蘋果IOS裝置的唯一識別碼,它由40個字元的字母和數字組成。
  • UUID(Universally Unique Identifier) UUID是Universally Unique Identifier的縮寫,中文意思是通用唯一識別碼.
  • MAC Address MAC(Media Access Control或者Medium Access Control)地址,意譯為媒體訪問控制,或稱為實體地址、硬體地址,用來定義網路裝置的位置。在OSI模型中,第三層網路層負責 IP地址,第二層資料鏈路層則負責 MAC地址。因此一個主機會有一個MAC地址,而每個網路位置會有一個專屬於它的IP地址。MAC地址是網路卡決定的,是固定的。
  • OPEN UDID 裝置的識別碼,每臺iOS裝置的OpenUDID是通過第一個帶有OpenUDID SDK包的App生成,如果你完全刪除全部帶有OpenUDID SDK包的App(比如恢復系統等),那麼OpenUDID會重新生成,而且和之前的值會不同,相當於新裝置; 優點是沒有用到MAC地址;不同裝置能夠獲取各自唯一的識別碼,保證了唯一性,可以用於以往UDID的相關用途;從程式碼分析OpenUDID的獲取,識別碼獲取方便並且儲存謹慎。缺點是當將裝置上所有使用了OpenUDID方案的應用程式刪除,且裝置關機重啟,xcode徹底清除並重啟,重灌應用程式去獲取OpenUDID,此時OpenUDID變化,與之前不一樣了,所有OpenUDID應用解除安裝後,由UIPasteboard儲存的資料即被清除,重灌故會重新獲取新的OpenUDID。 那麼當因為使用者干預或者惡意程式,致使UIPasteboard資料清除,從而導致OpenUDID被刪除,重灌也會獲取新的OpenUDID。
  • 廣告標示符(IDFA-identifierForIdentifier) 廣告標示符,適用於對外:例如廣告推廣,換量等跨應用的使用者追蹤等。
  • Vindor標示符 (IDFV-identifierForVendor) Vendor是CFBundleIdentifier(反轉DNS格式)的前兩部分。來自同一個運營商的應用執行在同一個裝置上,此屬性的值是相同的;不同的運營商應用執行在同一個裝置上值不同。 經測試,只要裝置上有一個tencent的app,重新安裝後的identifierForVendor值不變,如果tencent的app全部刪除,重新安裝後的identifierForVendor值改變。 ####分析 雖然我們看似有了那麼多的唯一標識,但是不要高興的太早,上面所有這些表示裝置唯一號的標識,在IOS7中要麼被禁止使用,要麼重新安裝程式後兩次獲取的識別符號不一樣。 下面就專案中的事來說一下,我的成(辛)長(酸)歷(歷)程(史)。之前的一個專案中要與無線WIFI裝置對接,來控制使用者使用無線網路的情況,但是,硬體那邊來的技術小哥一口咬定要實現這個必須要裝置的Mac地址,因為他們的無線裝置就是根據mac地址來實現控制的,然後對我進行了瘋狂的灌輸,Mac地址的用處...此處省略無數字,但是我想說的是,高傲的蘋果不允許啊,蘋果已經不允許獲取使用者的Mac地址了,在iOS請求的Mac地址都會返回一個固定的值,你不是要用來使用者識別麼,你識別啊,在iOS7後返回一臉的02:00:00:00:00:00。一切的轉機直到我聯絡到了他們的技術總監,一個大一號的程式猿(~_ ~),然後事情就解決了,其實通過別的唯一識別符號也是可以的。 UDID,Mac地址,OpenUDID,都已經要麼無效要麼禁止,那麼我們就採用目前用的比較多的UUID吧。 ###UUID使用 首先我麼要獲取裝置的UUID啊,這個還是比較簡單的,上程式碼
    NSString *deviceUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

    NSLog(@"%@",deviceUUID);
複製程式碼

這樣我們就列印出了裝置的UUID

2016-08-02 15:13:14.138 keychaintest[2002:222100] BDAF6B4D-5DC0-4AEF-BCF8-6C7EFC94DE97
複製程式碼

但是問題來了,當我們從真機上解除安裝這個軟體重新安裝的時候,UUID變了(模擬器每次都變),對,確實變了

圖片1.jpg
我們如果還要用UUID來作為唯一識別符的話,我們只能把他存在一個地方,讓軟體解除安裝的時候他也不會丟失,NSUserDefaults和FMDB等本地儲存已經不能再完成他們的使命了。怎麼辦呢? ###keychain的使用 keychain的使用確實幫我們解決了這個問題,我們可以在第一次生成我們需要的UUID的時候,儲存他,然後就用keychain裡儲存的值來代替他的UUID,這樣解除安裝之後,生成新的UUID,但是keychain裡的資料是不會消失的,這樣就實現了唯一識別碼的目的。 文件上說iOS的keyChain是一個相對獨立的空間,當程式替換,刪除時並不會刪除keyChain的內容,這個要比Library/Cache好。刷機,恢復出廠應該就沒有了。關於備份,只會備份資料,到那時不會備份裝置的金鑰,換句話說,即使拿到資料,也沒有辦法解密裡面的內容,感覺keyChain像是沙盒的升級版,可以存放一些非私密的資訊,即使破解也不影響其它使用者,隻影響那個破解了的裝置。(比如針對該裝置的一個金鑰)。 可訪問性一般來說,自己的程式只能訪問自己的keychain,相同bundle的程式通過設定group可以互相共享同組的keychain,從而實現程式間可以共同訪問一些資料。 說了那麼多我們怎麼使用它呢,蘋果給出了文件,但是我們只是做簡單的資料的儲存,自己寫個簡單的類來實現它就好了。

GSKeyChainDataManager_h.png
然後實現它

GSKeyChainDataManager_m.png
這樣我們再呼叫它

 [GSKeyChainDataManager saveUUID:deviceUUID];  //存入
 [GSKeyChainDataManager readUUID] //讀取
複製程式碼

進入裝置的時候存入UUID,以後的時候讀取他。就算解除安裝,讀取出來的值還是第一次進入軟體的時候的UUID,實現了裝置的唯一識別符號。(注意寫的地方,不要每次執行都重新儲存,不要用模擬器)。 ###後記 keychain是非常有用的,可以幫我們儲存使用者的賬號密碼等資訊,我們可以通過自己寫的方法去儲存他。實現本地化儲存,比以前的方法更加的安全哦。這裡,如果有需要方法程式碼的小夥伴,可以留下郵箱。 ###最新補充 最近由於工作以及各方面原因比較忙,所以很多留言也未發程式碼,這裡留一個git地址,有需要的自己去下載一下吧。**SomeTools-Demo**裡面有幾個類似於工具類的程式碼,比如正規表示式,定時器的封裝,GCD等知識,其中keychaintest是儲存裝置唯一識別符號的程式碼,有需要的可以去下一下,順便點個星哦,不用再留言了。 ####更正 此處的UUID 根本不是UUID ,是IDFV,裝置的唯一標識用IDFV配合keychain來做的。

相關文章