开发者社区> 问答> 正文

怎样才能确保推送在我设置的有效期内,接收到通知

已解决

展开
收起
2018-06-26 01:40:27 2285 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    详细解答可以参考官方帮助文档

    小米/华为/FCM系统推送支持


    1.相关概念

    • 辅助通道:移动推送针对小米、华为设备管控较严的情况特意接入华为,小米推送辅助通道以提高在华为、小米设备上的到达率。移动推送优先选择自有通道进行推送消息下发,只有在自有通道断连时选择辅助通道下发消息。当前辅助通道通过华为、小米推送下发透传消息,消息到达应用后经移动推送SDK处理后触发onNotification,onMessage回调。小米、华为推送在下发透传消息时并不保证会拉起被杀死进程(相关机制可参考小米、华为推送官网),所以辅助通道在进程被杀死情况下无法保证消息一定到达。
    • 辅助弹窗:辅助弹窗通过系统通道下发通知,可以在进程被杀死情况下推送成功。由于辅助弹窗通过在对应设备上推送通知实现,因而通过辅助弹窗下发的通知不会触发onNotification回调。当前移动推送已接入小米、华为辅助弹窗。其中华为弹窗到达率统计只覆盖用户点击华为弹窗推送通知的场景,未点击部分暂未覆盖,小米弹窗到达率统计覆盖所有场景。

    2. 配置应用

    • 小米开放平台 注册你的App, 得到相应的小米AppID,小米AppKey,小米AppSecert。在控制台App详情设置你的小米AppSecert。(注意:小米开发者平台的消息推送开关记得打开
    • 同理在 华为开发者联盟 注册App,应用审核通过后,能够得到华为的AppID和AppSecert。在控制台App详情中设置你的华为AppID和AppSecert。(注意,您的app不能是草稿状态,必须是审核中,或者通过审核的状态,不然通道不会生效。请确保您在华为控制台激活了推送通道功能)
    • FCM推送平台创建项目(注:Google已将GCM推送迁移至firebase,改称FCM)。接入前提手机必须安装google play services, 否则注册不成功, 大部分国内的手机是谷歌服务被剥离了:
      • 在Firebase控制台需要先创建一个项目,然后再在项目下新增App
      • 下载对应App的google-services.json文件, 我们只需要这个json文件中的”project_number”, “mobilesdk_app_id”这两个key对应的value, 分别记录为sendId/applicationId, 下面注册过程中需要用到:

        google-service.json

      • 在Firebase控制台获取服务器密钥,并将其设置在移动推送控制台中的GCM/FCM服务器密钥域内。当前只支持老版服务器密钥

        服务器密钥

    3. 下载扩展包

    3.1 手动集成

    将辅助通道扩展包下载解压后拷贝到你项目的Lib目录下,下载地址如果使用辅助通道扩展包v3.0.4及以上版本,需要将推送SDK升级到v3.0.11及以上版本。新版辅助通道扩展包以aar形式透出,省却manifest文件配置,减少出错概率。

    将辅助通道扩展包放置到app module的libs路径下,并在app module的build.gradle文件中添加如下配置:

    1. repositories {
    2. flatDir {
    3. dirs 'libs' //this way we can find the .aar file in libs folder
    4. }
    5. }
    6. ...
    7. dependencies {
    8. ......
    9. compile(name: 'alicloud-android-third-push-3.0.5', ext: 'aar')
    10. }

    3.2 Maven集成

    • 项目顶层build.gradle中添加Maven仓库地址:
    1. allprojects {
    2. repositories {
    3. maven {
    4. url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
    5. }
    6. }
    7. }
    • gradle添加依赖:
    1. dependencies {
    2. compile 'com.aliyun.ams:alicloud-android-third-push:3.0.5@aar'
    3. }

    3.3 Firebase依赖

    如需配置GCM/GCM通道还需要添加Firebase SDK依赖:

    1. dependencies {
    2. ......
    3. compile ('com.google.firebase:firebase-messaging:9.6.1')
    4. }

    同时在AndroidManifest文件中添加如下配置:

    1. <receiver
    2. android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
    3. android:exported="true"
    4. android:permission="com.google.android.c2dm.permission.SEND" >
    5. <intent-filter>
    6. <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    7. <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    8. <category android:name="com.taobao.taobao" />
    9. </intent-filter>
    10. </receiver>
    11. <receiver
    12. android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
    13. android:exported="false" />
    14. <service
    15. android:name="com.alibaba.sdk.android.push.AgooFirebaseInstanceIDService"
    16. android:exported="true" >
    17. <intent-filter android:priority="-500" >
    18. <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    19. </intent-filter>
    20. </service>
    21. <service
    22. android:name="com.alibaba.sdk.android.push.AgooFirebaseMessagingService"
    23. android:exported="true" >
    24. <intent-filter android:priority="-500" >
    25. <action android:name="com.google.firebase.MESSAGING_EVENT" />
    26. </intent-filter>
    27. </service>

    4. Proguard配置

    • 如果集成推送SDK的工程开启代码混淆,在Proguard配置的基础上,需要添加以下辅助通道的Proguard配置。
    1. # 小米通道
    2. -keep class com.xiaomi.** {*;}
    3. -dontwarn com.xiaomi.**
    4. # 华为通道
    5. -keep class com.huawei.** {*;}
    6. -dontwarn com.huawei.**
    7. # GCM/FCM通道
    8. -keep class com.google.firebase.**{*;}
    9. -dontwarn com.google.firebase.**

    5. 在应用中初始化辅助通道

    将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败

    1. // 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
    2. MiPushRegister.register(applicationContext, "小米AppID", "小米AppKey");
    3. // 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。
    4. HuaWeiRegister.register(applicationContext);
    5. //GCM/FCM辅助通道注册
    6. GcmRegister.register(this, sendId, applicationId); //sendId/applicationId为步骤获得的参数

    本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。

    6. 在日志中查看初始化情况

    华为通道初始化成功,可以看到以下日志:

    1. 11-11 22:21:33.671 30248-30324/com.xxx E/MPS:HuaWeiRegister: HuaWeiRegister checkDevice flag=true //确认是华为的手机
    2. 11-11 22:21:33.674 30248-30324/com.xxx E/MPS:HuaWeiRegister Register huawei push............ //开始注册华为手机
    3. 11-11 22:21:33.714 29643-30328/com.xxx E/MPS:HuaWeiRegister huawei register successtoken = 08657430243125472000000411000001

    小米通道初始化成功,可以看到以下日志:

    1. 12-09 22:20:39.710 19566-19566/com.xxx E/MPS:MiPushRegister: MiPushRegister checkDevice flag=true //确认是小米的手机
    2. 12-09 22:20:39.712 19566-19566/com.xxx E/MPS:MiPushRegister: Register mipush. //开始注册小米
    3. 12-09 22:20:40.596 19566-19733/com.xxx E/MPS:MiPushRegister: XiaoMi register success. //小米注册成功 regid=d//igwEhgBGCI2TG6lWqlCesc0I6xE1wUhNCBXQ8uNOi/dDZioYXVysbrVrvRmyEVPn9nWz92D28IzYbA1RzoGDyTzYZwXKfBHEQkrey4G8=

    GCM/FCM通道初始化成功,可以看到以下日志:

    1. 05-19 19:18:44.530 19153-19177/com.xxx D/MPS:GcmRegister: token from register: eWIXLYCNP0Q:APA91bFUAgxj6XYf5okyoCBnRPw1UwITndzXrvPDgbdI2N44PYm17hFEBiNXNQJrJ8bOG_xjw3c3UPDAhzNMTLNjlAKcjUanKyLA6E3k4wEmgZuhgUT02UMmMvH2LVA1L2Z4-l-cT_Ug

    收到小米通道下行的消息:(需要将sdk日志等级设置到DEBUG)

    1. 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通道下发的消息:

    1. 05-19 19:20:04.900 19153-20391/com.alibaba.push2 D/MPS:GcmRegister: onReceiveMessage payload msg:[......]

    若小米通道注册失败(未看到小米注册成功日志),请查看系统日志(logcat设置NoFilters),以PushService|BroadcastQueue为正则式进行过滤,示例如下图:

    • MiPushBroadcastReceiver未配置:MiPushBroadcastReceiver

    • MIPUSH_RECEIVE权限未配置:MIPUSH_RECEIVE

    注:如果控制台配置了小米/华为的信息,app需要加对应的jar包依赖,不然会有crash的风险。

    7. 辅助弹窗

    • 当前部分国产品牌设备管控严格,接入推送功能的App进程在后台被清理后,收不到推送通知;接入辅助弹窗后,可以借助对应品牌的系统通道,保证App后台被清理后,仍能收到推送通知;
    • 当前辅助弹窗已接入小米、华为(小米辅助弹窗:v2.3.0及以上支持;华为辅助弹窗:v3.0.8及以上支持);
    • 当前华为辅助弹窗仅支持Emotion UI(华为定制ROM)4.1级以上版本的设备;

    7.1 客户端

    • 该功能的使用需要接入推送辅助通道,确保使用最新的辅助通道扩展包,具体参考上文;
    • 辅助弹窗送达的通知展示效果,和普通通知相同;
    • 服务端指定辅助弹窗通道推送时,一定要指定通知点击后要打开的Activity,该Activity需继承自抽象类AndroidPopupActivityMiPushSystemNotificationActivity已废弃,小米弹窗、华为弹窗统一继承AndroidPopupActivity),否则无法获取到通知的相关信息,并且会影响通知到达率的统计;
    • AndroidPopupActivity中提供抽象方法onSysNoticeOpened(),实现该方法后可获取到辅助弹窗通知的标题内容额外参数,在通知点击时触发,原本的通知回调onNotification()onNotificationOpened()不适用于辅助弹窗;
    • 指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:android:exported=true

    • 接入如下所示:

    1. import com.alibaba.sdk.android.push.AndroidPopupActivity;
    2. public class PopupPushActivity extends AndroidPopupActivity {
    3. static final String TAG = "PopupPushActivity";
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. }
    8. /**
    9. * 实现通知打开回调方法,获取通知相关信息
    10. * @param title 标题
    11. * @param summary 内容
    12. * @param extMap 额外参数
    13. */
    14. @Override
    15. protected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
    16. Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);
    17. }
    18. }

    7.2 服务端

    • OpenAPI 2.0的推送高级接口提供了AndroidPopupActivityAndroidPopupTitleAndroidPopupBody三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline参数也需要设置为true);
    • 辅助弹窗仅对后台进程被清理的小米/华为设备生效,对非小米/华为设备和在线的小米/华为设备不生效;
    • 当辅助弹窗生效时,推送接口的TitleBodyAndroidActivity以及额外参数设置中的功能性设置(如声音、震动等)都不起作用;
      1. PushRequest pushRequest = new PushRequest();
      2. // 其余设置省略
      3. // ...
      4. // 0:表示消息(默认为0), 1:表示通知
      5. pushRequest.setType(1);
      6. // 标题
      7. pushRequest.setTitle(dateFormat.format(new Date()));
      8. // 内容
      9. pushRequest.setBody("PushRequest body");
      10. // 额外参数
      11. pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
      12. // 设置辅助弹窗打开Activity
      13. pushRequest.setAndroidPopupActivity("*****");
      14. // 设置辅助弹窗通知标题
      15. pushRequest.setAndroidPopupTitle("*****");
      16. // 设置辅助弹窗通知内容
      17. pushRequest.setAndroidPopupBody("*****");

    7.3 场景解析

    以下几种普通推送结合辅助弹窗推送的场景,帮助您快速理解辅助弹窗功能的配置。

    客户端配置

    客户端有Main、Second两个Activity,MainActivity为App打开主页面,SecondActivity extends AndroidPopupActivity;

    • 普通通知回调配置:
    1. public class MyMessageReceiver extends MessageReceiver {
    2. /**
    3. * 推送通知的回调方法
    4. * @param context
    5. * @param title
    6. * @param summary
    7. * @param extraMap
    8. */
    9. @Override
    10. public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
    11. Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap);
    12. }
    13. }
    • MainActivity定义:
    1. package com.alibaba.push.testdemo;
    2. public class MainActivity extends Activity {
    3. @Override
    4. protected void onCreate(Bundle savedInstanceState) {
    5. Log.d(TAG, "Main");
    6. }
    7. }
    • SecondActivity定义:
    1. package com.alibaba.push.testdemo;
    2. import com.alibaba.sdk.android.push.AndroidPopupActivity;
    3. public class SecondActivity extends AndroidPopupActivity {
    4. /**
    5. * 辅助弹窗指定打开Activity回调
    6. * @param title 标题
    7. * @param content 内容
    8. * @param extraMap 额外参数
    9. */
    10. @Override
    11. protected void onSysNoticeOpened(String title, String content, Map<String, String> extraMap) {
    12. Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap);
    13. }
    14. }

    场景1:普通推送打开App + 辅助弹窗

    服务端配置如下:

    1. PushRequest pushRequest = new PushRequest();
    2. // 其余设置省略
    3. // ...
    4. // 0:表示消息(默认为0), 1:表示通知
    5. pushRequest.setType(1);
    6. // 标题
    7. pushRequest.setTitle("hello");
    8. // 内容
    9. pushRequest.setBody("PushRequest body");
    10. // 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
    11. pushRequest.setAndroidOpenType("APPLICATION");
    12. // 设置辅助弹窗打开Activity
    13. pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");
    14. // 设置辅助弹窗通知标题
    15. pushRequest.setAndroidPopupTitle("hello2");
    16. // 设置辅助弹窗通知内容
    17. pushRequest.setAndroidPopupBody("PushRequest body2");
    18. // 设定android类型设备通知的扩展属性
    19. 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 + 辅助弹窗

    服务端配置如下:

    1. PushRequest pushRequest = new PushRequest();
    2. // 其余设置省略
    3. // ...
    4. // 0:表示消息(默认为0), 1:表示通知
    5. pushRequest.setType(1);
    6. // 标题
    7. pushRequest.setTitle("hello");
    8. // 内容
    9. pushRequest.setBody("PushRequest body");
    10. // 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
    11. pushRequest.setAndroidOpenType("ACTIVITY");
    12. // 指定普通推送要打开的Activity
    13. pushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");
    14. // 设置辅助弹窗打开Activity
    15. pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");
    16. // 设置辅助弹窗通知标题
    17. pushRequest.setAndroidPopupTitle("hello2");
    18. // 设置辅助弹窗通知内容
    19. pushRequest.setAndroidPopupBody("PushRequest body2");
    20. // 设定android类型设备通知的扩展属性
    21. 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}
    2018-06-30 10:09:37
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
微信客户端怎样应对弱网络 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载