安卓app接入推送的较优解决方案(包括厂商通道、集成推送的使用分析)

    推送功能,是每一个app都会开发的功能,它可以很大程度的提高app的使用率和用户的保活率。但是问题来了,由于现在安卓系统越来越成熟,对某些权限的限制越来越大,而且各大厂商的定制系统对后台app监控做得也越来越好,如果自己实现一条后台线程来和后台服务器保持长连接,基本前台app退出不到几分钟就被杀死了,所以我选择通过接入第三方的推送SDK来实现推送功能的实现。
    在给公司产品接入推送时,我实现了两种方案,原因下面会解释,第一种方案就是自己集成了目前系统已经开放的厂商通道,到目前为止,已经开发有厂商通道的系统有小米、魅族(flyme)、vivo、oppo、华为(华为移动服务HMS),下面是各平台的入口:

小米开发者平台 

魅族开发者平台 注意:魅族推送分为两种:一种是自己的厂商推送;一种是集成推送;两者不同,使用时记住看清,两者的后台有点区别的

华为开发者联盟 注意:如果要接入华为推送,就必须把华为整一个移动服务框架都要集成进去,这个有点坑,而且华为推送的后台并不支持全量推送,所以在开发时,还必须自己收集注册华为推送返回的token,这个就有点糟心了,增加很多的开发量。我还要吐槽一点,华为开发者的后台响应的有点慢,哈哈哈。

vivo开发者平台 注意:这个需要企业开发者账号才行,暂时不开放个人开发者使用

oppo开发者平台 注意:这个如果想要接入必须是已经上线的app才可以,而且他们后台也会有一定的审核,还有,他们对通知栏的自定义样式有一套很严格的要求,也是比较麻烦的。

上面就是各厂商通道的控制后台,一般要发布推送建议还是使用他们的后台进行操作,不建议自己使用他们的后台接口,因为,第一点,他们的后台挺成熟的,第二点,要接入推送一定不止接入一个厂商通道,这样大大增加后台开发的工作量,所以建议使用他们自己的后台。

在app接入推送时,要注意几点吧,都是我自己踩过的坑,哈哈哈

1、使用一个CallActivity作为跳转activity

这种坑出现的情况是这样的,点击推送后的点击事件是打开app,默认打开的是入口activity,我们的app当然不止仅使用一个activity承载,例如我们正在activityB的界面上,此时一条推送进来,我们点击后的事件是打开app,此时就会出现activityA(即入口Activity)位于栈顶,将ActivityB盖住。这样导致activity栈错乱,流程也可能会因此出现错误。

所以:我提供的解决方案是,指定点击通知栏后,跳转的activity为CallActivity(一个中转activity),只要我们在这个activity判断当前是否已经打开应用,如果已经打开就不做处理,如未打开,再跳转到ActivityA(即入口Activity)走正常打开app的流程。因为CallActivity最后都要finish自己,这样就可以保证不会干扰正常Activity栈,也就不会干扰正常的流程。如果想跳转其他页面,可以在这个基础上进行扩展。

2、建议将各厂商通道的集成的需要代码统一到一个library里面去,因为他们在manifest里面要配置的代码太多,这样就会导致主工程的manifest贼多东西。

3、在测试vivo和oppo机型,记得!记得!打开app的通知栏通知开关,他们是默认关闭的。

这是第一种方案,这种方案的缺点是每一次要推送都得跑到他们的后台去推送,一共又有几个后台,产品他们就不开心了。

所有就有了第二种方案,使用第三方集成推送,例如信鸽、极光,他们都集成了厂商通道,但是这种呢,有缺点,他们并没有把所有的厂商通道都集成进去,例如信鸽里面就还没有集成vivo和oppo,所以在这两种机型上,依旧会出现杀后台收不到推送信息的情况,下面是第三方集成推送的入口:

信鸽 注意:虽然它集成了厂商通道,我们还是要到各自系统的开发者平台上申请推送,再信鸽后台完善相应的信息

极光 同上

这两款是我们现在公司在用推送SDK感觉还是可以的,都有集成了厂商通道,推送效果还行,但是整体还是比不上第一种方案,原因由于这些集成推送都是免费的,所以在时效上、到达率上不能保证百分之百,而且前面说了他们并没有把现有的所有厂商通道都集成进去,so,在没有集成系统上,杀后台时基本收不到。

不过好消息是,谷歌爸爸准备出面解决这个局面了,哈哈哈,说要联合所有厂商一起打造一个推送平台,可能到时接入推送就可以很轻松了。

 

 

 

你可能感兴趣的:(安卓开发日记)