集成小米推送
更新时间: 2024/05/24 17:46:23
NIM SDK 3.2.0 之后版本新增支持小米推送。
本文主要介绍如何集成小米厂商的离线推送通道,使消息通过小米推送服务离线推送至未在线的用户。
集成流程
步骤 1:在小米开放平台创建应用并启用推送服务
若已在小米开放平台创建应用,则忽略该步骤。更多小米推送服务的信息请参考推送服务启用指南。
-
在小米开放平台 注册开发者账号并完成认证,详情请参考企业开发者账号注册指南。
-
登录小米开发者后台,在应用服务中选择消息推送。
-
单击创建应用,填写应用名称和包名,选择应用分类后,单击创建。
-
在推送服务应用列表中,单击目标应用操作栏中启用推送,进入消息推送启用页面。
-
阅读《小米推送技术服务协议》和《小米推送技术服务数据保护附录》。勾选同意接受,单击启用。
-
启用推送服务后,在应用管理 -> 应用信息页面可查看该应用的 AppID、AppKey、AppSecret 等信息。
步骤 2:在云信控制台添加小米推送证书
-
在云信控制台首页应用管理选择应用进入应用配置页面,单击证书管理页签。
-
在Android推送证书下单击添加证书,选择证书类型为小米,配置小米推送相关信息。
云信推送证书字段 对应小米应用的字段信息 证书名称 用户自定义推送证书名称,最大 32 字符
对应初始化 NIM SDK 时需传入的推送证书信息中的 xmCertificateNam应用包名 对应小米应用的主包名,最大 1000 字符 AppSecret 对应小米应用的 AppSecret,最大 5000 字符 -
根据界面提示,在该对话框内配置证书类型和证书名称等信息。
步骤 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
。
-
下载 MiPush Android SDK。
-
将下载到的 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 文件,添加对应权限。
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,不需要做任何改动。
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.** {*;}
集成须知:推送兼容性
若您的自身业务体系,也需要接入小米推送,则需要考虑自身业务体系的小米推送与云信消息的小米推送兼容。
兼容需要完成以下两个步骤:
-
新建广播接收器。
对于小米推送,为了接收推送消息,小米 SDK 要求您自定义一个继承自
PushMessageReceiver
的BroadcastReceiver
,并注册到 AndroidManifest.xml 文件。由于小米的特殊处理,同时注册多个继承自PushMessageReceiver
的BroadcastReceiver
会存在收不到消息的情况,要保证自身业务体系的小米推送与云信消息的小米推送兼容,您需要新建广播接收器,从继承PushMessageReceiver
改为继承MiPushMessageReceiver
。MiPushMessageReceiver
为云信提供,推送消息首先被 NIM SDK 接收,如果是自身体系的推送消息,NIM SDK 会将消息传递给MiPushMessageReceiver
。java
/** * 以下这些方法运行在非 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) { } }
-
配置新广播的名称。
在将广播接收器改为继承
MiPushMessageReceiver
之后,将该广播在 AndroidManifest.xml 中配置如下,您只需将广播名称MiPushMessageReceiver
替换成自身的广播名。此外,请不要为此 Receiver 配置priority
。xml
<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
。
-
您可以直接在控制台上配置默认的推送消息类型。
-
在控制台首页应用管理中选择应用,然后单击 IM 即时通讯下的功能配置按钮进入功能配置页。
-
在顶部选择基础功能页签,选择第三方厂商消息分类,并单击子功能配置。
-
选择对应的第三方厂商,单击编辑,输入
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上安装且通知开启”的定义:用户已激活应用且主动开启了总消息通知的开关。
- 单日推送限额数以“送达量”计算,当日送达量超限则会计入管控。