811
阿里云
移动推送辅助通道配置__Android SDK手册_App SDK 手册_移动推送-阿里云
小米/华为系统推送支持
1.相关概念
- 辅助通道:移动推送针对小米、华为设备管控较严的情况特意接入华为,小米推送辅助通道以提高在华为、小米设备上的到达率。移动推送优先选择自有通道进行推送消息下发,只有在自有通道断连时选择辅助通道下发消息。当前辅助通道通过华为、小米推送下发透传消息,消息到达应用后经移动推送SDK处理后触发
onNotification
,onMessage
回调。小米、华为推送在下发透传消息时并不保证会拉起被杀死进程(相关机制可参考小米、华为推送官网),所以辅助通道在进程被杀死情况下无法保证消息一定到达。 - 小米弹窗:小米弹窗通过小米通道下发通知,可以在进程被杀死情况下推送成功。由于小米弹窗通过小米推送通知实现,因而通过小米弹窗下发的通知不会触发
onNotification
回调。当前小米弹窗到达率统计只覆盖用户点击小米弹窗推送通知的场景,未点击部分暂未覆盖。
2. 配置应用
- 在 小米开放平台 注册你的App, 得到相应的小米AppID,小米AppKey,小米AppSecert。在控制台
App详情
设置你的小米AppSecert。(注意:小米开发者平台的消息推送开关记得打开
) - 同理在 华为开发者联盟 注册App,应用审核通过后,能够得到华为的AppID和AppSecert。在控制台
App详情
中设置你的华为AppID和AppSecert。(注意,您的app不能是草稿状态,必须是审核中,或者通过审核的状态,不然通道不会生效。请确保您在华为控制台激活了推送通道功能)
3. 下载扩展包
将小米华为扩展包拷贝到你项目的Lib目录下,下载地址。
4. 配置Manifest
- 为小米特别通道新增配置
Permission
:
<!--小米通道相关权限 -->
<permission
android:name="你的包名.permission.MIPUSH_RECEIVE"
android:protectionLevel="signatureOrSystem"/>
<uses-permission android:name="你的包名.permission.MIPUSH_RECEIVE"/>
【注意】: 请确保上述Permission
配置是在manifest
标签域,而非application
标签域。关于AndroidManifest.xml应用清单文件的说明参考:https://developer.android.com/guide/topics/manifest/manifest-intro.html#filec
- 为小米特别通道新增配置Manifest:
<!-- 小米通道官方配置 -->
<service android:name="com.xiaomi.mipush.sdk.PushMessageHandler" android:enabled="true" android:exported="true" />
<service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService" />
<receiver android:name="com.alibaba.sdk.android.push.MiPushBroadcastReceiver" 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>
<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>
注意,com.xiaomi.push.service.XMPushService
加入Manifest后,这个类名会在Android Studio
中显示成红色,请忽略该错误,不要删除这行配置。(该应用在小米机器上会找到对应的Service)
- 为华为特别通道新增配置Manifest:
<!-- 华为通道官方配置 -->
<receiver android:name="com.alibaba.sdk.android.push.HuaWeiReceiver">
<intent-filter>
<action android:name="com.huawei.android.push.intent.REGISTRATION"/>
<action android:name="com.huawei.android.push.intent.RECEIVE"/>
<action android:name="com.huawei.intent.action.PUSH"/>
<action android:name="com.huawei.intent.action.PUSH_STATE"/>
</intent-filter>
</receiver>
5. Proguard配置
- 如果集成推送SDK的工程开启代码混淆,在Proguard配置的基础上,需要添加以下辅助通道的Proguard配置。
# 小米通道
-keep class com.xiaomi.** {*;}
-dontwarn com.xiaomi.**
# 华为通道
-keep class com.huawei.** {*;}
-dontwarn com.huawei.**
6. 在应用中初始化小米华为通道
将以下代码加入你application.onCreate()方法中初始通道:
// 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");
// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。
HuaWeiRegister.register(applicationContext);
本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
7. 在日志中查看初始化情况
华为通道初始化成功,可以看到以下日志:
11-11 22:21:33.671 30248-30324/com.xxx E/MPS:HuaWeiRegister: HuaWeiRegister checkDevice flag=true //确认是华为的手机
11-11 22:21:33.674 30248-30324/com.xxx E/MPS:HuaWeiRegister﹕ Register huawei push............ //开始注册华为手机
11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiReceiver﹕ huawei register success,token = 08657430243125472000000411000001
11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiReceiver﹕ report huaweiPushId intent... //完成华为注册和信息上报
小米通道初始化成功,可以看到以下日志:
12-09 22:20:39.710 19566-19566/com.xxx E/MPS:MiPushRegister: MiPushRegister checkDevice flag=true //确认是小米的手机
12-09 22:20:39.712 19566-19566/com.xxx E/MPS:MiPushRegister: Register mipush. //开始注册小米
12-09 22:20:40.596 19566-19733/com.xxx E/MPS:MiPushReceiver: XiaoMi register success. //小米注册成功 regid=d//igwEhgBGCI2TG6lWqlCesc0I6xE1wUhNCBXQ8uNOi/dDZioYXVysbrVrvRmyEVPn9nWz92D28IzYbA1RzoGDyTzYZwXKfBHEQkrey4G8=
收到小米通道下行的消息:(需要将sdk日志等级设置到DEBUG)
12-09 22:24:34.065 19566-25042/com.xxx D/MPS:MiPushReceiver: onReceiveMessage,msg=[{"f":262,"b":"{"content" ... ... ,"i":"f__-rnje3_OH74gE|VG0g3kwMnGADAGrXZku1FFW5"}]
注:如果控制台配置了小米/华为
的信息,app需要加对应的jar包依赖,不然会有crash的风险。
8. 小米系统辅助弹窗
小米设备管控严格,接入推送功能的App进程在后台被清理后,收不到推送通知;接入小米辅助弹窗后,可走MIUI系统的通道进行通知的推送,保证App后台被清理后,仍能收到推送通知(v2.3.0及以上支持
)。
8.1 客户端
- 该功能的使用需要接入小米推送辅助通道,确保使用
最新
的小米华为扩展包,具体参考上文; - 小米辅助弹窗送达的通知展示效果,和普通通知相同;
- 服务端指定小米辅助弹窗通道推送时,一定要指定通知点击后要打开的Activity,该Activity需继承自抽象类
MiPushSystemNotificationActivity
,否则无法获取到通知的相关信息,并且会影响通知到达率的统计; MiPushSystemNotificationActivity
中提供抽象方法onMiPushSysNoticeOpened()
,实现该方法后可获取到小米辅助弹窗通知的标题
、内容
和额外参数
,在通知点击时触发,原本的通知回调onNotification()
和onNotificationOpened()
不适用于小米辅助弹窗;接入如下所示:
import com.alibaba.sdk.android.push.MiPushSystemNotificationActivity;
public class XiaoMiPushActivity extends MiPushSystemNotificationActivity {
static final String TAG = "XiaoMiPushActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
@Override
protected void onMiPushSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);
}
}
8.2 服务端
- OpenAPI提供
setXiaoMiActivity()
接口,参数为小米辅助弹窗通知打开时跳转的Activity,setStoreOffline
为true时生效; - 配置
setXiaoMiActivity()
后,仅对后台进程被清理的小米设备生效,对非小米设备和在线小米设备不生效; - 推送通知
标题
、内容
和额外参数
的设置和普通推送接口相同,即setTitle()
、setBody()
和setAndroidActivity()
,额外参数设置中的功能性设置如声音、震动等对小米辅助弹窗通知不生效;PushRequest pushRequest = new PushRequest();
// 其余设置省略
// ...
// 0:表示消息(默认为0), 1:表示通知
pushRequest.setType(1);
// 标题
pushRequest.setTitle(dateFormat.format(new Date()));
// 内容
pushRequest.setBody("PushRequest body");
// 额外参数
pushRequest.setAndroidExtParameters("{"k1":"android","k2":"v2"}");
// 设置小米辅助弹窗打开Activity
pushRequest.setXiaomiActivity("*****");
8.3 场景解析
以下几种普通推送结合小米辅助弹窗推送的场景,帮助您快速理解小米辅助弹窗功能的配置。
客户端配置
客户端有Main、Second两个Activity,MainActivity为App打开主页面,SecondActivity extends MiPushSystemNotificationActivity;
- 普通通知回调配置:
public class MyMessageReceiver extends MessageReceiver {
/**
* 推送通知的回调方法
* @param context
* @param title
* @param summary
* @param extraMap
*/
@Override
public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap);
}
}
- MainActivity定义:
package com.alibaba.push.testdemo;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "Main");
}
}
- SecondActivity定义:
package com.alibaba.push.testdemo;
import com.alibaba.sdk.android.push.MiPushSystemNotificationActivity;
public class SecondActivity extends MiPushSystemNotificationActivity {
/**
* 小米辅助弹窗指定打开Activity回调
* @param title 标题
* @param content 内容
* @param extraMap 额外参数
*/
@Override
protected void onMiPushSysNoticeOpened(String title, String content, Map<String, String> extraMap) {
Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap);
}
}
场景1:普通推送打开App + 小米辅助弹窗
服务端配置如下:
PushRequest pushRequest = new PushRequest();
// 其余设置省略
// ...
// 0:表示消息(默认为0), 1:表示通知
pushRequest.setType(1);
// 标题
pushRequest.setTitle("hello");
// 内容
pushRequest.setBody("PushRequest body");
// 点击通知后动作,1:打开应用 2: 打开应用Activity 3:打开 url
pushRequest.setAndroidOpenType("1");
// 设置小米辅助弹窗打开Activity
pushRequest.setXiaomiActivity("com.alibaba.push.testdemo.SecondActivity");
// 设定android类型设备通知的扩展属性
pushRequest.setAndroidExtParameters("{"k1":"android","k2":"v2"}");;
推送结果:
非小米设备和在线小米设备
- 收到普通推送通道弹出的通知,点击后打开App,进入首页
MainActivity
,如果设备在前台,保持当前界面不变; - onNotification()回调输出
Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;
- 收到普通推送通道弹出的通知,点击后打开App,进入首页
清理进程后的小米设备
- 小米辅助弹窗通道弹出通知,点击后跳转到
SecondActivity
; - onMiPushSysNoticeOpened()回调输出
Receive XiaoMi notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;
- 小米辅助弹窗通道弹出通知,点击后跳转到
场景2:普通推送打开Activity + 小米辅助弹窗
服务端配置如下:
PushRequest pushRequest = new PushRequest();
// 其余设置省略
// ...
// 0:表示消息(默认为0), 1:表示通知
pushRequest.setType(1);
// 标题
pushRequest.setTitle("hello");
// 内容
pushRequest.setBody("PushRequest body");
// 点击通知后动作,1:打开应用 2: 打开应用Activity 3:打开 url
pushRequest.setAndroidOpenType("2");
// 指定普通推送要打开的Activity
pushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");
// 设置小米辅助弹窗打开Activity
pushRequest.setXiaomiActivity("com.alibaba.push.testdemo.SecondActivity");
// 设定android类型设备通知的扩展属性
pushRequest.setAndroidExtParameters("{"k1":"android","k2":"v2"}");
推送结果:
非小米设备和在线小米设备
- 收到普通推送通道弹出的通知,点击后跳转到
SecondActivity
; - onNotification()回调输出
Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;
- 收到普通推送通道弹出的通知,点击后跳转到
清理进程后的小米设备
- 小米辅助弹窗通道弹出通知,点击后跳转到
SecondActivity
; - onMiPushSysNoticeOpened()回调输出
Receive XiaoMi notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;
- 小米辅助弹窗通道弹出通知,点击后跳转到
最后更新:2016-12-20 16:09:47
上一篇:
SDK API介绍__Android SDK手册_App SDK 手册_移动推送-阿里云
下一篇:
iOS推送证书设置__iOS SDK手册_App SDK 手册_移动推送-阿里云
作业日期设置__作业_用户指南_E-MapReduce-阿里云
EDAS 商业化服务条款__服务条款和价格说明_企业级分布式应用服务 EDAS-阿里云
删除媒体__媒体接口_API使用手册_视频点播-阿里云
CC防护规则-正常与紧急__功能说明_Web 应用防火墙-阿里云
LogSearch-报警__Getting-Started_日志服务-阿里云
任务监控报警配置__SchedulerX for EDAS_二方服务_企业级分布式应用服务 EDAS-阿里云
查询快照__快照相关接口_API 参考_云服务器 ECS-阿里云
广播拉取消息模型__最佳实践_消息服务-阿里云
CreateConfig__Logtail配置相关接口_API-Reference_日志服务-阿里云
云服务器 ECS 重启
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云