辅助弹窗接入

本章节介绍接入厂商通道后如何使用辅助弹窗。

前言

在厂商通道收到推送通知消息并展示到系统通知栏后,辅助弹窗会协助开发者处理推送的数据,包括:

  • 解密推送数据

  • 将推送的明文数据传给App处理

App开发接入辅助弹窗请参考App集成辅助弹窗

后端通过辅助通道推送通知消息请参考服务端配置

准备工作

App集成辅助弹窗

1 自定义实现辅助弹窗Activity

1.1 自定义实现辅助弹窗中转Activity

重要
  • 这个方案介绍的是自定义Activity作为中转Activity,辅助获取推送的额外参数,额外参数里必须配置指定Activity的路由信息,您可以根据这些路由信息跳转到指定Activity。

  • 如果您通过推送通知要打开的Activity页面较多的话,建议用这种方式。

  • 在推送时,配置的打开的页面要配置成实现的辅助弹窗中转Activity,且真正要打开的指定Activity路由信息需要配置在额外参数中。

  1. 自定义Activity继承自AndroidPopupActivity或者通过PopupNotifyClick实现。

  2. 实现AndroidPopupActivity的抽象方法onSysNoticeOpened,该方法是成功解密推送数据后的回调方法,在该方法内可以获取到通知的标题、内容和额外参数,您可以根据这些参数跳转到具体的Activity。

  3. 重写AndroidPopupActivityonNotPushData方法,该方法是没有获取到推送数据的回调方法。

  4. 重写AndroidPopupActivityonParseFailed方法,该方法是对推送数据解密失败的回调方法。

方案一:自定义Activity继承自AndroidPopupActivity
import android.content.Intent
import android.os.Bundle
import com.alibaba.sdk.android.push.AndroidPopupActivity

class PopupPushActivity : AndroidPopupActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    /**
     * 实现通知打开回调方法,获取通知相关信息
     * @param title     标题
     * @param summary   内容
     * @param extMap    额外参数
     */
    override fun onSysNoticeOpened(title: String, summary: String, extMap: Map<String, String>) {
        //TODO 获取推送参数,跳转到指定页面
        finish()
    }

    /**
     * 不是推送数据的回调
     *
     * @param intent
     */
    override fun onNotPushData(intent: Intent) {
        super.onNotPushData(intent)
        finish()
    }

    /**
     * 是推送数据,但是又解密失败时的回调
     *
     * @param intent
     */
    override fun onParseFailed(intent: Intent) {
        super.onParseFailed(intent)
        finish()
    }
}
import android.content.Intent;
import android.os.Bundle;

import com.alibaba.sdk.android.push.AndroidPopupActivity;

import java.util.Map;

public class PopupPushActivity extends AndroidPopupActivity {
    
    @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) {
        //TODO 获取推送参数,跳转到指定页面
        finish();
    }

    /**
     * 不是推送数据的回调
     *
     * @param intent
     */
    @Override
    public void onNotPushData(Intent intent) {
        super.onNotPushData(intent);
        finish();
    }

    /**
     * 是推送数据,但是又解密失败时的回调
     *
     * @param intent
     */
    @Override
    public void onParseFailed(Intent intent) {
        super.onParseFailed(intent);
        finish();
    }
}
方案二:自定义Activity实现PopupNotifyClick
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import com.alibaba.sdk.android.push.popup.OnPushParseFailedListener
import com.alibaba.sdk.android.push.popup.PopupNotifyClick
import com.alibaba.sdk.android.push.popup.PopupNotifyClickListener


class PopupPushActivity : Activity(), PopupNotifyClickListener,
    OnPushParseFailedListener {
    private val mPopupNotifyClick = PopupNotifyClick(this)
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mPopupNotifyClick.onCreate(this, intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        mPopupNotifyClick.onNewIntent(intent)
    }

    /**
     * 实现通知打开回调方法,获取通知相关信息
     * @param title     标题
     * @param summary   内容
     * @param extMap    额外参数
     */
    override fun onSysNoticeOpened(title: String, summary: String, extMap: Map<String, String>) {
        //TODO 获取推送参数,跳转到指定页面
        finish()
    }

    /**
     * 不是推送数据的回调
     *
     * @param intent
     */
    override fun onNotPushData(intent: Intent) {
        finish()
    }

    /**
     * 是推送数据,但是又解密失败时的回调
     *
     * @param intent
     */
    override fun onParseFailed(intent: Intent) {
        finish()
    }
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.alibaba.sdk.android.push.popup.OnPushParseFailedListener;
import com.alibaba.sdk.android.push.popup.PopupNotifyClick;
import com.alibaba.sdk.android.push.popup.PopupNotifyClickListener;

import java.util.Map;

public class PopupPushActivity extends Activity implements PopupNotifyClickListener, OnPushParseFailedListener {
    private final PopupNotifyClick mPopupNotifyClick = new PopupNotifyClick(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPopupNotifyClick.onCreate(this, getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        mPopupNotifyClick.onNewIntent(intent);
    }

    /**
     * 实现通知打开回调方法,获取通知相关信息
     * @param title     标题
     * @param summary   内容
     * @param extMap    额外参数
     */
    @Override
    public void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
        //TODO 获取推送参数,跳转到指定页面
        finish();
    }

    /**
     * 不是推送数据的回调
     *
     * @param intent
     */
    @Override
    public void onNotPushData(Intent intent) {
        finish();
    }

    /**
     * 是推送数据,但是又解密失败时的回调
     *
     * @param intent
     */
    @Override
    public void onParseFailed(Intent intent) {
        finish();
    }
}

1.2 已有Activity实现辅助弹窗

重要
  • 这个方案介绍的是已有Activity直接实现辅助弹窗,点击推送通知直接打开已有Activity。

  • 如果您通过推送通知要打开的Activity页面较少的话,也可以用这种方式。

  • 在推送时,配置的打开的页面要配置成已经实现辅助弹窗的Activity。

一般App开发有自己的BaseActivity,所以这里只介绍使用PopupNotifyClick实现辅助弹窗。

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import com.alibaba.sdk.android.push.popup.OnPushParseFailedListener
import com.alibaba.sdk.android.push.popup.PopupNotifyClick
import com.alibaba.sdk.android.push.popup.PopupNotifyClickListener


class PopupPushActivity : Activity(), PopupNotifyClickListener,
    OnPushParseFailedListener {
    private val mPopupNotifyClick = PopupNotifyClick(this)
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mPopupNotifyClick.onCreate(this, intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        mPopupNotifyClick.onNewIntent(intent)
    }

    /**
     * 实现通知打开回调方法,获取通知相关信息
     * @param title     标题
     * @param summary   内容
     * @param extMap    额外参数
     */
    override fun onSysNoticeOpened(title: String, summary: String, extMap: Map<String, String>) {
        //TODO 获取推送参数,根据业务需求处理
        finish()
    }

    /**
     * 不是推送数据的回调
     *
     * @param intent
     */
    override fun onNotPushData(intent: Intent) {
        //TODO 没有推送数据,可能是异常调用,需要异常处理
    }

    /**
     * 是推送数据,但是又解密失败时的回调
     *
     * @param intent
     */
    override fun onParseFailed(intent: Intent) {
        //TODO 推送数据解密异常,需要异常处理
    }
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.alibaba.sdk.android.push.popup.OnPushParseFailedListener;
import com.alibaba.sdk.android.push.popup.PopupNotifyClick;
import com.alibaba.sdk.android.push.popup.PopupNotifyClickListener;

import java.util.Map;

public class PopupPushActivity extends Activity implements PopupNotifyClickListener, OnPushParseFailedListener {
    private final PopupNotifyClick mPopupNotifyClick = new PopupNotifyClick(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPopupNotifyClick.onCreate(this, getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        mPopupNotifyClick.onNewIntent(intent);
    }

    /**
     * 实现通知打开回调方法,获取通知相关信息
     * @param title     标题
     * @param summary   内容
     * @param extMap    额外参数
     */
    @Override
    public void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
        //TODO 获取推送参数,根据业务需求处理
        finish();
    }

    /**
     * 不是推送数据的回调
     *
     * @param intent
     */
    @Override
    public void onNotPushData(Intent intent) {
        //TODO 没有推送数据,可能是异常调用,需要异常处理
        
    }

    /**
     * 是推送数据,但是又解密失败时的回调
     *
     * @param intent
     */
    @Override
    public void onParseFailed(Intent intent) {
        //TODO 推送数据解密异常,需要异常处理
    }
}

2 注册辅助弹窗Activity

AndroidManifest.xml文件中注册您自定义实现的辅助弹窗Activity,在application节点下添加。

<activity
    android:name="辅助弹窗Activity的全限定类名"
    android:exported="true">
    
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="${applicationId}"
            android:path="/thirdpush"
            android:scheme="agoo" />
    </intent-filter>
    
</activity>
重要

android:exported=true必须配置。

服务端配置

服务端可以使用OpenAPI,也可以使用阿里云控制台。

重要

使用移动推送进行厂商通道推送时,服务端必须进行以下配置,服务端参数不设置,不会给厂商通道进行推送。

1、OpenAPI推送配置

  • OpenAPI 2.0的推送高级接口提供了AndroidPopupActivityAndroidPopupTitleAndroidPopupBody三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline参数也需要设置为true);

  • 辅助弹窗仅在当前厂商通道设备的应用后台进程被清理时生效,对非接入厂商通道设备和在线的设备不生效。

  • 当辅助弹窗生效时,推送接口的Title、Body、AndroidActivity以及额外参数设置中的功能性设置(如声音、震动等)都不起作用;

服务端配置示例:

PushRequest pushRequest = new PushRequest();
// 其余设置省略
// 通知
pushRequest.setPushType("NOTICE");
// 标题
pushRequest.setTitle(dateFormat.format(new Date()));
// 内容
pushRequest.setBody("PushRequest body");
// 额外参数
pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
// 设置辅助弹窗打开Activity,填写Activity类名,需包名+类名
pushRequest.setAndroidPopupActivity("*****");
// 设置辅助弹窗通知标题
pushRequest.setAndroidPopupTitle("*****");
// 设置辅助弹窗通知内容
pushRequest.setAndroidPopupBody("*****");
// 72小时后消息失效, 不会再发送
String expireTime = ParameterHelper.getISO8601Time(new Date(System.currentTimeMillis() + 72 * 3600 * 1000)); 
pushRequest.setExpireTime(expireTime);
// 离线消息是否保存,若保存, 在推送时候,用户即使不在线,下一次上线则会收到
pushRequest.setStoreOffline(true); 
//推送消息类型时,设置true,设备离线时会自动把消息转成辅助通道的通知
pushRequest.setAndroidRemind(true);

2、阿里云控制台推送配置

登录移动研发平台EMAS,选择移动推送后选择对应的应用,在左侧导航栏选择创建消息>推送通知,在高级设置(选填)中,设置厂商通道必要参数,如下图所示。

辅助通道控制台配置