iOS怎樣獲取設備惟一標識符

###開篇 我又來寫簡書了,今天說一下設備的惟一識別碼,和怎麼使用它吧。IOS系統中,獲取設備惟一標識的方法有不少,咱們來介紹一下。 ####各類設備識別碼的介紹git

  • 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);
複製代碼

這樣咱們就打印出了設備的UUIDgithub

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來作的。xcode

相關文章
相關標籤/搜索