跳转至

小米

准备工作

一 前往小米开放平台 注册账号,通过认证后创建应用,并记录下应用的 AppID、AppKey、AppSecret。

二 前往融云开发者后台,在“应用标识 -> Android -> 小米推送设置” 一栏中,填写上一步在小米开放平台申请的应用 AppSecret 以及通知标题。

设置 AppSecret 后,即表示开通小米推送功能,在小米 ROM 上面会优先使用系统级别的小米推送,从而提高推送到达率。如不想使用小米推送,将设置项保存为空即可,设置 30 分钟后生效。

小米推送通知标题,是指手机端接收到小米推送后需要展示的通知标题。

接入流程

导入推送 SDK

请从小米开放平台 或者融云官网下载小米 SDK ,并将小米 SDK jar 导入到你的应用 module 的 libs 目录下,然后右键-》Add as library

添加推送配置

在应用 module 的 AndroidManifest.xml 文件下增加如下配置

<!-- 小米 配置开始 < -->
<permission
android:name="${applicationId}.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.MIPUSH_RECEIVE" /> <!-- 小米 配置结束 < -->

application 节点增加配置如下的服务和广播:

<!-- 小米 配置开始 < -->
 <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必须在2.2.5版本以后(包括2.2.5版本)加入-->

 <service
     android:name="com.xiaomi.push.service.XMJobService"
     android:enabled="true"
     android:exported="false"
     android:permission="android.permission.BIND_JOB_SERVICE" />
 <!--注:此service必须在3.0.1版本以后(包括3.0.1版本)加入-->

 <receiver android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" android:exported="true">
   <intent-filter>
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
     <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>
 </receiver>
 <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>
 <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>
 <!-- 小米 配置结束 < -->
启用推送服务

最后,在调用融云初始化 API (即 RongIM.init() 或 RongIMClient.init()) 之前,新建一个 PushConfig 对象,通过 PushConfig.Builder.enableMiPush() 配置小米推送,并通过 RongPushCient.setPushConfig() 设置到 SDK 中。

PushConfig config = new PushConfig.Builder()
        .enableMiPush("", "")
        .build();
RongPushClient.setPushConfig(config);
RongIM.init(this);

至此,小米推送适配完成。 现在可以将 APP 安装至小米设备上,进行消息推送的测试。

推送通知事件

一 通知方式

由于小米的透传推送,要求应用在后台处于启动状态,这样不能保证推送的及时性,所以在使用小米推送时,我们默认使用的是小米通知栏推送方式,即由小米系统直接弹出通知。所以不支持自定义通知显示。

二 捕捉通知到达事件

您可以通过融云 SDK 快速集成时,自定义的广播接收器的 onNotificationMessageArrived() 来捕捉通知到达事件。如下所示:

public class 自定义的广播接收器 extends PushMessageReceiver {
  @Override
  public boolean onNotificationMessageArrived(Context context, PushType pushType, PushNotificationMessage pushNotificationMessage) {
    //此时通知已由小米系统弹出并显示,仅可以在此处捕捉 pushNotificationMessage 中的相关信息。
    return false;
  }
  ...
}
备注 :上面事件的回调,需要用户打开自启动权限。

三 自定义通知点击事件

使用小米推送时,在小米手机上点击推送通知,默认打开会话列表页面。

您也可以通过融云 SDK 快速集成时,自定义的广播接收器的 onNotificationMessageClicked() 回调中,自定义通知点击事件。如下所示:

public class 自定义的广播接收器 extends PushMessageReceiver {
  ...
  @Override
  public boolean onNotificationMessageClicked(Context context, PushType pushType, NotificationMessage message) {
    //实现您自定义的通知点击跳转逻辑
    return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。
  }
}

在以上方法中会发送广播并触发继承 PushMessageReceiver 类的 onNotificationMessageClicked 方法。 在此方法中的参数 PushNotificationMessage 中可以获得以下信息

String pushId;    //对应推送消息的唯一Id,如果是消息转push,则为消息的uid
RongPushClient.ConversationType conversationType;  //会话类型
String objectName;  // 消息类型:RC:Txt RC:Img ...
String senderId;  // 发送者ID
String senderName; // 发送者名称
Uri senderPortrait;  //发送者头像地址
String targetId;        // 目标Id。ex: 群里的某人发了一条消息,则targetId为群Id,senderId为群里的这个用户的Id。
String targetUserName;  //目标名字。
String toId; //该推送的目标用户。
String pushTitle;  //推送消息的标题
String pushContent; //推送消息内容
String pushData;    // 客户端发送push消息时的附加字段
String isFromPush;  //是push消息时为true, 后台消息时为false
PushSourceType sourceType; //推送来源。

当重写 onNotificationMessageClicked 返回 false 时, SDK 会以以下 action 进行跳转 Activity

rong://【你的 ApllicationId】/conversation/private?targetId=【目标 targetId】&title=【推送标题】&isFromPush=true

当在 AndroidManifest.xml 中,您的会话界面 Activity 中加入 Intent-filter 进行拦截即可跳转

<activity
    android:name="您的会话界面 Activity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data
            android:host="你的 ApllicationId"
            android:path="/conversation/"
            android:scheme="rong" />
    </intent-filter>
</activity>

冲突处理

如果应用本身的业务体系已接入了小米推送,在通过融云接入小米推送时,会导致继承自小米 PushMessageReceiver 的自定义广播和融云 MiMessageReceiver 冲突。

这时候需要将继承自小米 PushMessageReceiver 的广播改为继承自融云 SDK 中的 MiMessageReceiver。在回调事件中判断如果是融云业务,调用父类方法,否则调用自身业务逻辑。另

外还需要在 AndroidManifest.xml 里将 MiMessageReceiver 改为您自定义的广播接收器名称。