對于 App 云平臺系統(tǒng),如何唯一地識別移動設(shè)備是非常重要的。否則,每次用戶在設(shè)備上卸載掉應(yīng)用再重新安裝,后端系統(tǒng)只能把這個(gè)用戶當(dāng)作一個(gè)全新的用戶了。
Android 上識別設(shè)備的唯一性,因?yàn)檫@個(gè)圈太亂,所以設(shè)備本身的任何標(biāo)識都是無法直接用作設(shè)備唯一標(biāo)識的。iOS 是系統(tǒng)強(qiáng)力限制被唯一識別的,目前唯一可以部分滿足條件是 IDFA,但需要你的 App 本身的確嵌入了廣告。
很多開發(fā)者使用極光推送時(shí),都有這個(gè)疑問:極光推送是如何來做設(shè)備的唯一性識別的。本文解析極光推送如何盡可能地來識別設(shè)備唯一。
極光推送對安裝在設(shè)備上的 App 使用 RegistrationID 作為標(biāo)識。極光推送要『盡可能』確保設(shè)備的唯一性,就是要使得 RegistrationID 盡可能唯一。
RegistrationID 的定義
關(guān)于 RegistrationID 極光官方文檔有如下的定義:
集成了 JPush SDK 的應(yīng)用程序在第一次 App 啟動后,成功注冊到 JPush 服務(wù)器時(shí),JPush 服務(wù)器會給客戶端返回唯一的該設(shè)備的標(biāo)識 - RegistrationID。JPush SDK 會以廣播的形式發(fā)送 RegistrationID 到應(yīng)用程序。
有了這個(gè)標(biāo)識,App 編程可以把這個(gè) RegistrationID 保存到自己的應(yīng)用服務(wù)器上,然后就可以根據(jù) RegistrationID 來向設(shè)備推送消息或者通知。
RegistrationID 變化可能性
如果 App 不卸載,是直接覆蓋安裝,Android, iOS 上 RegistrationID 的值都不會變化。
如果 App 是卸載之后再次安裝:
- Android 上 RegistrationID 基本不會變;
- iOS 上如果啟用了 IDFA 變化可能性不大,如果未啟用 IDFA 則每次安裝 RegistrationID 都會變;
RegistrationID 生成規(guī)則解析
Android 平臺
Android 上因?yàn)閲鴥?nèi)存在大量山寨設(shè)備的原因,正常的 IMEI, Mac Address, AndroidID 這些可以考慮用作唯一標(biāo)識的值,都是不可以用的,因?yàn)檫@些值在一批設(shè)備中可能都是同一個(gè)值。
極光的基本思路是:
- 生成一個(gè) DeviceID 保存到 Settings, External Storage。依賴本地存儲,應(yīng)用被卸載后重新安裝這些存儲里的 DeviceID 還在的話,就是同一個(gè)設(shè)備。這一條理論上解決 90% 的不變性問題。
- DeviceID 之外增加補(bǔ)充規(guī)則:綜合根據(jù) IMEI, MAC Address, AndroidID 這幾個(gè)值來判斷,是否可能是老設(shè)備。
具體的邏輯細(xì)節(jié),也是根據(jù)實(shí)際運(yùn)行情況,以及收集到的反饋不斷調(diào)整的,大多數(shù)邏輯可在服務(wù)器端調(diào)整。
iOS平臺
鑒于 iOS 系統(tǒng)設(shè)計(jì)上限制設(shè)備唯一標(biāo)識,所以極光一直使用 Device Token 作為標(biāo)識,也因?yàn)闃O光推送本身就是需要 Device Token 這個(gè)值才可能運(yùn)作的。
iOS 9 版本之后,每次卸載后重裝都會導(dǎo)致 Device Token 變化,所以對于極光后臺來說,都只能被識別為新用戶。
極光 SDK 新版本增加了 IDFA 選項(xiàng),在集成初始化 SDK 時(shí)可選把 IDFA 這個(gè)值設(shè)置進(jìn)來,這樣極光后臺就優(yōu)先根據(jù) IDFA 值來識別用戶,從有一定的可能性應(yīng)用被卸載后重裝還能識別回老設(shè)備。
IDFA 是廣告標(biāo)識符,是 iOS 專門為廣告跟蹤唯一地識別用戶而設(shè)計(jì)的。在 iOS 設(shè)備上,設(shè)備 -> 隱私 -> 廣告這個(gè)頁面,有一個(gè)設(shè)置項(xiàng):限制廣告跟蹤。默認(rèn)是未選中狀態(tài)的,即是關(guān)閉狀態(tài),是不限制的。用戶可以選中,從而限制廣告跟蹤。設(shè)置項(xiàng)之外還有一個(gè)按鈕:還原廣告標(biāo)識符...。如果用戶點(diǎn)擊了這個(gè)按鈕,則 IDFA 值會變化。
默認(rèn)的情況下,沒有限制廣告跟蹤,可以取到 IDFA 這個(gè)值。并且用戶未點(diǎn)擊『還原廣告標(biāo)識』時(shí),這個(gè)值是不會變的。這樣就達(dá)到了唯一地標(biāo)識設(shè)備、跟蹤到用戶的目標(biāo)。
但是,但是,請一定留意,IDFA 并不是一定可以啟用的,是需要你的 App 的確有廣告功能才可以用的,否則 Apple 在上架審核時(shí)有可能發(fā)現(xiàn)從而拒絕上架。
關(guān)于蘋果 App 上架對 IDFA 的要求,可參考這里的說明:The Advertising Identifier (IDFA)
高級使用建議
因?yàn)?RegistrationID 是 JPush SDK 注冊完成之后才得到的,所以調(diào)用 SDK API 來獲取 RegistrationID 的值時(shí)需要稍注意,不是總能夠立即得到。
比如 iOS 上建議在監(jiān)聽到 kJPFNetworkDidLoginNotification 這個(gè)通知后的代碼里,來獲取 RegistrationID 的值。