对于app云平台系统,如何唯一地识别移动设备是非常重要的。否则每次用户在设备上卸载掉应用再重新安装,后端系统只能把这个用户当作一个全新的用户了。使用极光推送的开发者常常有这样一个问题:极光推送是如何来做设备的唯一性识别的。
android设备本身的任何标识都是无法直接用作设备唯一标识的。ios是系统强力限制被唯一识别的,目前唯一可以部分满足条件是idfa,但需要你的app本身的确嵌入了广告。本文将解析极光推送如何尽可能地来唯一识别设备。
极光推送对安装在设备上的app使用registrationid作为标识。极光推送要『尽可能』确保设备的唯一性,就是要使得registrationid尽可能唯一。
registrationid的定义
关于registrationid极光官方文档有如下的定义:
集成了jpushsdk的应用程序在第一次app启动后,成功注册到jpush服务器时,jpush服务器会给客户端返回唯一的该设备的标识–registrationid。jpushsdk会以广播的形式发送registrationid到应用程序。
有了这个标识,app编程可以把这个registrationid保存到自己的应用服务器上,然后就可以根据registrationid来向设备推送消息或者通知。
registrationid变化可能性
如果app不卸载,是直接覆盖安装,android,ios上registrationid的值都不会变化。
如果app是卸载之后再次安装:
1android上registrationid基本不会变;
2ios上如果启用了idfa变化可能性不大,如果未启用idfa则每次安装registrationid都会变;
registrationid生成规则解析
android平台
android上因为国内存在大量山寨设备的原因,正常的imei,macaddress,androidid这些可以考虑用作唯一标识的值,都是不可以用的,因为这些值在一批设备中可能都是同一个值。
极光的基本思路是:
1.生成一个deviceid保存到settings,externalstorage。依赖本地存储,应用被卸载后重新安装这些存储里的deviceid还在的话,就是同一个设备。这一条理论上解决90%的不变性问题。
2.deviceid之外增加补充规则:综合根据imei,macaddress,androidid这几个值来判断,是否可能是老设备。
具体的逻辑细节,也是根据实际运行情况,以及收集到的反馈不断调整的,大多数逻辑可在服务器端调整。
ios平台
鉴于ios系统设计上限制设备唯一标识,所以极光一直使用devicetoken作为标识,也因为极光推送本身就是需要devicetoken这个值才可能运作的。
ios9版本之后,每次卸载后重装都会导致devicetoken变化,所以对于极光后台来说,都只能被识别为新用户。
极光sdk新版本增加了idfa选项,在集成初始化sdk时可选把idfa这个值设置进来,这样极光后台就优先根据idfa值来识别用户,从有一定的可能性应用被卸载后重装还能识别回老设备。
idfa是广告标识符,是ios专门为广告跟踪唯一地识别用户而设计的。在ios设备上,设备->隐私->广告这个页面,有一个设置项:限制广告跟踪。默认是未选中状态的,即是关闭状态,是不限制的。用户可以选中,从而限制广告跟踪。设置项之外还有一个按钮:还原广告标识符…。如果用户点击了这个按钮,则idfa值会变化。
默认的情况下,没有限制广告跟踪,可以取到idfa这个值。并且用户未点击『还原广告标识』时,这个值是不会变的。这样就达到了唯一地标识设备、跟踪到用户的目标。
但是,但是,请一定留意,idfa并不是一定可以启用的,是需要你的app的确有广告功能才可以用的,否则apple在上架审核时有可能发现从而拒绝上架。
关于苹果app上架对idfa的要求,可参考这里的说明:theadvertisingidentifier(idfa)
高级使用建议
因为registrationid是jpushsdk注册完成之后才得到的,所以调用sdkapi来获取registrationid的值时需要稍注意,不是总能够立即得到。
比如ios上建议在监听到kjpfnetworkdidloginnotification这个通知后的代码里,来获取registrationid的值。
相关新闻
2016-04-19
2017-01-17
2017-04-13
2017-06-02
2017-07-06