很多人都很吐槽华为push的集成过程有多扯淡多贱(华为push论坛大都这么说的), 主要因为华为给开发者的集成文档确实很乱,本人在成功集成华为push后把集成过程中遇到的问题同大家分享一下,这里不阐述集成过程,自己可到华为消息推送平台查看,
插个更新:(2020.4.16更新)
最近把工程的push模块做了抽离,并开源到了jcenter库中,需要集成的可一键集成到项目中,后续会定时更新,传送门->https://www.jianshu.com/p/ab08f192461a
先总结遇到的几大坑位:
- 使用老版push还是新版push
- PushReceiver中的onEvent()回调触发问题
- APP接收到推送后,点击消息,总是会先打开启动页
- 如何自定义动作intent
1. 先说新老push的问题
话说华为开发者平台提供了新老两个版本的Push SDK, 老版本已经不再维护, 而且也很扯淡的把接入文档下架了, 新的名字叫HMS Push,论坛上有人ma华为说它新的没整利索,就把老的给撤掉,什么东西,我就不说什么了, 刚开始的时候考虑到新版sdk需要依赖HMS服务以及覆盖率问题, 我们就集成了老版本的push, 华为文档有这么一句话"HMS Push的现有接口兼容对应的老版本的Push接口",于是客服端和服务端都开始开发了,结果悲剧了, 是的, 客服端兼容了, 但服务端不行了, 新老版本接口参数都不一样, 两端必须同样的版本,这点它的文档中没有丝毫说明...后来就开始网上找服务端接入文档, 成功接入后, 却发现又碰到了老push不稳定的问题......
最终的最终,决定重新集成新版本的push!!!
2.onEvent回调的问题
对消息的监听, 提供了4种回调方法,注释写得很清楚, 官网也有相关的解释, 不多说. 这里说一下onEvent方法,当时试了很多次没试出这个回调如何触发(可能是自己粗心大意)
后台发送push时必须在自定义内容中加入键值对后才会在客户端点击该条消息后回调onEvenet方法, 另外华为push是不能感知到消息的到达的, 这点需要区分开.
3.当APP接收到推送后,点击消息,会发现总是会先打开启动页的问题
这个问题是最坑的,不管你的app是否活着,收到push点击后都会重启一次你的app,这样的体验肯定很有问题,必须解决.同样,华为文档没有任何提示或者说明,我们想着可能需要通过自定义动作才能解决这个问题了,最后事实证明是这样的.于是接着查文档,恩,是的,找到不少自定义行为方面的说明文档, 通知栏消息格式说明,这是链接,个人觉得说的很乱,而且这些都是自己服务端那边发push要使用的message格式,那么客服端代码怎么写呢,总之,比小米push文档差远了,当初接Mi push也没这么折腾人
先来看看自己服务端接入华为push需要的消息内容格式:
图里红框中的需要正确设置, 第一个type为3表示系统通知栏消息, 第二个是action的type标识, 1表示自定义行为,最重要的就是那个intent了, 至于这个intent怎么来的, 又是怎么用的, 一会详细说明.......
恩,开始客户端工作:
不要指望在华为的push文档中找到客户端自定义行为的任何代码示例, 至少目前没有, 还好, 华为还是给了你一点指示的, 进入华为发送push的后台页面:
到这,可能会有人看不懂图的上半部分的意思,这牵扯到android的意图(Intent)机制,关于该机制在我的另外一篇博客Android浅谈网页打开APP(一)中有所介绍,这里不再深究。
-
先在AndroidManifest文件中添加一个需要跳转到的Activity, 并加入intent-filter过滤器:
```<activity android:name=".activity.HWPushTranslateActivity" android:theme="@style/Activity.Translucent"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="com.wonderfull.android.push" android:path="/notification" android:scheme="wonderfullpush" /> </intent-filter> </activity> ```
该Activity的作用:
- 通过配置intent-filter,接收来自华为push的intent
- 中转作用,取到intent中的信息,进行相应处理
对于<data> 里面的信息,可根据自己的项目情况来配置, 作为对intent的过滤规则。host可配置为自己项目的包名,path 的配置随意,如有,但不要少了前面的"/", scheme的配置也是没有什么要求,但一会会用到这三个参数,只要保证前后一致便可。
- 这时候客服端其实已经有了跳转到这个被指定的activity的功能了,下一步就是服务端下发push了,说白了,就是下发这个intent,但如果intent的格式、参数不对,照样无法跳转。
从华为推送后台自定义动作一栏,看到有提示说填入执行的动作intent, 那这个intent怎么填,格式是什么, 是需要跳转的那个Activity的名字或者整个包名路径吗,当然不是!
这个intent就是一个固定格式的字符串,可通过段代码生成, 当然你也可以直接照着固定格式自己拼凑出来, 但不建议, 很容易出错. 有了这个intentUri之后把它填给华为推送后台, 或者直接给你们自己的后台, 我们可以在这个intentUri中可以添加自定义消息, 之后在你的中转Activity中拿到并做处理就行了.
以下代码便是生成intent的,可通过在代码中通过log打印出来
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("wonderfullpush://com.wonderfull.android.push/notification?action=your parameter"));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
String intnetUri = intent.toUri(Intent.URI_INTENT_SCHEME);
Log.d("hwpush", "intnetUri=" + intnetUri);
生成的intent的如下,基本是这个格式
intent://com.wonderfull.android.push/notification?action=$action#Intent;scheme=wonderfullpush;action=android.intent.action.VIEW;launchFlags=0x10000000;end
"com.wonderfull.android.push" 是上面配置的中转Activity的host, "/notification" 是path的值, ?号后面就是可配置的选项参数了, 从 #Intent开始,scheme也是你配置的scheme值,后面的就是固定值了
- 接下来就是在中转activity里根据参数进行跳转处理了,下面的代码是我们项目中的处理,很简单,没有什么复杂逻辑:
try {
String action = getIntent().getData().getQueryParameter("action");
ActionUtil.startAction(this, ActionUtil.PREFIX + action, true);
} catch (Exception e){
e.printStackTrace();
}
finish();
取出执行下一步动作的action, 然后通过action进行相应的跳转处理, 最后直接关闭这个透明的中转Activity就行了.
到此, 已经差不多了
总结出来感觉并不多, 但操作的过程还是很折腾的.......