android开发中 app的保活和推送到达都是个绕不过去的坎 他俩相辅相成
目前阿里推送的辅助推送通道可以进一步的帮助实现这个推送的到达率
https://help.aliyun.com/document_detail/30067.html?spm=a2c4g.11186623.6.590.598b7fa8XmiUlS#h2-7-
在 小米开放平台 注册你的App, 得到相应的小米AppID,小米AppKey,小米AppSecert。在控制台应用配置设置你的小米AppSecert。(注意:最新的小米开放平台是分开 push 功能的,需要在 push 功能区 开通/启用 推送功能)
在 华为开发者联盟 注册 App,应用审核通过后,能够得到华为的AppID和AppSecert。在控制台应用配置中设置你的应用 AppID 和 AppSecert。(注意:最新的华为开放平台是分开push功能的,需要在push功能区 开通/启用 推送功能),华为后台添加消息回执回调地址,https://agoo-ack.m.taobao.com/hw/
https 证书填入以下内容:
-----BEGIN CERTIFICATE-----MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==-----END CERTIFICATE-----
在 FCM推送平台 创建项目(注:Google已将GCM推送迁移至firebase,改称FCM)。接入前提手机必须安装google play services, 否则注册不成功, 大部分国内的手机是谷歌服务被剥离了:
在Firebase控制台需要先创建一个项目,然后再在项目下新增App下载对应App的google-services.json文件, 我们只需要这个json文件中的”project_number”, “mobilesdk_app_id”这两个key对应的value, 分别记录为sendId/applicationId, 下面注册过程中需要用到: 在Firebase控制台获取服务器密钥,并将其设置在移动推送控制台中的GCM/FCM服务器密钥域内。在OPPO开放平台 注册OPPO企业开发者账号,添加应用并开通oppo推送服务,目前应用需满足:1.在oppo市场上架,2.评级为A,才能使用推送服务,具体政策可咨询oppo客服,最终以oppo要求为准。同样需要在控制台应用配置设置你的OppoAppkey和OppoMasterSecret。
在 VIVO开放平台 注册账号及创建应用(注:vivo需要企业开发者账号),审核通过后,能够得到应用的AppID、AppKey和AppSecret。在控制台应用配置中设置你的VIVO应用AppID、AppKey以及AppSecret。
在 Flyme 开放平台 注册账号及创建应用,审核通过后,能够得到应用的AppID和AppSecret。在控制台应用配置中设置你的应用AppID和AppSecret,同时一定要在Flyme控制台上设置回执地址为:http://agoo-ack.m.taobao.com/mz/ 及 https://agoo-ack.m.taobao.com/mz/ ,否则可能会收不到推送消息。
建议使用maven集成。
将辅助通道扩展包下载解压后拷贝到你项目的Lib目录下,下载地址。如果使用辅助通道扩展包v3.2.0及以上版本,需要将推送SDK升级到v3.2.0及以上版本。新版辅助通道扩展包以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.1.0', ext: 'aar')}
allprojects {repositories {maven {url 'http://maven.aliyun.com/nexus/content/repositories/releases/'}}} gradle添加依赖:
dependencies {compile 'com.aliyun.ams:alicloud-android-third-push:3.2.0'}
OPPO、魅族、VIVO 通道 需使用 v3.0.10 或以上版本,另外每个平台对应用接入的要求不同,请查看各平台官网说明。
注意:如果只添加alicloud-android-third-push,而不添加华为通道依赖时,会报错找不到一些文件和值,比如@string/error_over_original_size @string/error_over_original_count @style/upsdkDlDialog,如要使用华为通道,请看下文华为依赖,添加上即可,如不使用通道,您自行写上这些值即可。
如需配置GCM/GCM通道还需要添加Firebase SDK依赖:
dependencies {......compile ('com.google.firebase:firebase-messaging:17.6.0')}
如需配置华为通道还需要添加华为推送SDK依赖:
dependencies {......compile 'com.aliyun.ams:huawei-push:2.6.3.305'compile 'com.aliyun.ams:huawei-push-base:2.6.3.305'}
同时在AndroidManifest文件中添加如下配置:
<meta-dataandroid:name="com.huawei.hms.client.appid"android:value="appid=华为开放平台申请的ID信息" />
如需配置魅族通道还需要添加魅族推送SDK依赖:
dependencies {......compile 'com.aliyun.ams:meizu-push:3.8.7.1'}
如需配置VIVO通道还需要添加VIVO推送SDK依赖:
dependencies {......compile 'com.aliyun.ams:third_vivopush:2.9.0.1'}
在AndroidManifest文件中添加如下配置:
<meta-dataandroid:name="com.vivo.push.api_key"android:value="请填写vivo平台上注册应用的appKey" /><meta-dataandroid:name="com.vivo.push.app_id"android:value="请填写vivo平台上注册应用的appID" />
# 小米通道-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.**# OPPO通道-keep public class * extends android.app.Service# VIVO通道-keep class com.vivo.** {*;}-dontwarn com.vivo.**# 魅族通道-keep class com.meizu.cloud.** {*;}-dontwarn com.meizu.cloud.**
将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败
// 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。HuaWeiRegister.register(application);//GCM/FCM辅助通道注册GcmRegister.register(this, sendId, applicationId); //sendId/applicationId为步骤获得的参数// OPPO通道注册OppoRegister.register(applicationContext, appKey, appSecret); // appKey/appSecret在OPPO开发者平台获取// 魅族通道注册MeizuRegister.register(applicationContext, "appId", "appkey"); // appId/appkey在魅族开发者平台获取// VIVO通道注册VivoRegister.register(applicationContext);
本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
华为通道初始化成功,可以看到以下日志:(如不成功,检查是否在华为控制台配置SHA256指纹证书,目前华为需要配置)
小米通道初始化成功,可以看到以下日志:
GCM/FCM通道初始化成功,可以看到以下日志:
05-19 19:18:44.530 19153-19177/com.xxx D/MPS:GcmRegister: token from register:eWIXLYCNP0Q:APA91bFUAgxj6XYf5okyoCBnRPw1UwITndzXrvPDgbdI2N44PYm17hFEBiNXNQJrJ8bOG_xjw3c3UPDAhzNMTLNjlAKcjUanKyLA6E3k4wEmgZuhgUT02UMmMvH2LVA1L2Z4-l-cT_Ug
OPPO通道是否注册成功, 可以通过过滤MPS:oppo关键字查看, 注册成功会打印onRegister regid=****相关日志, 否则检查参数是否正确填入;
VIVO通道是否注册成功, 可以通过过滤MPS:vivo关键字查看, 注册成功会打印getRegId regId:****相关日志, 否则检查参数是否正确填入;
魅族通道初始化成功,可以看到以下日志:
收到小米通道下行的消息:(需要将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权限未配置:
注1:如果控制台配置了小米/华为的信息,app需要加对应的jar包依赖,不然会有crash的风险。
客户端接入完毕,服务端推送时如果设备无法收到推送,可先查看 移动推送Android SDK:Android辅助通道和弹窗排查步骤
指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:android:exported=true
接入如下所示:
import com.alibaba.sdk.android.push.AndroidPopupActivity;public class PopupPushActivity extends AndroidPopupActivity {static final String TAG = "PopupPushActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}/*** 实现通知打开回调方法,获取通知相关信息* @param title 标题* @param summary 内容* @param extMap 额外参数*/@Overrideprotected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);}}
PushRequest pushRequest = new PushRequest();// 其余设置省略// 通知pushRequest.setPushType("NOTICE");// 标题pushRequest.setTitle(dateFormat.format(new Date()));// 内容pushRequest.setBody("PushRequest body");// 额外参数pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");// 设置辅助弹窗打开ActivitypushRequest.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*/@Overridepublic 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.d(TAG, "Main");}} SecondActivity定义:
package com.alibaba.push.testdemo;import com.alibaba.sdk.android.push.AndroidPopupActivity;public class SecondActivity extends AndroidPopupActivity {/*** 辅助弹窗指定打开Activity回调* @param title 标题* @param content 内容* @param extraMap 额外参数*/@Overrideprotected void onSysNoticeOpened(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();// 其余设置省略// 通知pushRequest.setPushType("NOTICE");// 标题pushRequest.setTitle("hello");// 内容pushRequest.setBody("PushRequest body");// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转pushRequest.setAndroidOpenType("APPLICATION");// 设置辅助弹窗打开ActivitypushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗通知标题pushRequest.setAndroidPopupTitle("hello2");// 设置辅助弹窗通知内容pushRequest.setAndroidPopupBody("PushRequest body2");// 设定android类型设备通知的扩展属性pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
推送结果:
非小米、华为等厂商通道设备和在线设备
收到普通推送通道弹出的通知,点击后打开App,进入首页MainActivity,如果设备在前台,保持当前界面不变;onNotification()回调输出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2};清理进程后的小米、华为等厂商通道设备
辅助弹窗通道弹出通知,点击后跳转到SecondActivity;onSysNoticeOpened()回调输出Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2};场景2:普通推送打开Activity + 辅助弹窗
服务端配置如下:
PushRequest pushRequest = new PushRequest();// 其余设置省略// 通知pushRequest.setPushType("NOTICE");// 标题pushRequest.setTitle("hello");// 内容pushRequest.setBody("PushRequest body");// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转pushRequest.setAndroidOpenType("ACTIVITY");// 指定普通推送要打开的ActivitypushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗打开ActivitypushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");// 设置辅助弹窗通知标题pushRequest.setAndroidPopupTitle("hello2");// 设置辅助弹窗通知内容pushRequest.setAndroidPopupBody("PushRequest body2");// 设定android类型设备通知的扩展属性pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
推送结果:
非小米、华为等厂商通道设备和在线设备
收到普通推送通道弹出的通知,点击后跳转到SecondActivity;onNotification()回调输出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2};清理进程后的小米、华为等厂商通道设备
辅助弹窗通道弹出通知,点击后跳转到SecondActivity;onSysNoticeOpened()回调输出Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2};
其它坑说明:
阿里文档地址:https://help.aliyun.com/document_detail/184150.html?spm=a2c4g.11186623.6.576.326d237864PENI
https://emas.console.aliyun.com/?spm=5176.13194971.0.0.4ff3cb3coyVKHq#/product/3619196/push/25233908/2
服务端需要配置通知chinalId
1.华为地址:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/android-intelligent-classification-0000001050040120-V5?spm=a2c4g.11186623.2.26.779f708fmtlOup 通知chinalId =HIGH
2.VIVO https://dev.vivo.com.cn/documentCenter/doc/359?spm=a2c4g.11186623.2.25.779f708fmtlOup VIVO通知chinalId =1
3.小米 通知chinalId =pre54
PopupPushActivity(接收辅助通道的act) 在xml里面一定要设置,这个包名路径要传给后台,后台也得设置一下
1.json文件,这个我们直接在阿里云的应用配置里面下载就可以了(有个下载配置文件)
2.动态形式来获取需要配置的参数
//阿里推送动态注册AppKey,AppSecret if (BuildConfig.APPLICATION_ID.equals("xxxxxx")) { mPushService.register(applicationContext, "xxxxxx", "xxxxxxx", mPushRegisterCallback); } else if (BuildConfig.APPLICATION_ID.equals("com.xxxxxx.xxx.debug")) { mPushService.register(applicationContext, "xxxx", "xxxx", mPushRegisterCallback); } //动态获取华为和vivo的值 ApplicationInfo appInfo = null; // String value=null; try { appInfo = mContext.getPackageManager().getApplicationInfo( mContext.getPackageName(), PackageManager.GET_META_DATA); // appInfo.metaData.putString("com.huawei.hms.client.appid", "appid=xxxxx"); // value = appInfo.metaData.getString("com.huawei.hms.client.appid"); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } //辅助通道动态注册 if (BuildConfig.APPLICATION_ID.equals("com.xxxxx")) { //小米 MiPushRegister.register(applicationContext, "xx", "xx"); //魅族 MeizuRegister.register(applicationContext, "xx", "xx"); //oppo OppoRegister.register(applicationContext, "xx", "xx"); //vivo appInfo.metaData.putString("com.vivo.push.api_key", "xx"); appInfo.metaData.putString("com.vivo.push.app_id", "xx"); //华为 appInfo.metaData.putString("com.huawei.hms.client.appid", "appid=xx"); } else if (BuildConfig.APPLICATION_ID.equals("com.xxxx.xxxx")) { //小米 MiPushRegister.register(applicationContext, "xxxx", "xxxxxx"); //魅族 MeizuRegister.register(applicationContext, "xxxxx", "xxxx"); //oppo OppoRegister.register(applicationContext, "xxxx", "xxxxx"); //vivo appInfo.metaData.putString("com.vivo.push.api_key", "xxxx"); appInfo.metaData.putString("com.vivo.push.app_id", "xxxxx"); //华为 appInfo.metaData.putString("com.huawei.hms.client.appid", "appid=xxxxx"); }3.各种机型的小坑
说明:一定要在各大平台注册,将应用加入
1.0PPO
oppo阿里AppKey 对应的是key,但是MasterSecret 对应的是oppo平台的appserversecret ,不是appsecret,切记,在APPlication里面填写的是appsecret,OPPO有时候会接收不到消息,请打开设置,在进入应用管理,找到当前的应用,强制停止,这样就离线了,在辅助通道推送就有通知了
2.Xiaomi
自Android 8.0(API Level 26)起,Android推出了NotificationChannel机制,旨在对通知进行分类管理。如果用户App的targetSdkVersion大于等于26,且并未设置NotificaitonChannel,那么创建的通知是不会弹出显示。
请参见Android 8.0以上设备接收不到推送通知进行适配。 必须配置NotificaitonChannel,否则收不到通知,可以在小米推送平台申请,有个通知类别,在里面申请,有很多选择
re84即时通讯(IM)消息(如聊天、加好友等)申请pre61个人状态变化(如会员升级、登录下线等)申请pre72个人资源变化(如钱包、积分等)申请pre213个人关注的内容更新提醒(如关注的教学任务更新、主动设置的书籍更新提醒等用户主动订阅的提醒)申请pre102个人日程相关提醒(如登机、酒店入住提醒等)申请pre233个人交易提醒(如银行、股票的交易提醒等)申请pre54个人家庭IoT类提醒(如摄像机监控区域有变化的提醒、扫地机器人清扫完成的通知等)撤销pre96个人订单状态变化(如购物发货、退款等)3.华为基本没遇到什么坑(appid配置在bulid里面,动态配置也行
<meta-data android:name="com.huawei.hms.client.appid" android:value="${HUAWEI_ID}"/> manifestPlaceholders = [icon: "@mipmap/ic_launcher", VIVO_KEY: "1124d88d99cf58e738b18f9d1848c690", VIVO_ID: "104115367" , HUAWEI_ID: "appid=100902017"])
4.魅族
在魅族推送平台的应用列表,单击打开应用,进入配置管理>回执管理页面。
设置回执地址为:http://amspush-ack.aliyuncs.com/mz/ 及 https://amspush-ack.aliyuncs.com/mz/ 否则可能会收不到推送消息。
一定要填写回执,否则收不到通知
5.Vivo
可以在VIVO添加regId进行测试,一定要将当前版本发布上线才可以收到推送。6.目前阿里不支持推送消息
vivo要应用发布上线才可以收到通知,以后可能会改变