华为Android消息推送服务接口调用相关问题
点评
个人觉得,相关文档并不友好,浪费很多时间在参数的理解方面,有些地方靠猜,有些地方靠翻源代码
开发方式
结合示例代码+指南+API参考+翻阅源代码
Demo地址
客户端示例代码-推送服务 | 华为开发者联盟
服务端示例代码-推送服务 | 华为开发者联盟
Android端
下载包出错
据说是,jcenter库不能用了,将其替换为mavenCentral库,在build.gradle中修改
生成jks文件报错
按照指南中提到的,使用2022某个版本的android studio生成jks文件出错,下载keyStore explore,使用其生成jks文件成功
修改包名
比如我的android项目,配置的包名为com.zy.test,将android端中所有包名替换为该名称
成功的标志
手机上获取token成功。
Web端
定时刷新token的定时任务出错
跟踪源代码,发现是首次获取token出错,导致expireIn时间为0,导致创建task定时任务出错。
这里的appid和appsecret具有迷惑性,它其实是应用的client_id和Client Secret。注意,是应用,而非项目。
另外,通过下图可以看见,新版本v2中,可以支持项目id. 有精力的小伙伴可以测试下。

下行消息-REST-推送服务 | 华为开发者联盟
截至目前(2023-9-2 16:56:20),开源的java server代码还是用的v1,如下图所示。

发送message错误代码80300007
错误message:所有Token都是无效的。
官网的相关解释:
常见错误码-推送服务 | 华为开发者联盟
https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/commonerror-0000001059816656

我的问题所在
Java Server和android app两端必须用同一项目下应用对应的client id& client Secret. 至于v2版本带来的新变化,参考上面关于token的部分。
源码的理解
重点在Examples & messaging两个目录中,其中examples是测试case,messaging是核心。主要用了auth和push两个rest接口,使用的http client是基础版本。个人认为,一个看点儿,是TokenRefresher,里面用到了定时任务线程池,实现token的定时刷新;另一个看点儿,是HuaweiApp中关于锁的使用,可以关注lock, deleted, appsLock.
如下图所示,这是app, service and client三者之间的关系。Service起到了解耦的作用,便于扩展其它的client(非message client).
HuaweiApp登记所有的app及service, 管理token, 验证,等基础信息。
HuaweiMessageClientImpl提供具体的消息服务,每一个app instance与message client instance是1:1的。

下载
KeyStore Explorer - Download