平時(shí)大家喜歡把各種標(biāo)識(shí)符都稱為 Device ID照藻,面對(duì)各種各樣的標(biāo)識(shí)符我也是一頭霧水袜啃,覺得有必要梳理一下。不管這些標(biāo)識(shí)符叫什么名字幸缕,出于保護(hù)用戶隱私的考慮群发, Apple 不會(huì)允許開發(fā)者來(lái)定位用戶的設(shè)備,只允許開發(fā)者來(lái)對(duì) App 進(jìn)行定位发乔。
IMEI
IMEI(International Mobile Equipment Identity):國(guó)際移動(dòng)設(shè)備身份碼熟妓,在手機(jī)組裝完成后賦予的一個(gè)全球唯一的號(hào)碼,由于此時(shí) iPhone 只支持單卡栏尚,所以 IMEI 和 iPhone 是一一對(duì)應(yīng)的起愈。
iOS 2 提供了一種方法獲取 IMEI,但是為了保護(hù)用戶隱私译仗,iOS 5 以后蘋果不再允許獲取 IMEI 了抬虽,如果你在應(yīng)用中獲取 IMEI,可能會(huì)遭到 Apple Store 的拒絕纵菌。
IDFA
IDFA(Identifier for Identifier)阐污,即廣告標(biāo)識(shí)符,多用于用戶的廣告追蹤咱圆,是每臺(tái)設(shè)備的唯一 ID笛辟,IDFA 存儲(chǔ)在用戶的系統(tǒng)上。Apple 是不允許開發(fā)者追蹤用戶設(shè)備的序苏,但是為了監(jiān)控廣告效果手幢,在 iOS 6 中提供這個(gè)折中方案,但 IDFA 也會(huì)發(fā)生變化忱详,比如重置系統(tǒng)围来、還原廣告標(biāo)識(shí)符等。同時(shí)匈睁,用戶也可以選擇是否禁止廣告追蹤(即商家沒辦法根據(jù)用戶的行為偏好推送廣告)管钳。
UDID
UDID(Unique Device Identifier):蘋果 iOS 設(shè)備的唯一識(shí)別碼,在 iOS 6(2013 年 5 月 ) 以后被 Apple 禁止软舌。
Mac 地址
Mac(Medium/Media Access Control):網(wǎng)絡(luò)設(shè)備的物理地址,如果 IMEI 被認(rèn)為是設(shè)備的唯一標(biāo)識(shí)牛曹,那么 Mac 就是網(wǎng)絡(luò)接口唯一標(biāo)識(shí)佛点。學(xué)過計(jì)算機(jī)網(wǎng)絡(luò)都知道,在根據(jù) IP 進(jìn)行物理尋址的時(shí)候就是使用的 Mac 地址。
同樣由于隱私問題超营,在 iOS 7 之后無(wú)法通過 Mac 地址來(lái)標(biāo)識(shí)唯一設(shè)備鸳玩,因?yàn)樵?iOS 7 之后獲取到的 Mac 地址為一固定值。
中期總結(jié)
開發(fā)者們想盡辦法想要追蹤用戶設(shè)備演闭,但是 Apple 明令禁止不跟,經(jīng)過雙方的博弈,最終 IDFA 一統(tǒng)天下米碰。下面這圖來(lái)源于網(wǎng)絡(luò)今妄,很明了的闡述了 Device ID 的演進(jìn)史暇屋。
NSUUID
UUID(Universally Unique IDentifier):通用唯一識(shí)別碼
NSUUID 與之前的 CFUUID 是一致的,只是改成了 Objective-C 的接口而已,NSUUID 每次獲取的值都會(huì)發(fā)生變化鹤耍,但是它會(huì)保持唯一性。
NSString *uuid = [[NSUUID UUID] UUIDString];
IDFV
IDFV(identifierForVendor):Vendor 標(biāo)示符释涛,也被稱為廠商標(biāo)識(shí)符亭畜。只要用戶的設(shè)備中沒有卸載當(dāng)前 Vendor 的所有 APP,則不會(huì)發(fā)生變化锣枝。什么是 Vendor 厢拭?可以理解成 bundleID 的前兩部分,例如對(duì)于 com.joy.app_1 和 com.joy.app_2 這兩個(gè) bundleID 來(lái)說(shuō)撇叁,就屬于同一個(gè) Vendor 供鸠,共享同一個(gè) IDFV。
NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
IDFV 比較適合追蹤用戶行為税朴,目前多配合 Keychain 來(lái)搭配使用回季,來(lái)保證不管是否卸載重裝,IDFV 都是不變的正林。
LC_UUID
其實(shí)這個(gè)和 Device ID 沒什么關(guān)系泡一,但是因?yàn)橐步?UUID,防止造成誤解觅廓,所以來(lái)解釋下鼻忠。LC_UUID 可以這么理解,是用來(lái)標(biāo)示 Mach-O 的杈绸,你如果去查看你 APP 的崩潰日志帖蔓,你會(huì)發(fā)現(xiàn)應(yīng)用的可執(zhí)行程序和各種庫(kù)都有自己的 UUID,你在進(jìn)行符號(hào)解析的時(shí)候瞳脓,就需要找到與系統(tǒng)庫(kù)和你 APP 的 UUID 相同的符號(hào)文件來(lái)進(jìn)行堆棧地址還原塑娇。下面列舉的最后一列是庫(kù)或者 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>
結(jié)論
2017 年的我們想要通過 UDID劫侧、Mac 地址埋酬、OpenUDID 來(lái)定位用戶設(shè)備已經(jīng)是不可能啦哨啃,因?yàn)樗鼈円词菬o(wú)效,要么是受到了 App Store 的限制写妥。但是如果你想要追蹤廣告的話拳球,可以使用 IDFA,想要用來(lái)分析用戶行為可以使用 IDFV + KeyChain 來(lái)解決珍特。
同時(shí)那么多標(biāo)識(shí)符都被叫做 UUID祝峻,其實(shí)它們作用各不相同,或許叫它們 NSUUID扎筒、IDFV莱找、LC_UUID 更容易讓大家理解吧!