一个融合多家推送sdk的库:RePush

4,126 阅读4分钟

推送一直是拉活用户的重要运营手段,相比IOS的系统推送通道,Android的推送实在让开发者头疼。各大厂商均定制自己的Rom,除了微信这种霸王级别的应用,其他的应用想要保活推送通道可谓是难上加难。那对于推送的实时性要求较高的应用怎么办呢?OK,大家想到了以下几种姿势: 1.自己做应用的保活,比如提高进程级别、开一个通知栏的Service等 2.找公司的BD与各大厂家合作,将自己的应用包名加入到厂家的白名单中,让系统来提供保活 3.自己开发一波大的SDK,将市面上常见的设备厂商的推送SDK进行融合,根据不同的设备厂商选择对应的厂商SDK,共享系统的推送通道。 4.待补充ing... 客观的看待上述几种姿势,还是第三个最不容易翻车(当然如果你们家的BD足够6,可以让各大厂商给你们做应用保活,就当我在说梦话)。So,这段时间研究了一波,自己撸了一个库:RePush(没错,叫RePush是因为老婆大人的名字有个睿.恩,秀恩爱就是要这么直接)。

注:悦跑圈团队开源了一个MixPush,架构挺不错的,我也借鉴了一波

开始预调研各大厂家的Push

小米

小米设备占比还是蛮大的,所以集成他们的SDK毋庸置疑。幸好小米的推送SDK做的是很完善的,集成没费多少功夫。 小米推送平台地址 注:个人开发者需要提交身份证等证明文件做实名认证;企业的需要上传一部分资质,小米审核通过之后就可以开心浪了。客观讲小米的推送做的非常良心,功能比较完善,大家可以直接看我的代码实现。

华为

趁着我的良心还热乎,我敢说华为的推送是我见过最坑的,没有之一。 华为推送平台

  • 不支持别名
  • 不支持标签
  • 如果你想群发消息,只能将客户端的token上报给服务端,服务端遍历token挨个推送
  • 如果用户想关闭推送,你也只能将该用户的token上报给服务端,服务端将该token从表中剔除
  • 在meta9等设备上,在我们的app没有获得自启动权限的情况下,当app被系统完全干掉时,收到推送后用户点击推送并不会触发HuaweiPushRevicer中的onEvent方法。这就造成开发者无法处理点击后的跳转事件。我电话咨询了下华为的开发人员,他们说建议我们使用自定义事件(即Uri)来传递信息。这块我已经处理好了,详见代码中的PushHandlerActivity。

友盟

所谓的推送N+1策略就是指N个厂家的推送加一个第三方的推送,相信大家的App里面都有友盟统计吧,顺手集成上他们的SDK也不是什么难事。客观讲友盟的推送坑不是很多。大家看代码吧。

RePush的使用

写在前面:需要大家全局搜索"repush_custome",将涉及到的值改成自己在第三方平台上申请的值。

  1. import module(repush_master必须)
  2. 修改app下的build.gradle文件加入依赖
  3. 继承RePushIntentService实现自己的点击逻辑。例如

public class PushHandlerService extends RePushIntentService {
    @Override
    public void onReceivePassThroughMessage(RePushMessage message) {
        Toast.makeText(getApplicationContext(), "客户端收到了透传消息" + message.getContent(), Toast.LENGTH_SHORT).show();
        Logger.e("收到透传消息 -> " + message.getPlatform());
        Logger.e("收到透传消息 -> " + message.getContent());
    }

    @Override
    public void onNotificationMessageClicked(RePushMessage message) {
        Logger.e("通知栏消息点击 -> " + message.getPlatform());
        Logger.e("通知栏消息点击 -> " + message.toString());
    }

    @Override
    public void onToken(RePushMessage token) {
        SharePrefUtil.saveString("token", token.getToken());
        Log.e(TAG, "接收到了token -> " + token.getToken() + "   " + RePushMaster.getCurrentPlatForm());
    }

}
  1. 自定义的Application中的onCreate中加入初始化代码。注意:第三方推送的SDK是可插拔的,需要哪家的sdk直接addPushClient就好了.
 private void initPush() {
        //输入你在小米申请的appid & appkey
        RePushMaster.addPushClient(new MiPushClient("repush_costom", "repush_custom"));
        RePushMaster.addPushClient(new HuaWeiClient());
        RePushMaster.addPushClient(new UMengClient());
        RePushMaster.setSelector(new RePushMaster.ReSelector() {
            @Override
            public String select(Map<String, RePushClient> pushAdapterMap, String brand) {
                //已完成根据设备选择sdk的逻辑,可以替换成自己的选择逻辑
                return super.select(pushAdapterMap, brand);
            }
        });
        // 配置接收推送消息的服务类
        RePushMaster.setPushIntentService(PushHandlerService.class);
        // 注册推送
        RePushMaster.registerPush(this);

    }

5.在Activity中开始使用: 打开推送: RePushMaster.enable(this); 关闭推送: RePushMaster.disable(this); 设置别名: RePushMaster.setAlias(this, "alias"); 设置标签: RePushMaster.setTags(this, "tag"); 获取token: SharePrefUtil.getString("token", "token is null");

6.服务端的同学就不用管太多了,加入你们的客户端中集成了华为 小米 友盟三家的推送,那就分别调用这三家服务端的sdk进行推送就可以了。

关于集成其他第三方的SDK

由于时间原因,本项目并没有集成市面上所有的push sdk,例如:极光、个推等。如果你的项目里面用到了这些sdk,可以实现RePushClient接口进行自定义。

代码传送门(欢迎star,拍砖)

代码地址

About Me

contact way value
mail weixinjie1993@gmail.com
wechat W2006292
github https://github.com/weixinjie
blog https://juejin.cn/user/3087084378665367