對(duì)于 App 云平臺(tái)系統(tǒng)耐齐,如何唯一地識(shí)別移動(dòng)設(shè)備是非常重要的。否則滞项,每次用戶在設(shè)備上卸載掉應(yīng)用再重新安裝狈惫,后端系統(tǒng)只能把這個(gè)用戶當(dāng)作一個(gè)全新的用戶了睛蛛。
Android 上識(shí)別設(shè)備的唯一性,因?yàn)檫@個(gè)圈太亂胧谈,所以設(shè)備本身的任何標(biāo)識(shí)都是無(wú)法直接用作設(shè)備唯一標(biāo)識(shí)的忆肾。iOS 是系統(tǒng)強(qiáng)力限制被唯一識(shí)別的,目前唯一可以部分滿足條件是 IDFA菱肖,但需要你的 App 本身的確嵌入了廣告客冈。
很多開發(fā)者使用極光推送時(shí),都有這個(gè)疑問(wèn):極光推送是如何來(lái)做設(shè)備的唯一性識(shí)別的稳强。本文解析極光推送如何盡可能地來(lái)識(shí)別設(shè)備唯一场仲。
極光推送對(duì)安裝在設(shè)備上的 App 使用 RegistrationID 作為標(biāo)識(shí)和悦。極光推送要『盡可能』確保設(shè)備的唯一性,就是要使得 RegistrationID 盡可能唯一渠缕。
RegistrationID 的定義
關(guān)于 RegistrationID 極光官方文檔有如下的定義:
集成了 JPush SDK 的應(yīng)用程序在第一次 App 啟動(dòng)后鸽素,成功注冊(cè)到 JPush 服務(wù)器時(shí),JPush 服務(wù)器會(huì)給客戶端返回唯一的該設(shè)備的標(biāo)識(shí) - RegistrationID亦鳞。JPush SDK 會(huì)以廣播的形式發(fā)送 RegistrationID 到應(yīng)用程序馍忽。
有了這個(gè)標(biāo)識(shí),App 編程可以把這個(gè) RegistrationID 保存到自己的應(yīng)用服務(wù)器上蚜迅,然后就可以根據(jù) RegistrationID 來(lái)向設(shè)備推送消息或者通知舵匾。
RegistrationID 變化可能性
如果 App 不卸載俊抵,是直接覆蓋安裝谁不,Android, iOS 上 RegistrationID 的值都不會(huì)變化。
如果 App 是卸載之后再次安裝:
- Android 上 RegistrationID 基本不會(huì)變徽诲;
- iOS 上如果啟用了 IDFA 變化可能性不大刹帕,如果未啟用 IDFA 則每次安裝 RegistrationID 都會(huì)變;
RegistrationID 生成規(guī)則解析
Android 平臺(tái)
Android 上因?yàn)閲?guó)內(nèi)存在大量山寨設(shè)備的原因谎替,正常的 IMEI, Mac Address, AndroidID 這些可以考慮用作唯一標(biāo)識(shí)的值偷溺,都是不可以用的,因?yàn)檫@些值在一批設(shè)備中可能都是同一個(gè)值钱贯。
極光的基本思路是:
- 生成一個(gè) DeviceID 保存到 Settings, External Storage挫掏。依賴本地存儲(chǔ),應(yīng)用被卸載后重新安裝這些存儲(chǔ)里的 DeviceID 還在的話秩命,就是同一個(gè)設(shè)備尉共。這一條理論上解決 90% 的不變性問(wèn)題。
- DeviceID 之外增加補(bǔ)充規(guī)則:綜合根據(jù) IMEI, MAC Address, AndroidID 這幾個(gè)值來(lái)判斷弃锐,是否可能是老設(shè)備袄友。
具體的邏輯細(xì)節(jié),也是根據(jù)實(shí)際運(yùn)行情況霹菊,以及收集到的反饋不斷調(diào)整的剧蚣,大多數(shù)邏輯可在服務(wù)器端調(diào)整。
iOS平臺(tái)
鑒于 iOS 系統(tǒng)設(shè)計(jì)上限制設(shè)備唯一標(biāo)識(shí)旋廷,所以極光一直使用 Device Token 作為標(biāo)識(shí)鸠按,也因?yàn)闃O光推送本身就是需要 Device Token 這個(gè)值才可能運(yùn)作的。
iOS 9 版本之后饶碘,每次卸載后重裝都會(huì)導(dǎo)致 Device Token 變化待诅,所以對(duì)于極光后臺(tái)來(lái)說(shuō),都只能被識(shí)別為新用戶熊镣。
極光 SDK 新版本增加了 IDFA 選項(xiàng)卑雁,在集成初始化 SDK 時(shí)可選把 IDFA 這個(gè)值設(shè)置進(jìn)來(lái)募书,這樣極光后臺(tái)就優(yōu)先根據(jù) IDFA 值來(lái)識(shí)別用戶,從有一定的可能性應(yīng)用被卸載后重裝還能識(shí)別回老設(shè)備测蹲。
IDFA 是廣告標(biāo)識(shí)符莹捡,是 iOS 專門為廣告跟蹤唯一地識(shí)別用戶而設(shè)計(jì)的。在 iOS 設(shè)備上扣甲,設(shè)備 -> 隱私 -> 廣告這個(gè)頁(yè)面篮赢,有一個(gè)設(shè)置項(xiàng):限制廣告跟蹤。默認(rèn)是未選中狀態(tài)的琉挖,即是關(guān)閉狀態(tài)启泣,是不限制的。用戶可以選中示辈,從而限制廣告跟蹤寥茫。設(shè)置項(xiàng)之外還有一個(gè)按鈕:還原廣告標(biāo)識(shí)符...。如果用戶點(diǎn)擊了這個(gè)按鈕矾麻,則 IDFA 值會(huì)變化纱耻。
默認(rèn)的情況下,沒(méi)有限制廣告跟蹤险耀,可以取到 IDFA 這個(gè)值弄喘。并且用戶未點(diǎn)擊『還原廣告標(biāo)識(shí)』時(shí),這個(gè)值是不會(huì)變的甩牺。這樣就達(dá)到了唯一地標(biāo)識(shí)設(shè)備蘑志、跟蹤到用戶的目標(biāo)。
但是贬派,但是急但,請(qǐng)一定留意,IDFA 并不是一定可以啟用的赠群,是需要你的 App 的確有廣告功能才可以用的羊始,否則 Apple 在上架審核時(shí)有可能發(fā)現(xiàn)從而拒絕上架。
關(guān)于蘋果 App 上架對(duì) IDFA 的要求查描,可參考這里的說(shuō)明:The Advertising Identifier (IDFA)
高級(jí)使用建議
因?yàn)?RegistrationID 是 JPush SDK 注冊(cè)完成之后才得到的突委,所以調(diào)用 SDK API 來(lái)獲取 RegistrationID 的值時(shí)需要稍注意,不是總能夠立即得到冬三。
比如 iOS 上建議在監(jiān)聽(tīng)到 kJPFNetworkDidLoginNotification 這個(gè)通知后的代碼里匀油,來(lái)獲取 RegistrationID 的值。