IM 即时通讯
Android
开发指南

集成小米推送

更新时间: 2023/09/05 13:47:59

NIM SDK 3.2.0 之后版本新增支持小米推送。

本文主要介绍如何集成小米厂商的离线推送通道,使消息通过小米推送服务离线推送至未在线的用户。

集成流程

步骤 1:在小米开放平台创建应用并启用推送服务

若已在小米开放平台创建应用,则忽略该步骤。更多小米推送服务的信息请参考推送服务启用指南

  1. 小米开放平台 注册开发者账号并完成认证,详情请参考企业开发者账号注册指南

  2. 登录小米开发者后台,在应用服务中选择消息推送

    小米.png

  3. 单击创建应用,填写应用名称和包名,选择应用分类后,单击创建

    小米应用.png

  4. 在推送服务应用列表中,单击目标应用操作栏中启用推送,进入消息推送启用页面。

    小米应用列表.png

  5. 阅读《小米推送技术服务协议》和《小米推送技术服务数据保护附录》。勾选同意接受,单击启用

    小米推送启用.png

  6. 启用推送服务后,在应用管理 -> 应用信息页面可查看该应用的 AppID、AppKey、AppSecret 等信息。

    小米APPKey.png

步骤 2:在云信控制台添加小米推送证书

  1. 云信控制台首页应用管理选择应用进入应用配置页面,单击证书管理页签。

  2. Android推送证书下单击添加证书,选择证书类型为小米,配置小米推送相关信息。 小米推送.png)

    云信推送证书字段对应小米应用的字段信息
    证书名称用户自定义推送证书名称,最大 32 字符
    对应初始化 NIM SDK 时需传入的推送证书信息中的 xmCertificateNam
    应用包名对应小米应用的主包名,最大 1000 字符
    AppSecret对应小米应用的 AppSecret,最大 5000 字符
  3. 根据界面提示,在该对话框内配置证书类型和证书名称等信息。

步骤 3:导入小米推送 SDK

  • MiPush Android SDK 从 5.0.1 版本开始,提供 AAR 包接入方式,其支持的最低 Android SDK版本为 19。这里以 AAR 版接入为例,如需要接入 JAR 包,请参见Android客户端SDK集成指南(JAR版)
  • NIM SDK 开发版和稳定版当前兼容的 MiPush 版本为 MiPush_SDK_Client_5_6_2
  1. 下载 MiPush Android SDK。

  2. 将下载到的 MiPush_SDK_Client_xxx.aar 文件,拷贝到您的项目路径的 app/libs 目录下;然后在项目 APP module 的 build.gradle 中添加依赖:

    android{
        repositories {
        flatDir {
            dirs 'libs'
            }
        }
    }
    dependencies {
        implementation (name: 'MiPush_SDK_Client_xxx', ext: 'aar')
    }
    

步骤 4:AndroidManifest.xml 配置

在 app/src/main 目录中,打开 AndroidManifest.xml 文件,添加对应权限。

<!--配置权限,已配置过的条目则无须添加-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE"/>

<!--以下两处 {您的包名} 改为开发者自己的 App 的包名-->
<permission android:name="{您的包名}.permission.MIPUSH_RECEIVE"
            android:protectionLevel="signature" />
<uses-permission android:name="{您的包名}.permission.MIPUSH_RECEIVE" />

如下配置可直接拷贝至 AndroidManifest.xml,不需要做任何改动。

<!--配置的service和receiver-->
<service
    android:name="com.xiaomi.push.service.XMPushService"
    android:enabled="true"
    android:process=":pushservice"/>
<service
    android:name="com.xiaomi.push.service.XMJobService"
    android:enabled="true"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:process=":pushservice" />
    <!--注:此service必须在3.0.1版本以后(包括3.0.1版本)加入-->
<service
    android:enabled="true"
    android:exported="true"
    android:name="com.xiaomi.mipush.sdk.PushMessageHandler" />

<service android:enabled="true"
    android:name="com.xiaomi.mipush.sdk.MessageHandleService" />
<!--注:此service必须在2.2.5版本以后(包括2.2.5版本)加入-->
<receiver
    android:exported="false"
    android:process=":pushservice"
    android:name="com.xiaomi.push.service.receivers.PingReceiver" >
    <intent-filter>
        <action android:name="com.xiaomi.push.PING_TIMER" />
    </intent-filter>
</receiver>
<receiver
    android:name="com.netease.nimlib.mixpush.mi.MiPushReceiver"
    android:exported="true">
    <intent-filter android:priority="0x7fffffff">
        <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE"/>
        <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED"/>
        <action android:name="com.xiaomi.mipush.ERROR"/>
    </intent-filter>
</receiver>

步骤 5:防止代码混淆

如果您的应用使用了代码混淆,在 proguard-rules.pro 配置文件中添加以下配置以防止小米 SDK 的代码被混淆:

    -keep class com.xiaomi.** {*;}

集成须知:推送兼容性

若您的自身业务体系,也需要接入小米推送,则需要考虑自身业务体系的小米推送与云信消息的小米推送兼容。

兼容需要完成以下两个步骤:

  1. 新建广播接收器。

    对于小米推送,为了接收推送消息,小米 SDK 要求您自定义一个继承自 PushMessageReceiverBroadcastReceiver ,并注册到 AndroidManifest.xml 文件。由于小米的特殊处理,同时注册多个继承自 PushMessageReceiverBroadcastReceiver 会存在收不到消息的情况,要保证自身业务体系的小米推送与云信消息的小米推送兼容,您需要新建广播接收器,从继承 PushMessageReceiver 改为继承 MiPushMessageReceiverMiPushMessageReceiver 为云信提供,推送消息首先被 NIM SDK 接收,如果是自身体系的推送消息,NIM SDK 会将消息传递给 MiPushMessageReceiver

    /**
    * 以下这些方法运行在非 UI 线程中, 与小米SDK PushMessageReceiver 方法一一对应。
    * 如果自身也需要接入小米推送,则应将继承 PushMessageReceiver 改为继承 MiPushMessageReceiver
    */
    public class MiPushMessageReceiver extends BroadcastReceiver{
    
        @Override
        public final void onReceive(Context context, Intent intent) {
        }
    
        public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
        }
    
        public void onNotificationMessageClicked(Context context, MiPushMessage message) {
        }
    
        public void onNotificationMessageArrived(Context context, MiPushMessage message) {
        }
    
        public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
        }
    
        public void onCommandResult(Context context, MiPushCommandMessage message) {
        }
    
        public void onRequirePermissions(Context context, String[] strings) {
        }
    }
    
  2. 配置新广播的名称。

    在将广播接收器改为继承 MiPushMessageReceiver 之后,将该广播在 AndroidManifest.xml 中配置如下,您只需将广播名称 MiPushMessageReceiver 替换成自身的广播名。此外,请不要为此 Receiver 配置 priority

    <receiver android:name="xxx.MiPushMessageReceiver">
        <intent-filter>
            <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE"/>
            <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED"/>
            <action android:name="com.xiaomi.mipush.ERROR"/>
        </intent-filter>
    </receiver>
    

小米平台限制

小米通知渠道介绍

小米推送(Mipush)的通知渠道分为“私信消息”和“公信消息”两类,不同类别对应不同的权限,详情请参见小米推送消息分类新规

  • 公信消息适用于推送热点新闻、新品推广、平台公告、社区话题、有奖活动等,多为用户普适性的内容。
  • 私信消息适用于推送聊天消息、个人订单变化、快递通知、交易提醒、IOT 系统通知等与私人通知相关的内容,通知消息的推送数量不受限制。

小米推送对推送消息数量、推送速率 QPS 进行了统一管理,详情请参见小米推送消息限制说明

公信消息与私信消息限制说明:

消息类型 消息内容 用户接收数量限制 申请方式
默认 可按照小米的公信场景说明 单个应用单个设备单日一条 无需申请
公信消息 热点新闻、新品推广、平台公告、社区话题、有奖活动等,多用户普适性的内容 单个应用单个设备单日5-8条 需在小米推送平台申请,详情请参见channel 申请及接入方式
私信消息 聊天消息、个人订单变化、快递通知、交易提醒、IoT系统通知等与私人通知相关的内容 不限量 需在小米推送平台申请,详情请参见channel 申请及接入方式

2023年2月1日起将按照本新规中的消息分类正式运行。

消息推送类型配置

为了确保推送能正常提醒用户,需设置推送消息的类型 extra.channel_id

  • 您可以直接在控制台上配置默认的推送消息类型。

    1. 控制台首页应用管理选择应用进入应用配置页面,然后单击 IM即时通讯 专业版下的功能配置按钮进入 IM 即时通讯配置页。

    2. 在顶部选择基础功能页签,选择第三方厂商消息分类,并单击子功能配置

    3. 选择对应的第三方厂商,单击编辑,输入 channel_id保存

  • 也可以通过配置云信 NIM SDK 中消息体的 pushPayload 来实现。

    示例代码:

    Map<String, Object> pushPayload = new HashMap<>();
    pushPayload.put("channel_id", "您提供的channel_id");
    testMessage.setPushPayload(pushPayload);
    

对于传给小米推送平台的消息类型优先级:

  • 您上传的消息体的 pushPayload中有分类(channel_id)字段,则使用 pushPayload中的字段值。
  • 如果消息体的 pushPayload中未传入分类(channel_id)字段,则使用默认的推送消息类型(在云信控制台设置的消息类型)。
  • 如果消息体的 pushPayload中未传入分类(channel_id)字段,也没有在云信控制台上配置推送消息类型,则该推送消息不会添加分类字段。

限额说明

私信消息的单日推送数量不受限,公信消息的单日推送数量将进行上限管理,具体如下:

公信消息单日可推送总量的计算公式:应用在MIUI上安装且通知开启数x倍数。默认倍数为2倍,具备《互联网新闻信息服务许可证》的应用为3倍,具体如下所示。

通知开启数小于10000的按10000计数

公信消息限制倍数

是否具备《互联网新闻信息服务许可证》 单个应用单日单设备通知推送数量限制倍数(单位:倍) 单个设备单日单应用接收通知数量(单位:条)
3 8
2 5
  • “应用在MIUI上安装且通知开启”的定义:用户已激活应用且主动开启了总消息通知的开关。
  • 单日推送限额数以“送达量”计算,当日送达量超限则会计入管控。
此文档是否对你有帮助?
有帮助
去反馈
  • 集成流程
  • 步骤 1:在小米开放平台创建应用并启用推送服务
  • 步骤 2:在云信控制台添加小米推送证书
  • 步骤 3:导入小米推送 SDK
  • 步骤 4:AndroidManifest.xml 配置
  • 步骤 5:防止代码混淆
  • 集成须知:推送兼容性
  • 小米平台限制
  • 小米通知渠道介绍
  • 消息推送类型配置
  • 限额说明