跳到主要内容

集成小米推送

按照本指南集成小米 Mi Push 国内版或海外版 ,让融云 SDK 支持小米推送。

在集成第三方推送前,请确保已在融云控制台配置 Android 应用 ID。详见推送集成概述

提示

IMLib SDK 从 5.6.8 开始支持小米海外推送服务。

在融云控制台配置小米推送

如果想通过小米推送通道从融云服务端接收推送通知,您需要在融云控制台上提供您的小米推送应用的详细信息。

  1. 前往小米开放平台,选择您当前的项目所对应的小米应用,点击应用信息,并记录下应用的 AppIDAppKeyAppSecret
提示

如果没有小米开发者账号,或尚未创建应用,参考小米推送文档:

(width=600)

(height=400)

其中 AppSecret 是小米推送服务器端的身份标识,在使用小米推送服务端 SDK 向客户端发送消息时使用,需要在融云控制台的小米推送配置中提供给融云。AppId 和 AppKey 是小米推送客户端的身份标识,后续在启用小米推送服务时需要提供给融云 SDK,用于初始化小米推送客户端 SDK。

  1. 打开融云控制台,前往在应用标识页面。点击设置推送,找到 Android > 小米推送,填入上一步获取的 AppSecret

    (height=400)

  2. (可选)配置小米推送通知标题。设置默认的推送通知标题。一般情况下客户端发送消息转 Push 时不使用此标题设置。在调用融云服务端 API /push.json/push/user.json/push/custom.json 接口推送通知时,如未传入通知标题,则使用该处设置的标题。从服务端发消息时,如果发送用户 ID 在融云服务端没有用户名,也会使用此 “推送通知标题”。

  3. 选择推送通道类型。小米推送的消息类型,分为普通消息和通知消息,查看小米推送消息限制明文档

    • 普通消息,融云默认使用的小米推送通道,有限制。
    • 通知消息,无限制。需要填写小米后台申请的 channelId。
  4. 保存设置。所有设置 30 分钟后生效。

您已完成需要融云控制台小米推送配置的全部内容。现在可以设置客户端集成。

配置客户端接收小米推送

  1. 首先,需要将小米推送客户端 SDK 添加到您的 Android 项目。您需要手动下载小米推送客户端 SDK 并加到项目中。

提示
  • 如果您项目使用的 IMLib/IMKit SDK 版本大于等于 5.2.1,必须使用小米推送客户端 SDK 4.9.1 及以上版本。
  • 由于 Android 12 通知 trampoline 限制,对于 targetSdkVersion >= 31 的应用,需要接入SDK 4.9.1及以上版本,否则会出现点击通知无法正常跳转的情况。
  • 小米推送客户端 SDK 区分中国大陆地区与海外地区,请从对应小米官方文档中下载正确的版本。
  1. 在 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。否则两者会发生冲突。

请如下步骤进行处理:

  1. 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>
  2. 在应用自行实现的广播接收器中,增加针对融云业务的推送处理代码。以下示例中 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 之前,将小米的 AppIDAppKey 添加到 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 创建成功后,可以前往融云控制台进行配置。设置成功后,所有小米手机用户离线状态下接收的该类型消息,都会使用设置的 Channel ID 进行推送,提醒铃声为注册 Channel 时设置的自定义铃声。

  1. 前往融云控制台 > 自定义推送铃声页面。

  2. 切换至小米,点击添加

  3. 选择 ApplicationId,为消息类型指定对应的 Channel ID 和自定义推送铃声文件路径。

    (height=300)

    设置成功后,所有小米手机用户离线状态下接收的该类型消息,都会使用设置的 Channel ID 进行推送,提醒铃声为注册 Channel 时设置的自定义铃声。

提示

音频文件需要打包到应用中,存放在应用 raw 目录下,存储的声音文件需要有扩展名,但是不要把扩展名写在 uri 中。当小米手机接收音视频推送消息时,自动读取设置的文件进行声音提醒。