文 | zhonglv
來源|微信公眾號 搜狗測試 SogouQA
前 言逛淘寶時如果你搜索了某個品牌的某款鞋子,它接下來就會給你推送該品牌的其他款鞋子或者其他品牌的類似鞋款,類似的廣告你一定收到過很多,那麼廣告商是如何對你的設備精準投放你感興趣的內容?手機上有不同的APP,搜狗地圖APP的推送為何沒有推送到搜狗錄音助手APP上呢?如何保證能精準推送到你的設備,且不同APP之間不會錯亂?
問題明確下就是開發是如何追蹤定位到具體的設備和APP呢?這就需要對設備和APP進行唯一標識來進行區分,在此對各種標識符的標識內容和作用進行梳理~
常見的設備ID標識符IMEI(International Mobile Equipment Identity):國際行動裝置身份碼,在iOS5之後該方法就被廢棄掉了,因此iOS 5以後不能獲取手機IMEI,但是也是可以通過私有API獲取手機的IMEI號的,但是通過蘋果私有API獲取IMEI號,上架蘋果商店會被拒掉的。電信運營商因為通訊網絡協議中都是傳遞用戶手機的IMEI及SIM卡的IMSI,所以運營商是有這些用戶的IMEI及IMSI的。Mac(Medium/Media Access Control):網絡設備的物理地址,如果 IMEI 被認為是設備的唯一標識,那麼 Mac 就是網絡接口唯一標識。學過計算機網絡都知道,在根據 IP 進行物理尋址的時候就是使用的 Mac 地址。MAC地址在網絡上用來區分設備的唯一性,接入網絡的設備都有一個MAC地址,他們肯定都是不同的,是唯一的。一部iPhone上可能有多個MAC地址,包括WIFI的、SIM的等,但是iTouch和iPad上就有一個WIFI的,因此只需獲取WIFI的MAC地址就好了,也就是en0的地址。MAC地址就如同我們身份證上的身份證號碼,具有全球唯一性。同樣由於隱私問題,在 iOS 7 之後無法通過 Mac 地址來標識唯一設備,因為在 iOS 7 之後獲取到的 Mac 地址為一固定值。廢棄版本:iOS7.0+(當然App有一些特殊的方法,例如主動提示用戶選擇WIFI網絡的方式可以獲取MAC地址)。UDID的全稱是UniqueDevice Identifier,顧名思義,它就是蘋果IOS設備的唯一識別碼,它由40個字符的字母和數字組成。在很多需要限制一臺設備一個帳號的應用中經常會用到。在iOS5中可以獲取到設備的UDID,iOS7中已經完全的禁用了它。iOS7之前的使用了的app如果在iOS7上運行,它不會返回設備的UDID,而是會返回一串字符串,以FFFFFFFF開頭,跟著identifierForVendor的十六進位值。UDID可以關聯其它各種數據到相關設備上。例如,連接到開發者帳號,可以允許在發布前讓設備安裝或測試應用;也可以讓開發者獲得iOS測試版進行體驗。apple用UDID連接到apple ID,這些設備可以自動下載和安裝從App Store購買的應用、保存從iTunes購買的音樂、幫助apple發送推送通知、即時消息。在iOS應用早期,UDID被第三方應用開發者和網絡廣告商用來收集用戶數據,可以用來關聯地址、記錄應用使用習慣等等以便推送精準廣告。開發者把UDID跟用戶的真實姓名、密碼、住址、其它數據關聯起來;網絡窺探者會從多個應用收集這些數據,然後順藤摸瓜得到這個人的許多隱私數據。同時大部分應用確實在頻繁傳輸UDID和私人信息。為了避免集體訴訟,蘋果最終決定在iOS 5的時候,將這一慣例廢除,開發者被引導生成一個唯一的標識符,只能檢測應用程式,其他的信息不提供。現在應用試圖獲取UDID已被禁止且不允許上架。Universally Unique Identifier,通用唯一標識符。UUID是指在一臺機器上生成的數字,它是根據時間變化的。一個32位的十六進位序列,使用小橫線來連接。目前最廣泛應用的UUID,是微軟公司的全局唯一標識符GUID。其目的是讓分布式系統中的所有元素,都能有唯一的辨識信息,而不需要通過中央控制端來做辨識信息的指定。UUID是基於iOS設備上面某個單個的應用程式,只要用戶沒有完全刪除應用程式,則這個UUID在用戶使用該應用程式的時候一直保持不變。如果用戶刪除了這個應用程式,然後再重新安裝,那麼這個UUID已經發生了改變。用戶刪除了你開發的程序以後,基本上你就不可能獲取之前的數據了。目前的解決方法是,通過UUID,寫入到鑰匙串中,從而獲得自定義的UDID(非系統原生),即使用戶重裝APP,只要每次都取這個鑰匙串返回,就是不變的。適用iOS6.0+,格式如26EA83F9-F510-4A08-BA4C-0CD431922D9C。Identifier For Vendor(應用開發商標識符),是給Vender標識用戶用的,每個設備在所屬同一個Vender的應用裡,都有相同的值。其中的Vender是指應用提供商,但準確點說,是通過BundleID的DNS反轉的前兩部分進行匹配,如果相同就是同一個Vender。例如對於com.somecompany.appone,com.somecompany.apptwo這兩個BundleID來說,就屬於同一個Vender,共享同一個idfv的值。和idfa不同的是,idfv的值是一定能取到的,所以非常適合於作為內部用戶行為分析的主id,來標識用戶,替代OpenUDID。如果用戶將屬於此Vender的所有App卸載,則idfv的值會被重置,即再重裝此Vender的App,idfv的值和之前不同。Identifier For Advertising(廣告標識符),在同一個設備上的所有App都會取到相同的值,是蘋果專門給各廣告提供商用來追蹤用戶而設的。廣告標示符是由系統存儲著的。廣告標示符是由系統存儲著的。不過即使這是由系統存儲的,但是有幾種情況下,會重新生成廣告標示符。如果用戶完全重置系統((設置程序 ->通用 -> 還原 ->還原位置與隱私),這個廣告標示符會重新生成。另外如果用戶明確的還原廣告(設置程序->通用 -> 關於本機 ->廣告 ->還原廣告標示符),那麼廣告標示符也會重新生成。適用於對外,例如廣告推廣,換量等跨應用的用戶追蹤等。Device Id 是推送系統中設備的唯一標識,是長度為 32 位的數字和小寫字母的組合,在控制臺或通過 OpenAPI 推送時,可以指定終端推送,即通過指定終端的 deviceId 推送。Bundle ID (Bundle identifier)也叫 App ID或者應用ID,是每一個 iOS應用的唯一標識,就像一個人的身份證號碼,申請iOS證書、打包 ipa 和在 itunesconnect 創建 App 都要用到 App ID, 整個 App 上架流程就是靠這個 App ID 關聯在一起。每開發一個新應用,首先都需要先去創建一個 Bundle ID。Bundle ID分為兩種:Explicit App ID(明確的APP ID),一般格式是:com.domainname.appname。這種id只能用在一個app上。每一個新應用都要創建一個;Wildcard App ID(通配符APP ID), 一般格式是:com.domainname.*。這種id可以用在多個應用上,雖然方便,但是使用這種id的應用不能使用通知功能,所以並不常用。在Android系統中,判斷一個 App 的唯一標識是Package name,與iOS 的 Bundle ID是對應的。Bundle ID格式:由於蘋果和谷歌的原因,同一個應用的 android packageName 和 iOS Bundle ID 不同,比如,微信:iOS Bundle ID 是com.tencent.xin;Android packageName 是com.tencent.mm;Device token是APNs( Apple Push Notification service,蘋果推送服務)用於區分識別每個iOS設備和設備上不同app的一個標識符,通過設備和APNs伺服器建立的長連接後,通過註冊推送服務,由APNs生成後加密反饋給app的。還可以用於APNs通過它將推送消息路由到指定設備上。也就說是從信息量上看:device token = device id + bundle id。
總 結以上列出了各種常見的標註設備或者用戶的標識符,簡單總結如下:1)IMEI:國際行動裝置身份碼,廢棄版本:iOS5.0+;2)MAC地址:網絡設備的物理地址,在網絡上用來區分設備的唯一性,廢棄版本:iOS7.0+;3)UDID:蘋果IOS設備的唯一識別碼,廢棄版本:iOS6.0+;
4)UUID:通用唯一標識符,可以通過UUID寫入到鑰匙串中,從而獲得自定義的UDID(非系統原生),即使用戶重裝APP,只要每次都取這個鑰匙串返回,就是不變的。5)IDFV:應用開發商標識符,每個設備在所屬同一個Vender的應用裡,都有相同的值,適用於iOS6.0+;6)IDFA:廣告標識符,由系統存儲,蘋果專門給各廣告提供商用來追蹤用戶而設的,可能發生變化,如系統重置、在設置裡還原廣告標識符。用戶可以在設置裡打開「限制廣告跟蹤」,適用於iOS6.0+;7)Device ID:是推送系統中設備的唯一標識;8)Bundle ID:每一個iOS應用的唯一標識;9)Device token:用於區分識別每個iOS設備和設備上不同app的一個標識符;以上各種設備ID標識符是目前移動應用開發過程中比較常見的,在不同公司、不同開發可能對同一個ID的釋義和實現方式有略微不同。出於保護用戶隱私的考慮,蘋果對各種設備和APP的定位有明確的限制,一旦超出限制APP在蘋果審核時就有被拒的風險。
👆單擊連結直達、長按諮詢吳老師或公眾號內回復「2」
無論上課或自學,
你首先需要準備:
每天 2 小時+的學習時間,
每天堅持寫代碼的習慣!
有投入才有產出,
10k+的漲幅需要 1 年以上的努力!
祝你成功!
光榮之路出品
測試大佬和小白的故事
招聘QQ群:203715128