iOS10 IDFA 獲取不到問題解決

Kaitiren發表於2016-09-17

中文說明文件


背景

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在這方面有更好的表現

相關文章