iOS10 IDFA 獲取不到問題解決
中文說明文件
背景
advertisingIdentifier 的說明文件看到這樣一句話:
Important
In iOS 10.0 and later, the value of advertisingIdentifier is all zeroes when the user has limited ad tracking.
也就是說在iOS10上,使用者如果開啟了 限制廣告跟蹤
, 獲取的idfa將是一串 00000000-0000-0000-0000-000000000000
SimulateIDFA
SimulateIDFA
是根據一堆裝置資訊(每個app獲取的值都是一樣的)生成的一個MD5值。用於標誌不同裝置。
使用:
框架依賴:
- CoreTelephony.framework
- https://github.com/youmi/SimulateIDFA (下載程式碼)
匯入SimulateIDFA.h、SimulateIDFA.m
兩個檔案
在需要獲取 SimulateIDFA的地方呼叫程式碼:
NSString *simulateIDFA = [SimulateIDFA createSimulateIDFA];
simulateIDFA
的格式跟IDFA
的格式一樣
626363D0-90D4-06BF-C281-384E4E69D3E2
生成原理
生成的MD5值分兩部分。
以 626363D0-90D4-06BF-C281-384E4E69D3E2
為例:
前16位626363D0-90D4-06BF
是由比較穩定的引數組合獲得,這前16位只有在系統升級的情況下才會變。
後16位C281-384E4E69D3E2
由 一些比較容易被改變的引數組合生成,比較常見的值變化情況是系統重新啟動。
- 參與前16位計算的引數有:
系統版本(9.3.2)、硬體資訊(N53AP,iPhone6,2,中國移動46002,1048576000)、coreServices檔案建立更新時間(2015-08-07 23:53:00 +0000,2016-06-07 23:53:09 +0000),系統容量(12266725376)
這裡有一些資訊是升級的時候會變的,系統版本
、coreServices檔案建立更新時間
、系統容量
- 參與後16位計算的引數有:
系統開機時間(1473301191去掉後面的4位數 147330)、國家程式碼(CN)、本地語言(zh-Hans-CN)、裝置名稱(XXXX)
這裡的引數都是比較容易變化的,系統重啟離上次重啟有10000秒的話會變,其他引數在設定裡面可以修改
SimulateIDFA與OpenIDFA對比
OpenIDFA 是 Yann Lechelle的一個開源庫。同是IDFA的替換方案
生成的ID重複的概率對比
假設一個情況。一天內某個國家有10000000(1千萬)臺相同型號的裝置升級到同一個系統。
- SimulateIDFA
一天內這個演算法可能的值計算, 24x3600(檔案建立時間,單位秒)x 10(檔案最後修改時間假設誤差在10秒)x 10000000(系統容量誤差範圍)x 1000000(裝置名稱範圍,這裡假設的是每100臺就有2個重複)= 8640000000000000000。
裝置a的值為 K,那麼裝置b的值同為K的可能性為: 1/8640000000000000000. 總共有 10000000臺裝置。因此,這10000000裝置中有與a裝置的值同為K的可能性為 1/8640000000000000000 x 10000000 = 1/864000000000。
- OpenIDFA
先看一下OpenIDFA的生成演算法,OpenIDFA是對下面的引數組合進行MD5.
系統開機時間(1473241127 減去後四位值為 147324)、系統容量(29230571520)、系統版本(9.3.4)、機型(N78AP,iPod5,1)、國家程式碼(CN)、本地語言(zh-Hans-CN)、一些預裝的App(由於用的是canOpenURL這個介面,iOS9就已經廢了)、時區(Asia/Shanghai)、當天時間(160804, 16年8月4日,這個值是他每天值都會變化的原因)
一天內可能的值為系統容量的誤差(10000000)。 ps: 系統啟動時間在這種情況下對重複率的降低沒起到作用,因為OpenIDFA是減去了系統啟動時間的後4位來計算的。同理當天時間也是。
裝置a的值為 K,那麼裝置b的值同為K的可能性為: 1/10000000. 總共有 10000000臺裝置。因此,這10000000裝置中有與a裝置的值同為K的可能性為 1/10000000 x 10000000 = 1
時效性對比
- OpenIDFA
每天獲取的值都不一樣
- SimulateIDFA
SimulateIDFA分兩部分,前16位是在系統升級的時候才會變化,後16位使用者的某些行為可能會導致值變化(例如:重啟手機、修改裝置名稱、修改手機本地語言)
總結:
OpenIDFA
有一些限制,生成的IDFA會每天變化,在一些極端條件下重複率比較高。 SimulateIDFA在這方面有更好的表現
相關文章
- 通過nginx中轉獲取不到IP的問題解決Nginx
- 解決PHP Post獲取不到非表單資料的問題PHP
- 解決 Laravel JWT 多表認證時獲取不到當前認證使用者的問題LaravelJWT
- C#、IIS獲取時間帶星期問題解決C#
- WebApi和Mvc的Session一直獲取不到問題WebAPIMVCSession
- 當laravel獲取不到session的三種解決辦法LaravelSession
- win7DHCP獲取不到ip的解決辦法Win7
- 關於動態建立的DOM元素獲取不到的問題。
- 線上問題總結-獲取不到連線池(logback 配置+程式碼問題)
- SSL認證 request.getScheme() 獲取不到https的問題SchemeHTTP
- SpringBoot 解決打包釋出後讀取不到 json 檔案問題Spring BootJSON
- request 獲取不到 CookieCookie
- 解決視訊播放器找不到解碼器問題播放器
- 快取穿透問題與解決方法快取穿透
- iOS10升級常見問題彙總以及解決辦法iOS
- 解決HIbernate分頁問題獲取表總行數的小Bug
- 解決Android通過BitmapFactory獲取圖片寬高度相反的問題Android
- 解決「問題」,不要解決問題
- 解決Python找不到ssl模組問題 No module named _sslPython
- SpringBoot 專案打包後獲取不到resource下資源的解決Spring Boot
- 問題解決:嘗試解決maven依賴找不到的n種姿勢Maven
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 如何捕獲問題SQL解決過度CPU消耗問題 (zt)SQL
- 捕獲問題SQL解決過度CPU消耗問題-- 轉載SQL
- 快取常見問題及解決方案快取
- 快取三大問題及解決方案快取
- 完美解決ios10及以上Safari無法禁止縮放的問題iOS
- Node.js 解決Gzip下獲取真實的下載進度問題Node.js
- 排查 Kubernetes HPA 透過 Prometheus 獲取不到 http_requests 指標的問題PrometheusHTTP指標
- 程式碼解決快取穿透和快取雪崩問題快取穿透
- 獲取recycleView瀑布流模式下第一個完全顯示出來的View,解決獲取不准問題,坑點View模式
- 我們常常意識不到問題的存在,直到有人解決了這些問題
- 解決在IE中獲取資料的快取問題,執行環境為node.js快取Node.js
- 異常解決:idea Java 動態編譯失敗,獲取classpath屬性不正確問題解決IdeaJava編譯
- 怎麼能接聽來電?獲取不到不到元素
- 使用EasyUI,關於日期格式的文字框按照正常方式獲取不到值的問題UI
- SpringMVC中servletFileUpload.parseRequest(request)解析為空獲取不到資料問題SpringMVCServlet
- 使用magicAPI對接python 檔案,上傳引數獲取不到回參問題APIPython