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