详细解答可以参考官方帮助文档
onNotification
,onMessage
回调。小米、华为推送在下发透传消息时并不保证会拉起被杀死进程(相关机制可参考小米、华为推送官网),所以辅助通道在进程被杀死情况下无法保证消息一定到达。onNotification
回调。当前移动推送已接入小米、华为辅助弹窗。其中华为弹窗到达率统计只覆盖用户点击华为弹窗推送通知的场景,未点击部分暂未覆盖,小米弹窗到达率统计覆盖所有场景。App详情
设置你的小米AppSecert。(注意:小米开发者平台的消息推送开关记得打开
)App详情
中设置你的华为AppID和AppSecert。(注意,您的app不能是草稿状态,必须是审核中,或者通过审核的状态,不然通道不会生效。请确保您在华为控制台激活了推送通道功能)GCM/FCM服务器密钥
域内。当前只支持老版服务器密钥将辅助通道扩展包下载解压后拷贝到你项目的Lib目录下,下载地址。如果使用辅助通道扩展包v3.0.4及以上版本,需要将推送SDK升级到v3.0.11及以上版本。新版辅助通道扩展包以aar形式透出,省却manifest文件配置,减少出错概率。
将辅助通道扩展包放置到app module的libs路径下,并在app module的build.gradle文件中添加如下配置:
repositories {
flatDir {
dirs 'libs' //this way we can find the .aar file in libs folder
}
}
...
dependencies {
......
compile(name: 'alicloud-android-third-push-3.0.5', ext: 'aar')
}
allprojects {
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
}
}
}
dependencies {
compile 'com.aliyun.ams:alicloud-android-third-push:3.0.5@aar'
}
如需配置GCM/GCM通道还需要添加Firebase SDK依赖:
dependencies {
......
compile ('com.google.firebase:firebase-messaging:9.6.1')
}
同时在AndroidManifest文件中添加如下配置:
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.taobao.taobao" />
</intent-filter>
</receiver>
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported="false" />
<service
android:name="com.alibaba.sdk.android.push.AgooFirebaseInstanceIDService"
android:exported="true" >
<intent-filter android:priority="-500" >
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name="com.alibaba.sdk.android.push.AgooFirebaseMessagingService"
android:exported="true" >
<intent-filter android:priority="-500" >
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
# 小米通道
-keep class com.xiaomi.** {*;}
-dontwarn com.xiaomi.**
# 华为通道
-keep class com.huawei.** {*;}
-dontwarn com.huawei.**
# GCM/FCM通道
-keep class com.google.firebase.**{*;}
-dontwarn com.google.firebase.**
将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败
// 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");
// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。
HuaWeiRegister.register(applicationContext);
//GCM/FCM辅助通道注册
GcmRegister.register(this, sendId, applicationId); //sendId/applicationId为步骤获得的参数
本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
华为通道初始化成功,可以看到以下日志:
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:HuaWeiRegister﹕ huawei register success,token = 08657430243125472000000411000001
小米通道初始化成功,可以看到以下日志:
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:MiPushRegister: XiaoMi register success. //小米注册成功 regid=d//igwEhgBGCI2TG6lWqlCesc0I6xE1wUhNCBXQ8uNOi/dDZioYXVysbrVrvRmyEVPn9nWz92D28IzYbA1RzoGDyTzYZwXKfBHEQkrey4G8=
GCM/FCM通道初始化成功,可以看到以下日志:
05-19 19:18:44.530 19153-19177/com.xxx D/MPS:GcmRegister: token from register: eWIXLYCNP0Q:APA91bFUAgxj6XYf5okyoCBnRPw1UwITndzXrvPDgbdI2N44PYm17hFEBiNXNQJrJ8bOG_xjw3c3UPDAhzNMTLNjlAKcjUanKyLA6E3k4wEmgZuhgUT02UMmMvH2LVA1L2Z4-l-cT_Ug
收到小米通道下行的消息:(需要将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"}]
收到GCM/FCM通道下发的消息:
05-19 19:20:04.900 19153-20391/com.alibaba.push2 D/MPS:GcmRegister: onReceiveMessage payload msg:[......]
若小米通道注册失败(未看到小米注册成功日志),请查看系统日志(logcat设置NoFilters),以PushService|BroadcastQueue
为正则式进行过滤,示例如下图:
MiPushBroadcastReceiver未配置:
MIPUSH_RECEIVE权限未配置:
注:如果控制台配置了小米/华为
的信息,app需要加对应的jar包依赖,不然会有crash的风险。
v2.3.0及以上支持
;华为辅助弹窗:v3.0.8及以上支持
);最新
的辅助通道扩展包,具体参考上文;AndroidPopupActivity
(MiPushSystemNotificationActivity
已废弃,小米弹窗、华为弹窗统一继承AndroidPopupActivity
),否则无法获取到通知的相关信息,并且会影响通知到达率的统计;AndroidPopupActivity
中提供抽象方法onSysNoticeOpened()
,实现该方法后可获取到辅助弹窗通知的标题
、内容
和额外参数
,在通知点击时触发,原本的通知回调onNotification()
和onNotificationOpened()
不适用于辅助弹窗;指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:android:exported=true
接入如下所示:
import com.alibaba.sdk.android.push.AndroidPopupActivity;
public class PopupPushActivity extends AndroidPopupActivity {
static final String TAG = "PopupPushActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
@Override
protected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);
}
}
AndroidPopupActivity
、AndroidPopupTitle
和AndroidPopupBody
三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline
参数也需要设置为true);Title
、Body
、AndroidActivity
以及额外参数设置中的功能性设置(如声音、震动等)都不起作用;
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.setAndroidPopupActivity("*****");
// 设置辅助弹窗通知标题
pushRequest.setAndroidPopupTitle("*****");
// 设置辅助弹窗通知内容
pushRequest.setAndroidPopupBody("*****");
以下几种普通推送结合辅助弹窗推送的场景,帮助您快速理解辅助弹窗功能的配置。
客户端有Main、Second两个Activity,MainActivity为App打开主页面,SecondActivity extends AndroidPopupActivity;
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);
}
}
package com.alibaba.push.testdemo;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "Main");
}
}
package com.alibaba.push.testdemo;
import com.alibaba.sdk.android.push.AndroidPopupActivity;
public class SecondActivity extends AndroidPopupActivity {
/**
* 辅助弹窗指定打开Activity回调
* @param title 标题
* @param content 内容
* @param extraMap 额外参数
*/
@Override
protected void onSysNoticeOpened(String title, String content, Map<String, String> extraMap) {
Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap);
}
}
服务端配置如下:
PushRequest pushRequest = new PushRequest();
// 其余设置省略
// ...
// 0:表示消息(默认为0), 1:表示通知
pushRequest.setType(1);
// 标题
pushRequest.setTitle("hello");
// 内容
pushRequest.setBody("PushRequest body");
// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
pushRequest.setAndroidOpenType("APPLICATION");
// 设置辅助弹窗打开Activity
pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");
// 设置辅助弹窗通知标题
pushRequest.setAndroidPopupTitle("hello2");
// 设置辅助弹窗通知内容
pushRequest.setAndroidPopupBody("PushRequest body2");
// 设定android类型设备通知的扩展属性
pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
推送结果:
非小米、华为设备和在线小米、华为设备
MainActivity
,如果设备在前台,保持当前界面不变;Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;清理进程后的小米、华为设备
SecondActivity
;Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2}
;服务端配置如下:
PushRequest pushRequest = new PushRequest();
// 其余设置省略
// ...
// 0:表示消息(默认为0), 1:表示通知
pushRequest.setType(1);
// 标题
pushRequest.setTitle("hello");
// 内容
pushRequest.setBody("PushRequest body");
// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
pushRequest.setAndroidOpenType("ACTIVITY");
// 指定普通推送要打开的Activity
pushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");
// 设置辅助弹窗打开Activity
pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");
// 设置辅助弹窗通知标题
pushRequest.setAndroidPopupTitle("hello2");
// 设置辅助弹窗通知内容
pushRequest.setAndroidPopupBody("PushRequest body2");
// 设定android类型设备通知的扩展属性
pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
推送结果:
非小米、华为设备和在线小米、华为设备
SecondActivity
;Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}
;清理进程后的小米、华为设备
SecondActivity
;Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2}
;版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。