Android集成多个第三方通道的厂商推送冲突的解决方案

Android集成多个第三方通道的厂商推送冲突的解决方案

问题概况

在国内,由于谷歌GMS服务在国内的不可用,Android平台的推送一直就不如IOS平台。近年来国内大的手机厂商也开始着手解决这个问题,纷纷推出各自系统级的推送通道,以提高推送的送达率和更好的管控推送信息。目前国内的主要手机品牌包括华为、小米、vivo、oppo、魅族都有自己的系统级推送通道。
对于开发者而言,将这些厂商通道全部单独集成似乎也不是太好的方案,好在如极光等第三方推送平台已经帮我们做好的一部分的工作,但是我们还是需要添加一些必要的代码在我们的程序中,以使厂商推送可以完美运行。
在实际的工作过程中,我们可能会遇到这样的问题:App业务的推送使用了极光,但聊天又使用了融云,这两个第三方sdk又同时支持各个厂商通道推送。为了提高推送送达率和用户体验,我们肯定要同时实现这两个sdk的厂商通道推送,不然用户可能只能收到聊天的推送而收不到业务模块的推送或是相反。
当我们根据各个第三方平台的开发文档集成厂商推送的时候,会发现并不是我们预想的两个第三方推送平台的推送都可以同时使用,而只是其中一个可以推送到。以此可以获知,这两个第三方集成厂商通道冲突了。
首先可以确定的是,如果我们按照其中一个第三方推送平台的文档集成了厂商通道的源码,那么就不应该再按照另一个第三方平台再次集成厂商通道的源码了。
比如极光提供了JCenter集成小米推送源码的方案:

在应用 module 的 gradle 中 dependencies 节点添加如下代码:

dependencies {
        compile 'cn.jiguang.sdk.plugin:xiaomi:3.x.x'//版本号和对应的JPush版本号相同
    }

极光的其他厂商推送集成参考

那么融云文档中集成小米通道的导入资源步骤就可以忽略了。
融云的厂商推送集成参考

问题分析

我们知道,当我们集成了厂商推送后,第一次安装App,SDK会下发一个Token用以验证,并使得后台可以进行后续的发送推送操作。(华为新的推送机制基于HMS实现有所不同)而第三方推送平台都有代码实现去获取这个token。而厂商通道下发推送信息后,这些第三方平台有代码去获取这些消息并进行后续的操作。深入分析我们会发现,冲突的原因就在于此,两个第三方都要获取token,都要获取下发的信息,但token和下发的信息都是一次性的,这导致那个第三方的代码先获取到,另外一个就获取不到了。
对于极光和融云而言
为解决这个问题,我们很容易想到用一个继承另一个去解决,但是想去实现时我们会发现,这些代码所在的类是在arr包里面的,并不能修改。

解决方案

在查看了极光和融云的开发文档,并咨询了他们技术支持的同行,得到了如下的解决方案:(以小米的厂商推送为例)

由于双方sdk逻辑开发者都无法修改,所以可以通过开发自己注册小米推送(其他有同样问题的一样)事件回调Receiver,然后分别分发给极光和融云SDK。
具体步骤如下:

  1. 自定义一个继承自 PushMessageReceiver (极光的接收小米推送的父类)的 BroadcastReceiver ,假设其类名为PluginXiaomiPlatformReceiverYx,并注册到 AndroidManifest.xml,并将该Receiver优先级设置为最高,并把其他sdk注册的Receiver优先级设置成默认。
<receiver android:name="push.PluginXiaomiPlatformReceiverYx" android:exported="true">
            <intent-filter android:priority="0x7fffffff">
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
                <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
                <action android:name="com.xiaomi.mipush.ERROR" />
            </intent-filter>
        </receiver>
  1. 在对应的事件触发的方法进行事件分发,分别分发到其他sdk,示例代码如下:
public class MiPushMessageReceiver extends PushMessageReceiver{
    MiPushReceiver neteastReceiver = null;
    PluginXiaomiPlatformsReceiver jiguangReceiver = null;


    public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
        //分发到其他sdk示例代码
        if(neteastReceiver == null){
            neteastReceiver = new MiPushReceiver();
        }
        neteastReceiver.onReceivePassThroughMessage(context,message);
        if(jiguangReceiver = null){
            jiguangReceiver = new PluginXiaomiPlatformsReceiver();
        }
        jiguangReceiver.onReceivePassThroughMessage(context,message);
    }

    public void onNotificationMessageClicked(Context context, MiPushMessage message) {
    }

    public void onNotificationMessageArrived(Context context, MiPushMessage message) {
    }

通过这种方式可以解决两个第三方推送集成厂商通道冲突的问题,实际应用中,app在进程杀死后两个推送通道的推送都可以接收到。

参考:
Android厂商推送冲突了
融云开发者文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值