一、获取Push Token的方式

获取Push Token有两种方式:一种是调用getToken方法向Push服务端请求Token,当getToken方法返回为空时,Token可通过onNewToken方法返回,因此需要实现onNewToken方法;另一种是自动初始化,Token通过onNewToken方法返回。这两种方法的详细说明可看获取和注销Token文档:获取和注销Token。

二、获取Push Token失败的现象

获取Push Token失败大致有两种现象:一种是获取Token的接口执行失败,错误会在日志中显示,有相应的错误码打印;另一种是获取Token的接口执行成功,没有报错,但是getToken方法返回为空,onNewToken方法也没有被调用。

三、分现象进行排查

如果有报错,需要找到报错描述和错误码,参考常见错误码说明文档:常见错误码,根据报错描述和常见错误码说明文档中对应错误码的解决方法进行排查,大部分问题都可以得到解决。

比较典型的案例:开发者按照对应错误码的解决方法进行排查,无法解决问题,后来和开发者要了手机端抓取的日志,从日志中看到申请Token使用的appid不是应用对应的appid。所以一定要保证使用的agconnect-services.json文件是对应应用最新的文件,可以从AGC控制台上新下载一份;并且保证应用中所有使用到的appid都是对的,可以用全局搜索进行查找。有些开发者的应用可能是多个人共同开发的,变量命名可能不一致,无法搜索所有用到的appid,这种情况下可以通过手机端日志确认使用的appid是否正确。

日志抓取方法:zaaxz

adb shell setprop log.tag.hwpush VERBOSE
adb logcat -v threadtime 1> D:\hwpush.log

2、尝试复现遇到的问题场景。

3、按快捷键“Ctrl+C”完成日志抓取。

查找关键日志:

搜索api_name:push.gettoken关键字,找到如上图所示的这行日志,error_code是申请Token失败时返回的错误码,app_id是用来申请Token的appid,pkg_name是应用的包名,检查app_id值是否为对应应用的appid,如果不是,可以使用这个app_id在应用的工程中进行全局搜索,排查在哪个地方使用了这个值,并进行修改。

如果获取token的接口执行成功,没有报错,onNewToken方法也没有被调用,请检查代码中继承了HmsMessageService的自定义类,看下自定义的类中除了重写了配置Manifest文件文档中说明的用于接收透传消息、获取Token的方法外,是否已经重写其他方法,如果有请去掉,其他方法不需要重写,而且重写可能会导致类中的方法不会被调用。如果继承HmsMessageService的类实现没有问题,请排查工程中定义了几个继承HmsMessageService的类,如果定义了多个继承HmsMessageService的类,也会导致实现的方法不会被调用,继承HmsMessageService的类只能有一个。

典型案例:

开发者使用三方推送,三方推送的SDK中已经定义了一个继承HmsMessageService的类,这种情况就不需要再定义继承HmsMessageService的类,需要开发者去咨询三方推送的技术支持要怎么使用他们定义的这个类。可以通过反编译查看Android声明文件,确定三方推送的SDK中是否定义了继承HmsMessageService的类。可以通过查看手机端日志确定有几个继承HmsMessageService的类,日志抓取方法同上,下面说一下怎么看关键日志。

查找关键日志:

搜索HmsMessageService num is关键字,找到如上图所示的日志,结合日志上下文中的packageName确定对应应用的日志,HmsMessageService num is后面的数值就是继承HmsMessageService的类的数量,如果不为1,请排查工程代码,并删除多余的类。

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解 HMS Core 最新技术资讯~