之前在项目中集成过推送。但是因为公司的改革原因把,要重新集成一遍(好尴尬)。可能对于我们这些安卓小苦逼的码农而言,推送是一件很头疼的事情,如果你送不到吧,公司会认为你是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字符串的形式拼接上去。可能当时没注意认真阅读论坛的帖子。我把帖子带下。
是重点就在于坑蒙拐骗尝试了很多遍之后,我们发现
hashMap.put("android", {\"notification_title\":\"title\",\"notification_content\":\"content\",\"doings\":2,\"extras\":[{\"type\":\"团队\"}]}");
这种拼接才是有效的。对于通知栏消息的点击,需要带extras字段,以jsonarray的形式发送才是正确的。这个希望对采用通知栏的同志们有点帮助。
最后我说一个友盟的坑 -- 。
哈哈,想想就想笑 是真的。就是最开始我是自定义了消息的处理,也就是继承了 UmengMessageService。之尴尬的是什么呢,对就是在开启了mPushAgent.setPushIntentServiceClass(UmengPushIntentService.class)之后,你再把这句注释掉,你就收不到消息了,收不到...不到...不... 。后来我查了查原因,说的是SDK会缓存,如果一旦你采用了自定义方式去处理消息,那么你再想要采用友盟自带的处理方式的话,那你就必须要卸载应用重装,才能收到...然后我就卸载了发送,果然是收到了。。尴尬 == 。
最后愿天下程序无bug。世界和平。