iOS常見各類ID

    //CFUUID
    CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
    NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
    DLog(@"CFUUID:%@", cfuuidString);
    //NSUUID
    NSString *uuid = [[NSUUID UUID] UUIDString];
    DLog(@"NSUDID:%@", uuid);
    
    //IDFA
    NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    DLog(@"adID:%@", adId);
    
    //IDFV
    NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    DLog(@"idfv:%@", idfv);
    
    //UDID
    NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];
    DLog(@"udid:%@", udid);
    
    //openUDID
    NSString *openUDID = [OpenUDID value];
    DLog(@"openUDID:%@", openUDID);

  

這裏有更加詳細的介紹 http://www.cocoachina.com/applenews/devnews/2013/0422/6040.htmlphp

在2013年3月21日蘋果已經通知開發者,從2013年5月1日起, 訪問UIDID的應用將再也不能經過審覈,替代的方案是開發者應該使用「在iOS 6中介紹的Vendor或Advertising標示符」。


unique Identifier即將退出,蘋果給了咱們Vendor和Advertising identifier兩個選擇,但應該用哪個?文檔並無給出確切答案,具體使用哪一個徹底由你根據本身app的目的來決定。下面我將列出iOS中目前支持的,以及被廢棄的惟一標示符方法,並對其作出相應的解釋,但願能夠幫你作出正確的肯定。html

 

CFUUID
從iOS2.0開始,CFUUID就已經出現了。它是CoreFoundatio包的一部分,所以API屬於C語言風格。CFUUIDCreate 方法用來建立CFUUIDRef,而且能夠得到一個相應的NSString,以下代碼:ios

CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));git

 

得到的這個CFUUID值系統並無存儲。每次調用CFUUIDCreate,系統都會返回一個新的惟一標示符。若是你但願存儲這個標示符,那麼須要本身將其存儲到NSUserDefaults, Keychain, Pasteboard或其它地方。github

 

NSUUID
NSUUID在iOS 6中才出現,這跟CFUUID幾乎徹底同樣,只不過它是Objective-C接口。+ (id)UUID 是一個類方法,調用該方法能夠得到一個UUID。經過下面的代碼能夠得到一個UUID字符串:服務器

NSString *uuid = [[NSUUID UUID] UUIDString];app

 

跟CFUUID同樣,這個值系統也不會存儲,每次調用的時候都會得到一個新的惟一標示符。若是要存儲的話,你須要本身存儲。在我讀取NSUUID時,注意到獲取到的這個值跟CFUUID徹底同樣(不過也可能不同):框架

示例: 68753A44-4D6F-1226-9C60-0050E4C00067less

 

廣告標示符(IDFA-identifierForIdentifier)
這是iOS 6中另一個新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分。ASIdentifierManager單例提供了一個方法advertisingIdentifier,經過調用該方法會返回一個上面提到的NSUUID實例。ide

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

 

跟CFUUID和NSUUID不同,廣告標示符是由系統存儲着的。不過即便這是由系統存儲的,可是有幾種狀況下,會從新生成廣告標示符。若是用戶徹底重置系統((設置程序 -> 通用 -> 還原 -> 還原位置與隱私) ,這個廣告標示符會從新生成。另外若是用戶明確的還原廣告(設置程序-> 通用 -> 關於本機 -> 廣告 -> 還原廣告標示符) ,那麼廣告標示符也會從新生成。關於廣告標示符的還原,有一點須要注意:若是程序在後臺運行,此時用戶「還原廣告標示符」,而後再回到程序中,此時獲取廣告標示符並不會當即得到還原後的標示符。必需要終止程序,而後再從新啓動程序,才能得到還原後的廣告標示符。之因此會這樣,我猜想是因爲ASIdentifierManager是一個單例。


針對廣告標示符用戶有一個可控的開關「限制廣告跟蹤」。Nick Arnott的文章中已經指出了。將這個開關打開,實際上什麼也沒有作,不過這是但願限制你訪問廣告標示符。這個開關是一個簡單的boolean標誌,當將廣告標示符發到任意的服務器端時,你最好判斷一下這個值,而後再作決定。

示例: 1E2DFA89-496A-47FD-9941-DF1FC4E6484A

 

Vindor標示符 (IDFV-identifierForVendor)
這種叫法也是在iOS 6中新增的,不過獲取這個IDFV的新方法被添加在已有的UIDevice類中。跟advertisingIdentifier同樣,該方法返回的是一個NSUUID對象。

NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

 

蘋果官方的文檔中對identifierForVendor有以下這樣的一段描述 :

The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor.

 

若是知足這樣的條件,那麼獲取到的這個屬性值就不會變:相同的一個程序裏面-相同的vindor-相同的設備。若是是這樣的狀況,那麼這個值是不會相同的:相同的程序-相同的設備-不一樣的vindor,或者是相同的程序-不一樣的設備-不管是否相同的vindor。

 

看完上面的內容,我有這樣的一個疑問「vendor是什麼」。我首先想到的是蘋果開發者帳號。但事實證實這是錯誤的。接着我想多是有一個AppIdentifierPrefix東西,跟鑰匙串訪問同樣,能夠在多個程序間共享。一樣,這個想法也是的。最後證實,vendor很是簡單:一個Vendor是CFBundleIdentifier(反轉DNS格式)的前兩部分。例如,com.doubleencore.app1 和 com.doubleencore.app2 獲得的identifierForVendor是相同的,由於它們的CFBundleIdentifier 前兩部分是相同的。不過這樣得到的identifierForVendor則徹底不一樣:com.massivelyoverrated 或 net.doubleencore。

 

在這裏,還須要注意的一點就是:若是用戶卸載了同一個vendor對應的全部程序,而後在從新安裝同一個vendor提供的程序,此時identifierForVendor會被重置。

示例: 599F9C00-92DC-4B5C-9464-7971F01F8370


UDID
在以前的版本中是可用的,可是在iOS5以及以後的版本中,以及被棄用了。雖然,這個UDID用得很普遍,可是,不得不說的是,它在慢慢的遠離開發者,不能在考慮使用UDID了。至於這個標示符是轉爲私有方法,或者徹底從之後的iOS版本中移除,還有待觀察。不過,這個UDID在部署企業級簽名程序時,很是方便。獲取UDID的方法以下:

NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];

示例: bb4d786633053a0b9c0da20d54ea7e38e8776da4

 

OpenUDID
在iOS 5發佈時,uniqueIdentifier被棄用了,這引發了廣大開發者須要尋找一個能夠替代UDID,而且不受蘋果控制的方案。由此OpenUDID成爲了當時使用最普遍的開源UDID替代方案。OpenUDID在工程中實現起來很是簡單,而且還支持一系列的廣告提供商。

NSString *openUDID = [OpenUDID value];

 

OpenUDID利用了一個很是巧妙的方法在不一樣程序間存儲標示符 — 在粘貼板中用了一個特殊的名稱來存儲標示符。經過這種方法,別的程序(一樣使用了OpenUDID)知道去什麼地方獲取已經生成的標示符(而不用再生成一個新的)。

 

以前已經提到過,在未來,蘋果將開始強制使用advertisingIdentifier 或identifierForVendor。若是這一天到來的話,即便OpenUDID看起來是很是不錯的選擇,可是你可能不得不過渡到蘋果推出的方法。

示例: 0d943976b24c85900c764dd9f75ce054dc5986ff

相關文章
相關標籤/搜索