平時你們喜歡把各類標識符都稱爲 Device ID,面對各類各樣的標識符我也是一頭霧水,以爲有必要梳理一下。無論這些標識符叫什麼名字,出於保護用戶隱私的考慮, Apple 不會容許開發者來定位用戶的設備,只容許開發者來對 App 進行定位。bash
IMEI(International Mobile Equipment Identity):國際移動設備身份碼,在手機組裝完成後賦予的一個全球惟一的號碼,因爲此時 iPhone 只支持單卡,因此 IMEI 和 iPhone 是一一對應的。網絡
iOS 2 提供了一種方法獲取 IMEI,可是爲了保護用戶隱私,iOS 5 之後蘋果再也不容許獲取 IMEI 了,若是你在應用中獲取 IMEI,可能會遭到 Apple Store 的拒絕。app
IDFA(Identifier for Identifier),即廣告標識符,多用於用戶的廣告追蹤,是每臺設備的惟一 ID,IDFA 存儲在用戶的系統上。Apple 是不容許開發者追蹤用戶設備的,可是爲了監控廣告效果,在 iOS 6 中提供這個折中方案,但 IDFA 也會發生變化,好比重置系統、還原廣告標識符等。同時,用戶也能夠選擇是否禁止廣告追蹤(即商家沒辦法根據用戶的行爲偏好推送廣告)。ide
UDID(Unique Device Identifier):蘋果 iOS 設備的惟一識別碼,在 iOS 6(2013 年 5 月 ) 之後被 Apple 禁止。ui
Mac(Medium/Media Access Control):網絡設備的物理地址,若是 IMEI 被認爲是設備的惟一標識,那麼 Mac 就是網絡接口惟一標識。學過計算機網絡都知道,在根據 IP 進行物理尋址的時候就是使用的 Mac 地址。spa
一樣因爲隱私問題,在 iOS 7 以後沒法經過 Mac 地址來標識惟一設備,由於在 iOS 7 以後獲取到的 Mac 地址爲一固定值。計算機網絡
開發者們想盡辦法想要追蹤用戶設備,可是 Apple 明令禁止,通過雙方的博弈,最終 IDFA 一統天下。下面這圖來源於網絡,很明瞭的闡述了 Device ID 的演進史。日誌
UUID(Universally Unique IDentifier):通用惟一識別碼code
NSUUID 與以前的 CFUUID 是一致的,只是改爲了 Objective-C 的接口而已,NSUUID 每次獲取的值都會發生變化,可是它會保持惟一性。cdn
NSString *uuid = [[NSUUID UUID] UUIDString];複製代碼
IDFV(identifierForVendor):Vendor 標示符,也被稱爲廠商標識符。只要用戶的設備中沒有卸載當前 Vendor 的全部 APP,則不會發生變化。什麼是 Vendor ?能夠理解成 bundleID 的前兩部分,例如對於 com.joy.app_1 和 com.joy.app_2 這兩個 bundleID 來講,就屬於同一個 Vendor ,共享同一個 IDFV。
NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];複製代碼
IDFV 比較適合追蹤用戶行爲,目前多配合 Keychain 來搭配使用,來保證無論是否卸載重裝,IDFV 都是不變的。
其實這個和 Device ID 沒什麼關係,可是由於也叫 UUID,防止形成誤解,因此來解釋下。LC_UUID 能夠這麼理解,是用來標示 Mach-O 的,你若是去查看你 APP 的崩潰日誌,你會發現應用的可執行程序和各類庫都有本身的 UUID,你在進行符號解析的時候,就須要找到與系統庫和你 APP 的 UUID 相同的符號文件來進行堆棧地址還原。下面列舉的最後一列是庫或者 APP 的 UUID。
Binary Images:
0x107170000 - 0x1071aafff +GYMonitorExample x86_64 <f625eb41ccfa3c0db9ed70c4c083b101>
0x10724b000 - 0x107252fff libBacktraceRecording.dylib x86_64 <ad76d9937807307a8eb90279ce79d84e>
0x107259000 - 0x107260fff libViewDebuggerSupport.dylib x86_64 <f5c61d2ba3ab311ba5495a71e4f67790>
0x107269000 - 0x107548fff Foundation x86_64 <61cd1144bb933571bdb39f9b56cecffe>
0x10779c000 - 0x107b6bfff libobjc.A.dylib x86_64 <5f0e622c86ec3969acfbcaaa10e21a31>複製代碼
2017 年的咱們想要經過 UDID、Mac 地址、OpenUDID 來定位用戶設備已是不可能啦,由於它們要麼是無效,要麼是受到了 App Store 的限制。可是若是你想要追蹤廣告的話,可使用 IDFA,想要用來分析用戶行爲可使用 IDFV + KeyChain 來解決。
同時那麼多標識符都被叫作 UUID,其實它們做用各不相同,或許叫它們 NSUUID、IDFV、LC_UUID 更容易讓你們理解吧!