更新时间: 2021-03-08
# 功能描述
IMLib 中已经内置了推送功能 RongPush. RongPush 是通过在云端和客户端之间维护一条稳定可靠的长链接通道,从云端发送各类消息至客户端并以通知形式展现的服务。应用被杀掉或者调用了 SDK 中的 disconnect 方法后, 也想接收到消息, 那就需要集成推送功能.
国内应用
由于国内手机厂商的限制, RongPush 在国内部分机型上无法存活. 为了更好的推送体验, 应用需集成手机厂商的三方推送. 目前融云以适配集成了 小米、华为、魅族、OPPO、vivo 三方推送.
国外应用
国外应用需集成 FCM.
- SDK 2.9.9 版本开始,融云推送功能进行升级,集成方式请参考以下文档说明。如使用的是 2.9.9 之前的 SDK 集成可参考 集成文档 (opens new window).
- 须先集成融云 IMKit 或 IMLib SDK , 才能正常使用推送功能.
# 推送通道策略
SDK 内部优先注册使用当前机型厂商的三方推送, 三方推送注册成功, 则会使用三方推送; 当没有集成三方推送或集成失败, 则会使用融云推送.
融云推送属于应用级别的推送,会受系统各种权限限制,需在设置里打开自启动权限和通知权限,或者勾选 信任此应用 等,以提高推送到达率。
# 集成推送
集成 IMLib SDK. 详细可查看 IMLib 快速集成
在 融云开发者后台 -> 应用标识 -> Android -> ApplicationID 一栏填写应用的唯一标识。
# 启用推送服务
在 SDK init 之前, 配置使用推送.
PushConfig config = new PushConfig.Builder() .build(); RongPushClient.setPushConfig(config);
已复制
2
3
# 混淆脚本
详细可参考 混淆
# 通知设置
# 通知显示
SDK 内部已经实现了接收到 RongPush 推送消息后显示通知栏的逻辑.
# 修改内容样式
SDK 内部实现了两种通知栏内容显示样式.
- 内容为 "您有了一条新消息". 此为默认显示内容.
- 显示具体的内容.
- 只有接收到单人发送的消息通知, 内容则为 “xxx 发了xxx 条消息”
- 接收到多人的消息通知时, 内容则为 “xxx 个人发送了 xxx 条消息”
三方推送, 由于系统限制. 有些则是一条消息一个通知栏.
两个通知内容可以进行切换设置.
切换步骤
- 在 init 后设置内容显示格式.
// 是否显示 Push 内容, {@code true} 显示 , {@code false} 不显示 boolean showStatus = true; RongIM.getInstance().setPushContentShowStatus(boolean showStatus, OperationCallback callback)
已复制
2
3
4
5
- 提交工单 (opens new window), 通知客服人员开通或关闭显示 Push 通知内容的功能设置.
# 自定义通知
当 SDK 中默认通知栏无法满足需求, 可自定义通知栏.
- 创建 CustomPushMessageReceiver 集成 PushMessageReceiver 类.
class CustomPushMessageReceiver extends PushMessageReceiver { ... }
已复制
2
3
4
- 在主工程的
AndroidManifest.xml
中注册广播组件.
<receiver android:name="xxx.CustomPushMessageReceiver" 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>
已复制
2
3
4
5
6
7
8
9
- 注册完成广播后, 可在创建的 CustomPushMessageReceiver 类中复写 onNotificationMessageArrived 方法. 在此方法中做拦截, 然后实现跳转逻辑.
参数说明
参数 | 类型 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|
context | Context | 是 | 上下文对象 | |
pushType | PushType | 是 | 推送类型 | |
notificationMessage | PushNotificationMessage | 是 | 推送消息 |
class CustomPushMessageReceiver extends PushMessageReceiver { @Override public boolean onNotificationMessageArrived(Context context, PushType pushType, PushNotificationMessage notificationMessage) { // 可通过 pushType 判断 Push 的类型 if (pushType == PushType.RONG) { //实现您自定义的通知点击跳转逻辑 return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。 } return false; } }
已复制
2
3
4
5
6
7
8
9
10
11
12
# 通知点击事件
# 配置跳转界面
融云 SDK 内部已经实现了点击 知栏跳转功能. 点击通知栏时,融云 SDK 会以隐式调用的方式发出相应 intent。所以需要在 AndroidManifest.xml
里进行如下配置:
a. 只有一个联系人发来一条或多条通知时,点击通知默认跳转到会话 Activity。在会话 Activity 中配置如下 intnt-filter
即可跳转到当前 Activity。
<activity android:name="您的会话 activity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host=""${applicationId}"" android:pathPrefix="/conversation/" android:scheme="rong" /> </intent-filter> </activity>
已复制
2
3
4
5
6
7
8
9
10
11
12
13
b. 多个联系人发来多条通知时,这些通知会折叠显示,点击该通知会跳转到会话列表 Activity。在 AndroidManifest.xml
的会话列表 Activity 中配置如下 intent-filter
即可跳转到当前 Activity。
<activity android:name="您的会话列表 activity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host=""${applicationId}"" android:pathPrefix="/conversationlist" android:scheme="rong" /> </intent-filter> </activity>
已复制
2
3
4
5
6
7
8
9
10
11
12
c. 当从融云开发者后台广播推送-广播消息-推送中,发起远程推送时,该推送通知会独立显示,在 AndroidManifest.xml
里进行如下配置即可跳转到当前 Activity。
<activity android:name="自定义 activity" android:exported="true" android:launchMode="singleTask" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host=""${applicationId}"" android:pathPrefix="/push_message" android:scheme="rong" /> </intent-filter> </activity>
已复制
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 自定义点击跳转
当 SDK 中默认跳转无法满足需求, 可自定义跳转.(对于某些推送, 如果不继承PushMessageReceiver可能会导致通知弹不出来。请一定在项目中继承PushMessageReceiver).
- 创建 CustomPushMessageReceiver 集成 PushMessageReceiver 类.
class CustomPushMessageReceiver extends PushMessageReceiver { ... }
已复制
2
3
4
- 在主工程的
AndroidManifest.xml
中注册广播组件.
<receiver android:name="xxx.CustomPushMessageReceiver" 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>
已复制
2
3
4
5
6
7
8
9
- 注册完成广播后, 可在创建的 CustomPushMessageReceiver 类中复写 onNotificationMessageClicked 方法. 在此方法中做拦截, 然后实现跳转逻辑.
参数说明
参数 | 类型 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|
context | Context | 是 | 上下文对象 | |
pushType | PushType | 是 | 推送类型 | |
notificationMessage | PushNotificationMessage | 是 | 推送消息 |
class CustomPushMessageReceiver extends PushMessageReceiver { @Override public boolean onNotificationMessageClicked(Context context, PushType pushType, PushNotificationMessage notificationMessage) { // 可通过 pushType 判断 Push 的类型 if (pushType == PushType.XIAOMI) { //实现您自定义的通知点击跳转逻辑 return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。 } else if (pushType == PushType.HUAWEI) { //实现您自定义的通知点击跳转逻辑 return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。 } else if (pushType == PushType.MEIZU) { //实现您自定义的通知点击跳转逻辑 return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。 } else if (pushType == PushType.VIVO) { //实现您自定义的通知点击跳转逻辑 return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。 } else if (pushType == PushType.OPPO) { //实现您自定义的通知点击跳转逻辑 return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。 } else if (pushType == PushType.GOOGLE_FCM) { //实现您自定义的通知点击跳转逻辑 return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。 } else if (pushType == PushType.RONG) { //实现您自定义的通知点击跳转逻辑 return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。 } return false; } }
已复制
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31