推送一直是拉活用户的重要运营手段,相比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",将涉及到的值改成自己在第三方平台上申请的值。
- import module(repush_master必须)
- 修改app下的build.gradle文件加入依赖
- 继承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());
}
}
- 自定义的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 |
---|---|
weixinjie1993@gmail.com | |
W2006292 | |
github | https://github.com/weixinjie |
blog | https://juejin.cn/user/3087084378665367 |