平時大家喜歡把各種識別符號都稱為 Device ID,面對各種各樣的識別符號我也是一頭霧水,覺得有必要梳理一下。不管這些識別符號叫什麼名字,出於保護使用者隱私的考慮, Apple 不會允許開發者來定位使用者的裝置,只允許開發者來對 App 進行定位。
IMEI
IMEI(International Mobile Equipment Identity):國際移動裝置身份碼,在手機組裝完成後賦予的一個全球唯一的號碼,由於此時 iPhone 只支援單卡,所以 IMEI 和 iPhone 是一一對應的。
iOS 2 提供了一種方法獲取 IMEI,但是為了保護使用者隱私,iOS 5 以後蘋果不再允許獲取 IMEI 了,如果你在應用中獲取 IMEI,可能會遭到 Apple Store 的拒絕。
IDFA
IDFA(Identifier for Identifier),即廣告識別符號,多用於使用者的廣告追蹤,是每臺裝置的唯一 ID,IDFA 儲存在使用者的系統上。Apple 是不允許開發者追蹤使用者裝置的,但是為了監控廣告效果,在 iOS 6 中提供這個折中方案,但 IDFA 也會發生變化,比如重置系統、還原廣告識別符號等。同時,使用者也可以選擇是否禁止廣告追蹤(即商家沒辦法根據使用者的行為偏好推送廣告)。
UDID
UDID(Unique Device Identifier):蘋果 iOS 裝置的唯一識別碼,在 iOS 6(2013 年 5 月 ) 以後被 Apple 禁止。
Mac 地址
Mac(Medium/Media Access Control):網路裝置的實體地址,如果 IMEI 被認為是裝置的唯一標識,那麼 Mac 就是網路介面唯一標識。學過計算機網路都知道,在根據 IP 進行物理定址的時候就是使用的 Mac 地址。
同樣由於隱私問題,在 iOS 7 之後無法通過 Mac 地址來標識唯一裝置,因為在 iOS 7 之後獲取到的 Mac 地址為一固定值。
中期總結
開發者們想盡辦法想要追蹤使用者裝置,但是 Apple 明令禁止,經過雙方的博弈,最終 IDFA 一統天下。下面這圖來源於網路,很明瞭的闡述了 Device ID 的演進史。
NSUUID
UUID(Universally Unique IDentifier):通用唯一識別碼
NSUUID 與之前的 CFUUID 是一致的,只是改成了 Objective-C 的介面而已,NSUUID 每次獲取的值都會發生變化,但是它會保持唯一性。
NSString *uuid = [[NSUUID UUID] UUIDString];複製程式碼
IDFV
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 都是不變的。
LC_UUID
其實這個和 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 更容易讓大家理解吧!