记推送过程踩坑

之前在项目中集成过推送。但是因为公司的改革原因把,要重新集成一遍(好尴尬)。可能对于我们这些安卓小苦逼的码农而言,推送是一件很头疼的事情,如果你送不到吧,公司会认为你是bug,如果你经常送吧,用户会觉得很烦啊。没办法,作为码农的我们,薪水要紧啊~

我们公司采用的是2+1的模式进行推送:华为和小米这两个深度定制的大厂家,我们采用了它们自身配置的推送服务,然后其他的品牌我们就采用的是友盟。(很多人问我为什么不用极光,额···因为友盟坑啊~开个玩笑,友盟的集成过程比较复杂,极光相对简单,但是其实对于我而言,推送的送达才是最重要的。过程嘛,不多深究啦。)

我下面就说说我在集成这些推送中可能遇到的坑。真的是大坑 有的坑我想了很多天- -,原谅我小菜鸟。


先讲讲小米吧。

我觉得小米比起华为的推送来说,做的真的好多了, - 0 -,其实没有遇到什么大坑。就是要区别一下 透传消息和通知栏消息。

1.透传消息在发送到我们客户端的时候走的是 onReceivePassThroughMessage(Context context, MiPushMessage message) ,这时的消息不会在通知栏上显示,而是需要我们客户端内部自己去执行下面你想要的操作。    

2.通知栏消息,在消息到达的时候会调用 onNotificationMessageArrived(Context context, MiPushMessage message),在消息点击之后会调用 onNotificationMessageClicked(Context context, finalMiPushMessage message)。 

最开始我采用的是透传消息。之尴尬,真的尴尬。因为我们的需求是通知到达点击通知到列表嘛。然后我就发现哈哈哈哈哈,透传的尴尬就在于不管你点没点那个通知栏哦,它自己就跳页面了哦 - -,不知道的还以为是出了啥子问题了,也是我脑壳乔了。但是思路就是这样的。如果是要跳转页面的话,就建议采用通知栏的通知,是开启服务啊什么的就另当别论了。



好,下面我们来说说华为。

先吐槽一哈,我感觉华为的官方对他们自己的推送很不上心。在官网的测试模式下,看不到消息的详情,无法复用,无法点击。

接下来说说我遇到的问题吧。主要还是围绕着透传和通知栏。

华为的通知栏消息,要想收到,那真的是太恼火了。要自定义行为,如果你是在官方测试的话。要添加



这样才能才收到消息的时候调用onEvent()方法。

public static enum Event {
    NOTIFICATION_OPENED,
    NOTIFICATION_CLICK_BTN;

    private Event() {
    }
}

根据这个event中的点击和打开消息事件,来进行下一步的操作。

你以为这么就可以了么?哈哈 不是的,在服务器端推送的时候,那个json的封装简直令人咂舌啊。 - -在官方文档我们看到的消息封装是以json对象的形式传递的,但是就各种报错啊,什么200,403,illegal message... 然后然后然后,和服务器的小哥研究百度谷歌了很多地方我们发现...消息的封装要以json字符串的形式拼接上去。可能当时没注意认真阅读论坛的帖子。我把帖子带下。


3.通知栏消息接口
3.1 接口访问地址:

老接口:

新接口:
https://api.push.hicloud.com/pushsend.do?nsp_ctx={"ver":"1","appId":"***"}
红色部分使用的时候需要encode

3.2请求接口
老接口:
openpush.message.ps_single_send

新接口:
openpush.message.api.send

3.3 请求参数
老接口:
access_token=***&msgType=1&requestID=1_1362472787848&cacheMode=1&nsp_fmt=JSON&expire_time=2016-08-24+16%3A42%3A31&android={"notification_title":"hello","notification_content":"hello","doings":1}&priority=0&nsp_svc=openpush.message.psSingleSend&nsp_ts=1472017414&deviceToken=00000000000000000000000000000000
具体字段解释请参考接入文档。

新接口:
access_token=***&payload={"hps":{"msg":{"type":3,"body":{"content":"hello","title":  "hello"},"action":{"type":3,"param":{"appPkgName":"应用包名"}}}, "ext":{"customize":[{"自定义参数key1":"自定义参数value1"},{"自定义参数key2":"自定义参数value2"}]}}}&device_token_list=["目标设备1deivceToken","目标设备2deviceToken"]&expire_time=2017-06-07T19:46&nsp_svc=openpush.message.api.send&nsp_ts=1472020575

具体字段解释请参考接口文档,上面红色的的参数全部都是需要encode

3.4 返回参数
老接口:
{"resultcode":0,"message":"success","requestid":"14968888712886337"}

新接口:
{"requestId":"14968251829154666732","msg":"success","code":"80000000"}



重点就在于坑蒙拐骗尝试了很多遍之后,我们发现  

hashMap.put("android", {\"notification_title\":\"title\",\"notification_content\":\"content\",\"doings\":2,\"extras\":[{\"type\":\"团队\"}]}");

这种拼接才是有效的。对于通知栏消息的点击,需要带extras字段,以jsonarray的形式发送才是正确的。这个希望对采用通知栏的同志们有点帮助。



最后我说一个友盟的坑 -- 。

哈哈,想想就想笑 是真的。就是最开始我是自定义了消息的处理,也就是继承了 UmengMessageService。之尴尬的是什么呢,对就是在开启了mPushAgent.setPushIntentServiceClass(UmengPushIntentService.class)之后,你再把这句注释掉,你就收不到消息了,收不到...不到...不... 。后来我查了查原因,说的是SDK会缓存,如果一旦你采用了自定义方式去处理消息,那么你再想要采用友盟自带的处理方式的话,那你就必须要卸载应用重装,才能收到...然后我就卸载了发送,果然是收到了。。尴尬 == 。


最后愿天下程序无bug。世界和平。



 











  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值