Android集成华为推送踩坑问题总结

很多人都很吐槽华为push的集成过程有多扯淡多贱(华为push论坛大都这么说的), 主要因为华为给开发者的集成文档确实很乱,本人在成功集成华为push后把集成过程中遇到的问题同大家分享一下,这里不阐述集成过程,自己可到华为消息推送平台查看,

插个更新:(2020.4.16更新)
最近把工程的push模块做了抽离,并开源到了jcenter库中,需要集成的可一键集成到项目中,后续会定时更新,传送门->https://www.jianshu.com/p/ab08f192461a

先总结遇到的几大坑位:

  1. 使用老版push还是新版push
  2. PushReceiver中的onEvent()回调触发问题
  3. APP接收到推送后,点击消息,总是会先打开启动页
  4. 如何自定义动作intent

1. 先说新老push的问题

hupush.jpeg

话说华为开发者平台提供了新老两个版本的Push SDK, 老版本已经不再维护, 而且也很扯淡的把接入文档下架了, 新的名字叫HMS Push,论坛上有人ma华为说它新的没整利索,就把老的给撤掉,什么东西,我就不说什么了, 刚开始的时候考虑到新版sdk需要依赖HMS服务以及覆盖率问题, 我们就集成了老版本的push, 华为文档有这么一句话"HMS Push的现有接口兼容对应的老版本的Push接口",于是客服端和服务端都开始开发了,结果悲剧了, 是的, 客服端兼容了, 但服务端不行了, 新老版本接口参数都不一样, 两端必须同样的版本,这点它的文档中没有丝毫说明...后来就开始网上找服务端接入文档, 成功接入后, 却发现又碰到了老push不稳定的问题......

最终的最终,决定重新集成新版本的push!!!

2.onEvent回调的问题

对消息的监听, 提供了4种回调方法,注释写得很清楚, 官网也有相关的解释, 不多说. 这里说一下onEvent方法,当时试了很多次没试出这个回调如何触发(可能是自己粗心大意)


onevent.jpeg

后台发送push时必须在自定义内容中加入键值对后才会在客户端点击该条消息后回调onEvenet方法, 另外华为push是不能感知到消息的到达的, 这点需要区分开.

3.当APP接收到推送后,点击消息,会发现总是会先打开启动页的问题

这个问题是最坑的,不管你的app是否活着,收到push点击后都会重启一次你的app,这样的体验肯定很有问题,必须解决.同样,华为文档没有任何提示或者说明,我们想着可能需要通过自定义动作才能解决这个问题了,最后事实证明是这样的.于是接着查文档,恩,是的,找到不少自定义行为方面的说明文档, 通知栏消息格式说明,这是链接,个人觉得说的很乱,而且这些都是自己服务端那边发push要使用的message格式,那么客服端代码怎么写呢,总之,比小米push文档差远了,当初接Mi push也没这么折腾人

先来看看自己服务端接入华为push需要的消息内容格式:

servergeshi.jpeg

图里红框中的需要正确设置, 第一个type为3表示系统通知栏消息, 第二个是action的type标识, 1表示自定义行为,最重要的就是那个intent了, 至于这个intent怎么来的, 又是怎么用的, 一会详细说明.......

恩,开始客户端工作:

不要指望在华为的push文档中找到客户端自定义行为的任何代码示例, 至少目前没有, 还好, 华为还是给了你一点指示的, 进入华为发送push的后台页面:


client.jpeg

到这,可能会有人看不懂图的上半部分的意思,这牵扯到android的意图(Intent)机制,关于该机制在我的另外一篇博客Android浅谈网页打开APP(一)中有所介绍,这里不再深究。

  1. 先在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的配置也是没有什么要求,但一会会用到这三个参数,只要保证前后一致便可。

  1. 这时候客服端其实已经有了跳转到这个被指定的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值,后面的就是固定值了

  1. 接下来就是在中转activity里根据参数进行跳转处理了,下面的代码是我们项目中的处理,很简单,没有什么复杂逻辑:
   try {
        String action = getIntent().getData().getQueryParameter("action");
        ActionUtil.startAction(this, ActionUtil.PREFIX + action, true);
   } catch (Exception e){
        e.printStackTrace();
   }
   finish();

取出执行下一步动作的action, 然后通过action进行相应的跳转处理, 最后直接关闭这个透明的中转Activity就行了.

到此, 已经差不多了

总结出来感觉并不多, 但操作的过程还是很折腾的.......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,350评论 0 17
  • 【Android Activity】 什么是 Activity? 四大组件之一,通常一个用户交互界面对应一个 ac...
    Rtia阅读 3,794评论 3 18
  • 周末在图书馆找书时无意看到一本名为《农民工》的摄影相册,跟你们分享我看到的故事。 当股市的曲线开始出现在大屏幕上时...
    H君写日记阅读 351评论 0 1
  • 日子一天接一天的飞快流逝,每天能学到一点新的东西,也是件令人开心的事吧! 1.块与行 display:显示 dis...
    沐盺zz阅读 630评论 0 2