本文将从 registrationID 的定义、用途、获取方法、重复原因、变化原因几方面详细解读极光的唯一 ID。
一、详细定义
详细定义,registrationID 如何产生的?点我查看
有效的 RegistrationID 长度为 11 或 19 个字节,其中第一位有效字符 [0,1],第二位有效字符 [0-9a],第三位有效字符 [0-2],剩余位有效字符 [0-9a-f]。registrationID 只能在客户端集成后取到,不可以自行在服务端生成
二、用途
- 可用来辨别 Android & iOS 设备:从左数,第三位代表平台。
0 代表 Android
1 代表 iOS
推送时可以 使用 RegistrationID 进行一对一推送
在排查「消息收不到」问题时必须给官方人员提供的信息
服务端调用 API 给设备设置别名 / 标签需要传的值
因此我们建议开发者在客户端调用 API 获取到 registrationID 后上传到开发者服务器保存起来,以备使用。
三、如何获取
3.1 Android 设备
3.3.0 版本之前,在 Androidmanifest 中配置自定义广播接收器,在自定义的 Receiver 里监听 Action - cn.jpush.android.intent.REGISTRATION ,SDK 初次注册成功后,可以取到该值(该广播只有一次)。
3.3.0 版本之后,使用新的回调方式,监听 onRegister 回调(仅在安装 App 初始化 SDK 成功后回调一次)
注册成功后,通过函数 public static String getRegistrationID(Context context) 获取,可以多次调用获取。
3.2 iOS 设备
extern NSString * const kJPFNetworkDidRegisterNotification; // 注册成功
extern NSString *const kJPFNetworkFailedRegisterNotification; //注册失败
extern NSString * const kJPFNetworkDidLoginNotification; // 登录成功
在添加注册 kJPFNetworkDidLoginNotification 通知的方法里可以获取 ID
- 调用 [registrationIDCompletionHandler:] 方法,通过 completionHandler 获取
[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
NSLog(@"resCode : %d,registrationID: %@",resCode,registrationID);
}];
3.3 注意事项
registrationID 只有在初始化成功之后才能取到,初始化需要时间,所以不要在初始化之后马上调 API 获取。
如上说明,Android 与 iOS 在监听到相关广播、通知事件后代表初始化已成功,可以选择调用 API 去主动获取。
在某些插件中,如果无法把握初始化成功的时机,就多次调用 API 获取,直到获取成功为止。
四、为什么不同 Android 设备取到了相同的 ID
4.1 排查方案
检查设备的 IMEI 、 serial_number 、Mac 地址、device_id值是否相同
当 device_id,imei + mac,serial_number 这三个信息有任意一个是相同的时候,就会取到一样的 registrationID 值。
4.2 解决办法
使设备的 IMEI 、 serial_number 、device_id 均不相同(serial_number 是新版 SDK 版本新增的,请升级 SDK )
重烧 IMEI ,刷机或者进行如下步骤:
步骤一:把这个文件清掉:Environment.getExternalStorageDirectory().getPath() + “/data/.push_deviceid”;
步骤二:同步清除掉 setting 里面的,方法如下:Settings.System.putString(context.getContentResolver(), “devcie_id_generated”, “”);
步骤三:还有把缓存也清理下;
然后再重装 App。
第二步操作是系统方法,如果操作未果,则说明你使用的是自己的定制设备,导出你的数据库信息查看一下 device ID 信息,不要将该信息固定为同一个值。
如果上述方案无法解决,给官方提供如下信息,我们来分析下是否有别的方案处理
提供你的 registrationID、不同设备注册取到同一个 registrationID 的具体时间点
如果能取到 IMEI、serial_number 、Mac 地址、device_id 等值,有值一样,但由于定制系统等原因无法自己将值设为不一样时,则提供该值说明情况。
如果取不到这些值,请说明你的设备情况,如定制设备、电视盒子等等。
SDK 版本号(JPush 和 JCore)
五、为什么不同的 iOS 设备取到了相同的 ID
5.1 排查方案
检查给极光传递的 devicetoken 和 IDFA 值是否一样。一般直接从 iOS API 取到的值是不一样的,但可能你们自己固定给极光传了一样的值。
使用的 SDK 版本号是否过低
5.2 解决办法
直接使用官方提供的初始化代码,不要自定义传递 devicetoken 和 IDFA 值
升级 SDK 版本至 3.2.8 以上
如果上述方案无法解决,给官方提供如下信息,我们来分析下是否有别的方案处理
提供你的 registrationID、不同设备注册取到同一个 registrationID 的具体时间点
你自己取到的设备的 devicetoken 和 IDFA 值
SDK 版本号(JPush 和 JCore)
六、同一设备的 ID 值是否会产生变化
6.1 Android 设备
一般情况下同一个 Android 设备同一个 App 卸载重装后的 RegistrationID 是一样的,可能会产生变化的操作如下:
清除应用缓存
双卡双待的,更换卡槽
6.2 iOS 设备
- 卸载重装
iOS 9 及以下系统一般是不会改变的
iOS 9 以上系统,由于 Apple 在 App 卸载重装后,会给一个新的 token,所以对应的 RegistrationID 也会改变。
如果使用 IDFA 后再卸载重装,在 IDFA 不变的时候 registrationID 不会变化。
长时间关闭推送后又打开,也可能导致 token 变化。
如果对你有帮助,点个赞呗 ლ(╹◡╹ლ)
不吹不黑,关注「常见问题」专栏可以解决你 90% 的问题 (ノ◕ω◕)ノଘ_ଘ
如果还有你想知道的问题没有总结方案,来评论区跟我交流交流吖
1条评论