一、背景
作为 IM 的根底能力之一,推送的重要性显而易见,它是手机操作系统提供给利用触达用户的重要伎俩之一。苹果零碎有 APNS,谷歌也为安卓零碎提供了零碎级别的推送服务 FCM。
然而,因为 FCM 在我国无奈应用。利用为了保障用户能收到重要音讯,进步本身的拉活率,晚期的时候很多利用都是自建推送通道,通过各种保活措施或者频繁拉活来确保通道存活,这就导致了手机零碎内很多服务无奈回收,耗电和发热问题突显,成为安卓手机的一大诟病。
为了晋升本人的用户感知,谷歌及国内各手机厂商对利用权限的管控越来越严,没有用户的许可,自建通道根本不可能存活。但用户对推送服务的需要又是的确存在的,为了满足这个需要,各手机厂商纷纷推出了本人的零碎级别推送服务。
二、现状
目前国内有零碎级别推送的次要厂商如下:华为、小米、OPPO、vivo、魅族。
因为各厂商的推送策略和集成形式各不相同,开发者须要钻研各家文档,一一适配,开发门槛高且琐碎。如果有出海需要的利用,还须要对 FCM 独自适配,最多的状况下一个利用可能须要适配多达六个推送通道,开发成本极高。
三、融云解决方案
针对以上问题,融云 SDK 对接了各厂商推送,配合搭建的自有推送通道,智能抉择最优计划,最大水平保障了推送达到率。
另外 SDK 还对各厂商推送接口进行了提炼和合并,开发者只须要几行代码即可实现全通道推送能力,极大升高了开发成本。通过提炼后的对立接口,开发者能够很不便的进行告诉自定义和事件监控。
融云推送计划
依据客户端和服务端的交互过程,从以下三点对融云推送计划进行阐明:
- 协商通道过程
- 通道抉择策略
- 承受推送过程
协商通道过程
客户端初始化时,依据本地保留的配置状态决定是否须要和推送服务交互。
若没有实现配置,客户端首先和推送服务建设长连贯,并和服务协商须要应用的推送类型,而后依据服务返回的类型调用对应的第三方注册接口,并将获取到的 token 发给服务,至此,协商结束,断开长连贯通道。
若配置曾经实现,则间接向第三方推送服务进行注册,获取到第三方推送服务返回的 token 后和本地缓存进行比对,如果不统一,才将新 token 发给融云推送服务,否则不进行任何解决,免得资源节约。
补充阐明一点,协商后如果确认应用融云自建通道,SDK 会在独自的推送过程再次和服务建设长连贯,并放弃后盾存活。
通道抉择策略
a. 优先应用零碎级通道。客户端首次初始化时,将利用所反对的推送类型和以后设施信息发送给服务端,IM 推送服务联合两者信息以及后盾配置信息一一匹配,优先返回和设施匹配的零碎级推送通道。
b. 海内用户优先应用 FCM。鉴于谷歌原生推送(FCM)的固有劣势,针对海内用户,融云进行了非凡解决。当用户出访 IP 为海内地址时,优先应用 FCM 通道。
c. 自建通道作为保底伎俩。如果没有匹配的零碎级别推送时,融云会启用自建推送通道 RongPush, 以最大水平保障推送达到率。
承受推送过程
融云推送服务接管到一条音讯后,若指标用户离线,则依据协商过程中所应用的推送类型,将音讯推送给对应的第三方,第三方推送服务通过本人的零碎级推送通道,将音讯送达到目标用户设施,并在告诉栏展现。
客户端应用阐明
1. 配置示例
PushConfig pushConfig = new PushConfig
.Builder()
.enableFCM(true) // 配置 FCM 推送
.enableHWPush(true) // 配置华为推送
.enableMiPush(MI_APPID, MI_APPKEY) // 配置小米推送
.enableMeiZuPush(MEIZU_APPID, MEIZU_APPKEY) // 配置魅族推送
.enableVivoPush(true) // 配置 vivo 推送
.enableOppoPush(OPPO_APPKEY, OPPO_SECRET) // 配置 OPPO 推送
.build();
RongPushClient.setPushConfig(pushConfig); // 配置推送
左滑查看更多→
导入第三方推送 jar 后,参考文档在 AndroidManifest.xml 里增加对应申明,再参考上图进行配置,即可为利用实现全通道推送能力。
2. 事件监听
通过继承 SDK 的 PushMessageReceiver 类,即可对推送告诉的达到、点击及异样状态进行监听,SDK 曾经将告诉的相干信息形象为 PushNotificationMessage 对象,可通过该对象获取业务数据并进行自定义解决,如下图所示:
public class MyNotificationReceiver extends PushMessageReceiver {
// 推送告诉达到事件
@Override
public boolean onNotificationMessageArrived(Context context, PushType pushType, PushNotificationMessage message) {return false;}
// 推送告诉点击事件
@Override
public boolean onNotificationMessageClicked(Context context, PushType pushType, PushNotificationMessage message) {return false;}
// 推送配置状态回调
@Override
public void onThirdPartyPushState(PushType pushType, String action, long resultCode) {super.onThirdPartyPushState(pushType, action, resultCode);
}
}
左滑查看更多→
3. 各平台反对能力概览
上表中,推送形式分为告诉形式和透传形式,两者区别如下:
告诉形式, 是指由手机零碎间接在告诉栏弹出告诉,不触发利用,达到率高且节电。
透传形式, 指服务将音讯原始数据下发到客户端,客户端通过播送接收器承受数据再进行解决。须要拉起利用,个别依赖于客户是否关上自启动权限,达到率低。