开始集成推送(旧版)
融云 SDK 支持集成三方推送通道与融云自建推送通道(RongPush)。
注意
本文适用于 5.6.0 版本之前的 IMLib、IMKit 或其他依赖 IMLib 的融云客户端 SDK。从 5.6.0 版本开始,融云推出集成方式更简单的 Push 2.0 集成方案,欢迎使用。
推送服务能力
推送支持「离线消息推送」和「不落地通知」两种场景。
离线消息推送通知
假设用户仅在一台设备上登录,如果主动断开连接(disconnect())或者应用程序已被用户或系统杀死,融云会认为用户在该客户端离线。用户离线状态下,支持将收到的单聊消息、群聊消息、系统消息、超级群消息通过第三方推送厂商或融云自建的推送服 务通知客户端。
- 如果由第三方厂商推送服务发送提醒,该提醒一般由系统直接弹出,以通知形式展示在通知面板,提示用户收到消息。
- 如果由融云自建推送通道(RongPush)发送提醒,该提醒一般由 SDK 调用系统 API 构建通知后弹出。注意,RongPush 在国内大部分机型上无法存活。建议应用程序集成第三方厂商的推送服务。
用户点击推送通知后再次与融云服务端建立 IM 连接后,SDK 会有如下行为:
- 自动收到离线期间的单聊、群聊离线消息?。服务端默认缓存 7 天未收取的离线消息。
- 自动收到离线期间超级群会话中最后一条消息,应用程序需要自行拉取离线期间的历史消息。
注意
应用程序处于后台且活跃时,用户仍处于在线状态,SDK 仍可实时收到会话消息,消息送达过程中不会使用任何推送服务,因此用户设备不会收到来自任何推送服务的通知。如果使用 IMLib,应用程序需要自行调用系统 API 创建并弹出本地通知。如果使用 IMKit,SDK 默认会调用系统 API 创建并弹出本地通知。
不落地通知
融云支持直接通过服务端 API 向客户端发送远程推送通知,称为不落地通知?。不落地通知中不包含任何会话消息,无论客户端 App 是否在前台,所有通知内容始终仅会以通知形式展示在系统通知栏中,用户无法在任何聊天会话中看到不落地通知的内容。
不落地通知始终通过推送通道下发数据,因此 依赖应用程序集成第三方厂商推送服务,或者在客户端启用 RongPush。
- 如果由第三方厂商推送服务发送提醒,该提醒一般由系统直接弹出,以通知形式展示在通知面板,提示用户收到消息。
- 如果由融云自建推送通道(RongPush)发送提醒,该提醒一般由 SDK 调用系统 API 构建通知后弹出。注意,RongPush 在国内大部分机型上无法存活。建议应用程序集成第三方厂商的推送服务。
不落地通知仅支持通过服务端 API 发送,例如:
目前不支持通过控制台发送不落地通知(仅部分旧账号仍保留该能力)。
无法推送以及推送受限的情况
- 因聊天室业务设计特点,仅当聊天室中的用户在线时才会收到聊天室会话中的消息,因此聊天室消息不支持离线消息推送。
- 客户端调用了
logout方法,或在disconnect时设置了不允许推送,或通过设置 SDK 的初始化配置中的enablePush参数为false,向融云服务申请禁用推送服务(当前设备),导致彻底注销用户在融云服务端的登录信息。这种情况下,用户无法通过任何推送通道收到通知。 - 即使用户的所有移动端设备均已离线,只要用户仍在 Web/PC 端在线,此时融云认为用户在线,默认不会给移动端发送推送通知。如有需要,您可以在控 制台功能配置页面调整 Web/PC 在线手机端接收 Push 开关设置。
- 即使用户的移动端应收到推送通知,融云服务端不会向所有已登录过移动端设备均发送推送,仅会向最后一个登录的设备发送推送通知。
- 已触发第三方厂商推送服务的频率、数量限制。为改善终端用户推送体验,部分第三方推送服务(例如华为、vivo)已对推送消息的分类进行数量和频率管控。建议您充分了解第三方的管理细则。
- 因超级群业务中普通消息的数量较大,为控制离线推送频率,默认每分钟针对单个用户的单个超级群,每个频道最多产生 1 条推送。默认普通消息累计 2 条时才会触发推送。@ 消息不受此限制。。
注意
用户必须至少在设备上连接成功过一次,该设备才能接收推送。
注册推送广播接收组件
在主工程的 AndroidManifest.xml 中注册 PushMessageReceiver,用于接收推送相关的事件广播。
<receiver
android:name="io.rong.push.notification.PushMessageReceiver"
android:exported="true">
<intent-filter>
<action android:name="io.rong.push.intent.MESSAGE_ARRIVED" />
<action android:name="io.rong.push.intent.MESSAGE_CLICKED" />
<action android:name="io.rong.push.intent.THIRD_PARTY_PUSH_STATE" />
</intent-filter>
</receiver>