關於iOS獲取設備的唯一標識符的方法總結和最好的方法

公司給App開賬號是按照埠來開的,每個購買的客戶都會給一個埠,甚至App裡面一些模塊也是根據埠給許可權,沒花錢的用戶只能看著彈框提示不能用...公司太摳了 服務端的哥們就要我們移動端把設備的唯一標識符傳給伺服器,安卓很簡單 iOS就麻煩一點

  1. UDID(Unique Device Identifier)它是蘋果設備的唯一識別碼 由40位16進位數的數字和字母組成 獲取代碼 NSString *uuid =[ [UIDevice currentDevice] uniqueIdentifier]; 然而 iOS5.0以後 蘋果為了保戶用戶的私人信息 就不再讓開發者通過代碼訪問UDID的許可權 應用試圖獲取DID也被禁止上架。

    Advertisements

  2. CFUUID 。 它是CoreFoundaio包的一部分,獲取代碼 CFUUIDRef *cfuuid = CFUUIDCreate(kCFAllocatorDefault); NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid)); 每次調用CFUUIDCreate,系統都會返回一個新的唯一標示符 系統沒有保存。

  3. NSUUID它在iOS 6中才出現,跟上面的CFUUID幾乎完全一樣,只不過它是Objective-C介面。獲取代碼 NSString *uuid = [[NSUUID UUID] UUIDString];

    Advertisements

  4. UUID(Universally Unique Identifier) 中文意思是通用唯一識別碼。它是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。這樣,每個人都可以建立不與其它人衝突的 UUID。在此情況下,就不需考慮資料庫建立時的名稱重複問題。蘋果建議使用UUID為應用生成唯一標識字元串,系統也沒有幫我們儲存。

  5. 廣告標示符(IDFA-identifierForIdentifier)廣告標示符,在同一個設備上的所有App都會取到相同的值,是蘋果專門給各廣告提供商用來追蹤用戶而設的。但好在Apple默認是允許追蹤的,而且一般用戶都不知道有這麼個設置,所以基本上用來監測推廣效果,是戳戳有餘了。 它是iOS 6中另外一個新的方法,提供了一個方法advertisingIdentifier,通過調用該方法會返回一個NSUUID實例,最後可以獲得一個UUID,由系統存儲著的。#import <AdSupport/AdSupport.h> NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];不過即使這是由系統存儲的,但是有幾種情況下,會重新生成廣告標示符。如果用戶完全重置系統((設置程序 -> 通用 -> 還原 -> 還原位置與隱私) ,這個廣告標示符會重新生成。另外如果用戶明確的還原廣告(設置程序-> 通用 -> 關於本機 -> 廣告 -> 還原廣告標示符) ,那麼廣告標示符也會重新生成。 關於廣告標示符的還原,有一點需要注意:如果程序在後台運行,此時用戶「還原廣告標示符」,然後再回到程序中,此時獲取廣 告標示符並不會立即獲得還原后的標示符。必須要終止程序,然後再重新啟動程序,才能獲得還原后的廣告標示符。 所以IDFA也不可以作為獲取唯一標識的方法,來識別用戶。

  6. Vendor標示符 (IDFV-identifierForVendor)它是給Vendor標識用戶用的,每個設備在所屬同一個Vender的應用里,都有相同的值。其中的Vender是指應用提供商,但準確點說,是通過BundleID的反轉的前兩部分進行匹配,如果相同就是同一個Vender,例如對於com.taobao.app1, com.taobao.app2 這兩個BundleID來說,就屬於同一個Vender,共享同一個IDFV的值。和IDFA不同的是,IDFV的值是一定能取到的,所以非常適合於作為內部用戶行為分析的主id,來標識用戶,替代OpenUDID。 它是iOS 6中新增的,跟advertisingIdentifier一樣,該方法返回的是一個 NSUUID對象,可以獲得一個UUID。如果滿足條件「相同的一個程序裡面-相同的vendor-相同的設備」,那麼獲取到的這個屬性值就不會變。如果是「相同的程序-相同的設備-不同的vendor,或者是相同的程序-不同的設備-無論是否相同的vendor」這樣的情況,那麼這個值是不會相同的。 NSString *strIDFV = [[[UIDevice currentDevice] identifierForVendor] UUIDString];但是如果用戶將屬於此Vender的所有App卸載,則IDFV的值會被重置,即再重裝此Vender的App,IDFV的值和之前不同。

  7. 推送token+bundle_id推送token+bundle_id的方法: 1、應用中增加推送用來獲取token 2.獲取應用bundle_id 3、根據token+bundle_id進行散列運算apple push token保證設備唯一,但必須有網路情況下才能工作,該方法並不是依賴於設備本身,而是依賴於apple push機制,所以當蘋果push做出改變時, 你獲取所謂的唯一標識也就隨之失效了。所以此方法還是不可取的。

總結

說了那麼多, 好像沒有一種方法是好用的。沒錯, 其實自從蘋果廢除UDID后, 就不能達到獲取設備真正的唯一標識了。因為這些方法中導致獲取的唯一標示產生改變的原因, 或是重新調用方法, 或是卸載應用,或是重啟設備, 或是還原某些標識, 或者刷新系統… 所以,不能從根本上獲取唯一標識 只能儘可能的接近

利用keyChain(鑰匙串 系統級別儲存)和UUID永久獲得設備的唯一標識 iOS的keychain服務提供了一種安全的保存私密信息(密碼,序列號,證書等)的方式,每個ios程序都有一個獨立的keychain存儲。相對於NSUserDefaults、文件保存等一般方式,keychain保存更為安全,而且keychain里保存的信息不會因App被刪除而丟失,所以在重裝App后,keychain里的數據還能使用,刷機或系統升級的話就不能用了。使用鑰匙串需要導入Security.framework 別忘了xcode 中Capabiities目錄下的Keychain Sharing開關也要打開。

Advertisements

你可能會喜歡