移動端裝置唯一ID的生成規則

CNHK19發表於2024-10-15

對於 App 雲平臺系統,如何唯一地識別移動裝置是非常重要的。否則,每次使用者在裝置上解除安裝掉應用再重新安裝,後端系統只能把這個使用者當作一個全新的使用者了。

Android 上識別裝置的唯一性,因為這個圈太亂,所以裝置本身的任何標識都是無法直接用作裝置唯一標識的。iOS 是系統強力限制被唯一識別的,目前唯一可以部分滿足條件是 IDFA,但需要你的 App 本身的確嵌入了廣告。

很多開發者使用極光推送時,都有這個疑問:極光推送是如何來做裝置的唯一性識別的。本文解析極光推送如何儘可能地來唯一識別裝置。

極光推送對安裝在裝置上的 App 使用 RegistrationID 作為標識。極光推送要『儘可能』確保裝置的唯一性,就是要使得 RegistrationID 儘可能唯一。

RegistrationID 的定義

關於 RegistrationID 極光官方文件有如下的定義:

整合了 JPush SDK 的應用程式在第一次 App 啟動後,成功註冊到 JPush 伺服器時,JPush 伺服器會給客戶端返回唯一的該裝置的標識 - RegistrationID。JPush SDK 會以廣播的形式傳送 RegistrationID 到應用程式。
有了這個標識,App 程式設計可以把這個 RegistrationID 儲存到自己的應用伺服器上,然後就可以根據 RegistrationID 來向裝置推送訊息或者通知。

RegistrationID 變化可能性

如果 App 不解除安裝,是直接覆蓋安裝,Android, iOS 上 RegistrationID 的值都不會變化。

如果 App 是解除安裝之後再次安裝:

Android 上 RegistrationID 基本不會變;
iOS 上如果啟用了 IDFA 變化可能性不大,如果未啟用 IDFA 則每次安裝 RegistrationID 都會變;

RegistrationID 生成規則解析

Android 平臺

Android 上因為國記憶體在大量山寨裝置的原因,正常的 IMEI, Mac Address, AndroidID 這些可以考慮用作唯一標識的值,都是不可以用的,因為這些值在一批裝置中可能都是同一個值。

極光的基本思路是:

生成一個 DeviceID 儲存到 Settings, External Storage。依賴本地儲存,應用被解除安裝後重新安裝這些儲存裡的 DeviceID 還在的話,就是同一個裝置。這一條理論上解決 90% 的不變性問題。
DeviceID 之外增加補充規則:綜合根據 IMEI, MAC Address, AndroidID, Serial_Number 這幾個值來判斷,是否可能是老裝置。
具體的邏輯細節,也是根據實際執行情況,以及收集到的反饋不斷調整的,大多數邏輯可在伺服器端調整。

iOS平臺

鑑於 iOS 系統設計上限制裝置唯一標識,所以極光一直使用 Device Token 作為標識,也因為極光推送本身就是需要 Device Token 這個值才可能運作的。

iOS 9 版本之後,每次解除安裝後重灌都會導致 Device Token 變化,所以對於極光後臺來說,都只能被識別為新使用者。

極光 SDK 新版本增加了 IDFA 選項,在整合初始化 SDK 時可選把 IDFA 這個值設定進來,這樣極光後臺就優先根據 IDFA 值來識別使用者,從有一定的可能性應用被解除安裝後重灌還能識別回老裝置。

IDFA 是廣告識別符號,是 iOS 專門為廣告跟蹤唯一地識別使用者而設計的。在 iOS 裝置上,裝置 -> 隱私 -> 廣告這個頁面,有一個設定項:限制廣告跟蹤。預設是未選中狀態的,即是關閉狀態,是不限制的。使用者可以選中,從而限制廣告跟蹤。設定項之外還有一個按鈕:還原廣告識別符號...。如果使用者點選了這個按鈕,則 IDFA 值會變化。
移動端裝置唯一ID的生成規則

預設的情況下,沒有限制廣告跟蹤,可以取到 IDFA 這個值。並且使用者未點選『還原廣告標識』時,這個值是不會變的。這樣就達到了唯一地標識裝置、跟蹤到使用者的目標。

但是,但是,請一定留意,IDFA 並不是一定可以啟用的,是需要你的 App 的確有廣告功能才可以用的,否則 Apple 在上架稽核時有可能發現從而拒絕上架。

關於蘋果 App 上架對 IDFA 的要求,可參考這裡的說明:The Advertising Identifier (IDFA)

高階使用建議

因為 RegistrationID 是 JPush SDK 註冊完成之後才得到的,所以呼叫 SDK API 來獲取 RegistrationID 的值時需要稍注意,不是總能夠立即得到。

比如 iOS 上建議在監聽到 kJPFNetworkDidLoginNotification 這個通知後的程式碼裡,來獲取 RegistrationID 的值。

「JPush」裝置唯一標識 registrationID-極光社群 (jiguang.cn)

相關文章