集成小米推送
按照本指南集成小米 Mi Push 国内版或海外版 ,让融云 SDK 支持小米推送。
在集成第三方推送前,请确保已在融云控制台配置 Android 应用 ID。详见推送集成概述。
IMLib SDK 从 5.6.8 开始支持小米海外推送服务。
在融云控制台配置小米推送
如果想通过小米推送通道从融云服务端接收推送通知,您需要在融云控制台上提供您的小米推送应用的详细信息。
- 前往小米开放平台,选择您当前的项目所对应的小米应用,点击应用信息,并记录下应用的 AppID、AppKey、AppSecret。
如果没有小米开发者账号,或尚未创建应用,参考小米推送文档:
- 中国大陆地区 - 推送服务启用指南
- 海外版 - Push Service Activation Guide 。目前,小米在印度孟买、德国法兰克福、俄罗斯莫斯科和新加坡设有数据中心,请选择合适的地域创建应用。
其中 AppSecret 是小米推送服务器端的身份标识,在使用小米推送服务端 SDK 向客户端发送消息时使用,需要在融云控制台的小米推送配置中提供给融云。AppId 和 AppKey 是小米推送客户端的身份标识,后续在启用小米推送服务时需要提供给融云 SDK,用于初始化小米推送客户端 SDK。
-
打开融云控制台,前往在应用标识页面。点击设置推送,找到 Android > 小米推送,填入上一步获 取的 AppSecret。
-
(可选)配置小米推送通知标题。设置默认的推送通知标题。一般情况下客户端发送消息转 Push 时不使用此标题设置。在调用融云服务端 API
/push.json
、/push/user.json
、/push/custom.json
接口推送通知时,如未传入通知标题,则使用该处设置的标题。从服务端发消息时,如果发送用户 ID 在融云服务端没有用户名,也会使用此 “推送通知标题”。 -
选择推送通道类型。小米推送的消息类型,分为普通消息和通知消息,查看小米推送消息限制明文档。
- 普通消息,融云默认使用的小米推送通道,有限制。
- 通知消息,无限制。需要填写小米后台申请的 channelId。
-
保存设置。所有设置 30 分钟后生效。
您已完成需要融云控制台小米推送配置的全部内容。现在可以设置客户端集成。
配置客户端接收小米推送
-
首先,需要将小米推送客户端 SDK 添加到您的 Android 项目。您需要手动下载小米推送客户端 SDK 并加到项目中。
-
融云官网 SDK 下载页提供小米推送客户端 SDK 下载。在页 面勾选第三方推送后,下载 zip 文件。在解压后的文件目录中找到 pushlibs 下的小米推送客户端 SDK 文件(
MiPush_SDK_Client_xxx.jar
,4.9.1)。拷贝 .jar 文件到 app 的libs
目录下。 -
如需获取最新版小米推送客户端 SDK,可以从小米直接获取。MiPush Android 客户端 SDK 从 5.0.1 版本开始,提供 AAR 包接入方式。
- 参考小米文档 Android 客户端 SDK 集成指南(JAR版)
- 参考小米文档 Android 客户端 SDK 集成指南(AAR版)(中国大陆)
- 参考小米文档 Android 客户端 SDK 集成指南(AAR版)(非中国大陆)
-
- 如果您项目使用的 IMLib/IMKit SDK 版本大于等于 5.2.1,必须使用小米推送客户端 SDK 4.9.1 及以上版本。
- 由于 Android 12 通知 trampoline 限制,对于 targetSdkVersion >= 31 的应用,需要接入SDK 4.9.1及以上版本,否则会出现点击通知无法正常跳转的情况。
- 小米推送客户端 SDK 区分中国大陆地区与海外地区,请从对应小米官方文档中下载正确的版本。
-
在 App 的
build.gradle
中添加依赖:-
如果集成 jar 文件:
dependencies {
implementation files('libs/MiPush_SDK_Client_xxx.jar')
} -
如果集成 aar 文件:
dependencies {
implementation (name: 'MiPush_SDK_Client_xxx', ext: 'aar')
}
-
处理小米推送的权限、服务与广播接收器(JAR版)
如果使用小米 Android 客户端 SDK 集成指南(JAR版),需要完成以下配置。AAR 版无需完成以下配置。
在主工程的 AndroidManifest.xml 中增加如下权限配置:
<permission
android:name="${applicationId}.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.MIPUSH_RECEIVE" />
如果应用 targetSdkVersion >= 31(Android 12),且接入的小米推送客户端 SDK 版本为 4.9.1 及以上,则需配置以下 Activity ,否则会出现点击通知 activity 无法启动的情况。
<activity
android:name="com.xiaomi.mipush.sdk.NotificationClickedActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:launchMode="singleInstance"
android:exported="true"
android:enabled="true">
</activity>
在主工程的 AndroidManifest.xml 中添加小米推送配置需要的 service 和 receiver:
<service android:name="com.xiaomi.push.service.XMPushService" android:enabled="true" />
<service android:name="com.xiaomi.mipush.sdk.PushMessageHandler" android:enabled="true" android:exported="true" />
<service android:name="com.xiaomi.mipush.sdk.MessageHandleService" android:enabled="true" />
<service
android:name="com.xiaomi.push.service.XMJobService"
android:enabled="true"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
<receiver android:name="com.xiaomi.push.service.receivers.PingReceiver" android:exported="false">
<intent-filter>
<action android:name="com.xiaomi.push.PING_TIMER" />
</intent-filter>
</receiver>
以上内容来自小米。如需了解更多细节,可参考小米推送客户端文档 Android 客户端 SDK 集成指南(JAR版)。
使用融云 SDK 提供的广播接收器
为了接收小米推送消息,必须实现一个继承自小米 PushMessageReceiver
类的广播接收器(Broadcast Receiver)。融云 SDK 已经实现了该广播接收器,您只需要将融云提供的 MiMessageReceiver
注册到AndroidManifest.xml 文件中,注册内容如下:
<receiver android:name="io.rong.push.platform.mi.MiMessageReceiver" android:exported="true">
<intent-filter>
<action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.ERROR" />
</intent-filter>
</receiver>
使用应用自定义的广播接收器
如果您的应用因自身业务需求已集成小米推送客户端,您将需要用 App 自定义的 Broadcast Receiver 替换融云 SDK 提供的 MiMessageReceiver
。否则两者会发生冲突。
请如下步骤进行处理:
-
在
AndroidManifest.xml
中,移除融云 SDK 实现的小米广播接收器(MiMessageReceiver
):<receiver android:name="io.rong.push.platform.mi.MiMessageReceiver" android:exported="true">
<intent-filter>
<action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.ERROR" />
</intent-filter>
</receiver> -
在应用自行实现的广播接收器中,增加针对融云业务的推送处理代码。以下示例中
MyMiPushMessageReceiver
为应用实现的继承自小米PushMessageReceiver
的广播接收器。/**
* 该类为应用实现的继承自小米 PushMessageReceiver 的广播接收器。
**/
public class MyMiPushMessageReceiver extends PushMessageReceiver {
...
@Override
public void onNotificationMessageClicked(Context context, MiPushMessage message) {
if(isRongPush()) { //此处为伪代码,应用需要根据业务自己实现。
//增加如下代码,处理融云业务对应推送。
PushNotificationMessage pushNotificationMessage = PushUtils.transformToPushMessage(message.getContent());
PushManager.getInstance().onNotificationMessageClicked(context, PushType.XIAOMI, pushNotificationMessage);
} else {
... //应用自身推送业务处理
}
}
@Override
public void onNotificationMessageArrived(Context context, MiPushMessage message) {
if(isRongPush()) { //此处为伪代码,应用需要根据业务自己实现。
PushNotificationMessage pushNotificationMessage = PushUtils.transformToPushMessage(message.getContent());
if (pushNotificationMessage != null) {
PushManager.getInstance().onNotificationMessageArrived(context, PushType.XIAOMI, pushNotificationMessage);
}
} else {
... //应用自身推送业务处理
}
}
@Override
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
String command = message.getCommand();
List<String> arguments = message.getCommandArguments();
String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);
String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null);
if (MiPushClient.COMMAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
if(isRongPush()){ //如果是融云业务,调用如下代码处理
PushManager.getInstance().onReceiveToken(context, PushType.XIAOMI, cmdArg1);
} else {
... //应用自身推送业务处理
}
} else {
if(isRongPush()){ //如果是融云业务,调用如下代码处理
PushManager.getInstance().onErrorResponse(context, PushType.XIAOMI, PushConst.PUSH_ACTION_REQUEST_TOKEN, message.getResultCode());
} else {
... //应用自身推送业务处理
}
}
}
}
}
混淆配置
如果您的应用使用了混淆,您可以使用下面的代码混淆配置:
-dontwarn com.xiaomi.mipush.sdk.**
-keep public class com.xiaomi.mipush.sdk.* {*; }
启用小米推送服务
请在初始化融云 SDK 之前,将小米的 AppID、AppKey 添加到 PushConfig
,并提供给 SDK。融云 SDK 将向小米推送服务注册、并将获取的小米推送 Token 上报给融云服务端。
PushConfig
为所有推送配置相关的入口类。
PushConfig config = new PushConfig.Builder()
.enableMiPush("小米 appId", "小米 appKey") //小米推送配置
.XXX //此处忽略其它三方推送配置
.build();
RongPushClient.setPushConfig(config); //将推送相关配置设置到 SDK
如果您使用小米海外推送服务,还需要调用小米推送客户端的 API,报告小米推送服务的地域。
MiPushClient.setRegion(region); // Global, Europe, Russia, India
自定义铃声设置
Android 8.0 以上手机需要设置 Channel 后,才能自定义推送铃声。
创建 Channel ID
配置自定义铃声前,请先参照小米文档创建 Channel ID:
- 使用小米开放平台上创建 Channel ID
- 使用小米服务端 API 创建 Channel ID
- 使用小米推送服务端 SDK 创建 Channel ID(此处仅提供小米 Push Server Java SDK 文档链接,其他语言请参照小米推送官方文档。)
配置自定义推送铃声
Channel ID 创建成功后,可以前往融云控制台进行配置。设置成功后,所有小米手机用户离线状态下接收的该类型消息,都会使用设置的 Channel ID 进行推送,提醒铃声为注册 Channel 时设置的自定义铃声。
-
前往融云控制台 > 自定义推送铃声页面。
-
切换至小米,点击添加。
-
选 择 ApplicationId,为消息类型指定对应的 Channel ID 和自定义推送铃声文件路径。
设置成功后,所有小米手机用户离线状态下接收的该类型消息,都会使用设置的 Channel ID 进行推送,提醒铃声为注册 Channel 时设置的自定义铃声。
音频文件需要打包到应用中,存放在应用 raw 目录下,存储的声音文件需要有扩展名,但是不要把扩展名写在 uri 中。当小米手机接收音视频推送消息时,自动读取设置的文件进行声音提醒。