1. 小米推送介绍(着急集成移步第二节)
1.
小米推送类型?
支持通知栏提醒
(不需要应用驻留后台)和透传消息
两种类型,同时提供运营平台
及API
两种推送消息下发方式
2.
小米推送样式?
MIUI10(目前最新版本MIUI12.5)
以上,同一个App的所有通知栏消息会聚合成一个消息组,消息组最多支持展示10条消息,超过10条消息,会自动删除一条最老的消息并补上来一条新消息
3.
小米推送实现方式?
小米推送支持标签(Topic)、RegID、别名(Alias)、Useraccount
四种消息发送方式
目前APP常用的推送是RegID推送
4.
基于 RegID的推送
RegID
是小米推送为每个设备上的每个app注册推送服务时生成的唯一标识
RegID是在客户端向小米推送服务注册时,小米推送服务端根据设备标识、AppID以及当前时间戳生成,因此能够保证每个设备上每个app对应的regID都是不同的
PS: RegID在应用卸载或清除本地数据后会重新生成
5.
自MIUI 9开始,新增了通知过滤的功能
通知过滤是指通过分析用户对通知的操作,来个性化地确定通知的重要与不重要,然后将不重要的通知收纳进一个统一的页面。
6.
MIUI 10
MIUI 10 通知栏基于 Android O 做了重构,大大增强了通知栏的能力
通知类别 (Channel) 适配说明
通知类别 (channel) 是 Android O 引入的新功能,旨在解决以下问题:
- 应用的通知越来越多,给用户造成明显打扰
- 但用户只能全局屏蔽这个应用的全部通知,不能屏蔽部分,然后留下对自己有用的
7.
通知样式
注: 在MIUI中,由于通知栏是由小米服务框架弹出,因此大、小图标均不可自定义。使用的声音资源必须先内置在应用程序的安装包中。
2. 集成小米Push
题外话: 小米推送客户端SDK集成很简单,仅需一位工程师
0.5天的时间即可完成,不知真假:)
了解步骤之前先下载第3点的SDK,我这边是选择AAR方式集成
1.
项目app module的 build.gradle 中添加依赖
android{
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
implementation (name: 'MiPush_SDK_Client_xxx', ext: 'aar')
}
2.
为了接收消息,您需要为APP自定义一个继承自 PushMessageReceiver 类的BroadcastReceiver
<!-- Mi Push -->
<!-- com.example.mi.MiMessageReceiver 中 com.example 替换为自己APP的包名 -->
<receiver
android:name="com.example.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.ERROR" />
</intent-filter>
</receiver>
<!-- Mi Push -->
注意:请务必确保该自定义BroadcastReceiver所在进程与调用注册推送接口(MiPushClient.registerPush())的进程为同一进程(强烈建议都在主进程中)
后续需要推送消息的注册ID
(regId)等都会在这个Recevier中回调
3.
应用调用MiPushClient
类的静态方法registerPush
注册小米推送服务
/**
* 2. 小米
* <p>
* 注册 Mi Push 服务,注册成功后会向 MiMessageReceiver 发送广播
* 可以从 MiMessageReceiver 的 onCommandResult 方法中 MiPushCommandMessage 对象参数中获取注册信息
*
* @param mResult
*/
public void initMiService(MethodChannel.Result mResult) {
if (shouldInit()) {
MiPushClient.registerPush(this, MI_APP_ID, MI_APP_KEY);
}
LoggerInterface newLogger = new LoggerInterface() {
@Override
public void setTag(String tag) {
// ignore
}
@Override
public void log(String content, Throwable t) {
CLog.i(TAG, content);
}
@Override
public void log(String content) {
CLog.i(TAG, content);
}
};
Logger.setLogger(this, newLogger);
}
4.
注册结果将通过PushMessageReceiver
继承类的onCommandResult
方法中的MiPushCommandMessage
参数对象message
传到客户端。当message对象的command
等于MiPushClient.COMMAND_REGISTER
,并且message对象的resultCode
等于ErrorCode.SUCCESS
时,message对象commandArguments
包含了服务器返回的regId
。regId
即是当前设备app的唯一标示。您可以将regId
上传到自己的服务器,方便向其发消息。
在啰嗦一句,regId
是由服务器端生成的,能够唯一标识某台手机上的某个应用。 应用在获取到regId
后,需要将regId
上报到应用的服务器,此时应用服务端就可以利用regId
向客户端发送消息
5.
消息到达客户端后会弹出通知,点击通知消息,会回调 onReceiveMessage
/**
* 新版实现的接口访方法有更新;
*
* @param context
* @param message
*/
@Override
public void onReceiveMessage(Context context, MiPushMessage message) {
if (message.getPassThrough() == 0) {
Log.i(TAG, "message.getContent(): " + message.getContent());
Log.i(TAG, "message " + message.toString());
if (!TextUtils.isEmpty(message.getContent())
&& message.isNotified()) {
try {
JSONObject openCallback = new JSONObject(
message.getContent());
Log.i(TAG, "openCallback: " + openCallback.toString());
// 启动对应APP...... 这里如果不写逻辑的话,点击通知栏的消息,启动不了APP的,切记
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
6.
小提示
1.
对开发者而言,使用客户端SDK可以完成两方面功能:
- 客户端给服务器发送各种请求(对应
MiPushClient
的接入类)。 - 服务器给客户端发送的消息和对客户端请求的响应(对应
PushMesssageReceiver
的实现类)。
2.
当成功集成小米推送过后,服务端构建消息时,可以通过设置EXTRA_PARAM_NOTIFY_FOREGROUND
的值设置为"0"或者"1",来确定是否应用处于前台时弹出通知栏消息;
3. 参考
1.
SDK下载
4.
Android客户端SDK集成指南(AAR版) (推荐方式)
5.
服务端Java SDK文档(速度发给你们的服务端小伙伴)
6.
推送SDK版本更新
7.
媒体通知是Android标准通知样式的一种,自 API 21(Android 5.0) 引入,方便用户直接控制媒体内容,常见于音乐类、广播类应用。
8.
应用角标
9.
推送服务启用指南
10.
小米推送消息限制说明