本文将从 registrationID 的定义、用途、获取方法、重复原因、变化原因几方面详细解读极光的唯一 ID。

一、详细定义

  1. 详细定义,registrationID 如何产生的?点我查看

  2. 有效的 RegistrationID 长度为 11 或 19 个字节,其中第一位有效字符 [0,1],第二位有效字符 [0-9a],第三位有效字符 [0-2],剩余位有效字符 [0-9a-f]。registrationID 只能在客户端集成后取到,不可以自行在服务端生成

二、用途

  1. 可用来辨别 Android & iOS 设备:从左数,第三位代表平台。
  • 0 代表 Android

  • 1 代表 iOS

  1. 推送时可以 使用 RegistrationID 进行一对一推送

  2. 在排查「消息收不到」问题时必须给官方人员提供的信息

  3. 服务端调用 API 给设备设置别名 / 标签需要传的值

因此我们建议开发者在客户端调用 API 获取到 registrationID 后上传到开发者服务器保存起来,以备使用。

三、如何获取

3.1 Android 设备

  1. 3.3.0 版本之前,在 Androidmanifest 中配置自定义广播接收器,在自定义的 Receiver 里监听 Action - cn.jpush.android.intent.REGISTRATION ,SDK 初次注册成功后,可以取到该值(该广播只有一次)。

  2. 3.3.0 版本之后,使用新的回调方式,监听 onRegister 回调(仅在安装 App 初始化 SDK 成功后回调一次)

  3. 注册成功后,通过函数 public static String getRegistrationID(Context context) 获取,可以多次调用获取。

3.2 iOS 设备

  1. 监听通知事件

extern NSString * const kJPFNetworkDidRegisterNotification; // 注册成功

extern NSString *const kJPFNetworkFailedRegisterNotification; //注册失败

extern NSString * const kJPFNetworkDidLoginNotification; // 登录成功

在添加注册 kJPFNetworkDidLoginNotification 通知的方法里可以获取 ID

  1. 调用 [registrationIDCompletionHandler:] 方法,通过 completionHandler 获取

[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {

NSLog(@"resCode : %d,registrationID: %@",resCode,registrationID);

}];

3.3 注意事项

  1. registrationID 只有在初始化成功之后才能取到,初始化需要时间,所以不要在初始化之后马上调 API 获取。

  2. 如上说明,Android 与 iOS 在监听到相关广播、通知事件后代表初始化已成功,可以选择调用 API 去主动获取。

  3. 在某些插件中,如果无法把握初始化成功的时机,就多次调用 API 获取,直到获取成功为止。

四、为什么不同 Android 设备取到了相同的 ID

4.1 排查方案

  1. 检查设备的 IMEI 、 serial_number 、Mac 地址、device_id值是否相同

  2. 当 device_id,imei + mac,serial_number 这三个信息有任意一个是相同的时候,就会取到一样的 registrationID 值。

4.2 解决办法

  1. 使设备的 IMEI 、 serial_number 、device_id 均不相同(serial_number 是新版 SDK 版本新增的,请升级 SDK )

  2. 重烧 IMEI ,刷机或者进行如下步骤:

  • 步骤一:把这个文件清掉:Environment.getExternalStorageDirectory().getPath() + “/data/.push_deviceid”;

  • 步骤二:同步清除掉 setting 里面的,方法如下:Settings.System.putString(context.getContentResolver(), “devcie_id_generated”, “”);

  • 步骤三:还有把缓存也清理下;

  • 然后再重装 App。

  1. 第二步操作是系统方法,如果操作未果,则说明你使用的是自己的定制设备,导出你的数据库信息查看一下 device ID 信息,不要将该信息固定为同一个值。

  2. 如果上述方案无法解决,给官方提供如下信息,我们来分析下是否有别的方案处理

  • 提供你的 registrationID、不同设备注册取到同一个 registrationID 的具体时间点

  • 如果能取到 IMEI、serial_number 、Mac 地址、device_id 等值,有值一样,但由于定制系统等原因无法自己将值设为不一样时,则提供该值说明情况。

  • 如果取不到这些值,请说明你的设备情况,如定制设备、电视盒子等等。

  • SDK 版本号(JPush 和 JCore)

五、为什么不同的 iOS 设备取到了相同的 ID

5.1 排查方案

  1. 检查给极光传递的 devicetoken 和 IDFA 值是否一样。一般直接从 iOS API 取到的值是不一样的,但可能你们自己固定给极光传了一样的值。

  2. 使用的 SDK 版本号是否过低

5.2 解决办法

  1. 直接使用官方提供的初始化代码,不要自定义传递 devicetoken 和 IDFA 值

  2. 升级 SDK 版本至 3.2.8 以上

  3. 如果上述方案无法解决,给官方提供如下信息,我们来分析下是否有别的方案处理

  • 提供你的 registrationID、不同设备注册取到同一个 registrationID 的具体时间点

  • 你自己取到的设备的 devicetoken 和 IDFA 值

  • SDK 版本号(JPush 和 JCore)

六、同一设备的 ID 值是否会产生变化

6.1 Android 设备

一般情况下同一个 Android 设备同一个 App 卸载重装后的 RegistrationID 是一样的,可能会产生变化的操作如下:

  1. 清除应用缓存

  2. 双卡双待的,更换卡槽

6.2 iOS 设备

  1. 卸载重装
  • iOS 9 及以下系统一般是不会改变的

  • iOS 9 以上系统,由于 Apple 在 App 卸载重装后,会给一个新的 token,所以对应的 RegistrationID 也会改变。

  1. 如果使用 IDFA 后再卸载重装,在 IDFA 不变的时候 registrationID 不会变化。

  2. 长时间关闭推送后又打开,也可能导致 token 变化。


如果对你有帮助,点个赞呗 ლ(╹◡╹ლ)

不吹不黑,关注「常见问题」专栏可以解决你 90% 的问题 (ノ◕ω◕)ノଘ_ଘ

如果还有你想知道的问题没有总结方案,来评论区跟我交流交流吖