《极光推送厂商离线通道集成文档》
flutter集成指南

1.Android端配置

gradle配置

    //极光推送
    def jpushVersion = '4.4.0'
    implementation "cn.jiguang.sdk:jpush:$jpushVersion"
    implementation 'cn.jiguang.sdk:jcore:3.0.0-release'
	manifestPlaceholders = [
              JPUSH_PKGNAME: "包名",
              JPUSH_APPKEY : "秘钥", /*NOTE: JPush 上注册的包名对应的 Appkey.*/
              JPUSH_CHANNEL: "developer-default", /*暂时填写默认值即可.*/
      ]

2.flutter引入极光推送

dependencies:
	jpush_flutter: 2.1.4

更多查看flutter端集成文档:
https://github.com/jpush/jpush-flutter-plugin
https://www.jianshu.com/p/c58e1f923d32

此时的配置仅仅能够收到极光通道的在线推送,对于离线通道将受到影响,接下来继续集成

3.在android端项目的build.gradle文件中

新增厂商离线通道配置

    //极光推送
    def jpushVersion = '4.4.0'
    implementation "cn.jiguang.sdk:jpush:$jpushVersion"
    implementation 'cn.jiguang.sdk:jcore:3.0.0-release'
    //新增的离线通道配置
    implementation 'com.huawei.hms:push:5.3.0.301'
    implementation "cn.jiguang.sdk.plugin:huawei:$jpushVersion"
    implementation "cn.jiguang.sdk.plugin:xiaomi:$jpushVersion"
    implementation "cn.jiguang.sdk.plugin:vivo:$jpushVersion"
    implementation "cn.jiguang.sdk.plugin:meizu:$jpushVersion"
    implementation "cn.jiguang.sdk.plugin:oppo:$jpushVersion"

4.android端新增厂商通道接收处理的回调Activity

假设项目包名为:com.example.push
厂商通道的推送通知处理解析逻辑如下

package com.example.push;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;

import org.json.JSONException;
import org.json.JSONObject;

import cn.jpush.android.api.JPushInterface;
import timber.log.Timber;

/**
 * 离线厂商通道回调页面
 */
public class PopupPushActivity extends Activity {
    private final String TAG = PushConstant.TAG;

    /**
     * 消息Id
     **/
    private static final String KEY_MSGID = "msg_id";
    /**
     * 该通知的下发通道
     **/
    private static final String KEY_WHICH_PUSH_SDK = "rom_type";
    /**
     * 通知标题
     **/
    private static final String KEY_TITLE = "n_title";
    /**
     * 通知内容
     **/
    private static final String KEY_CONTENT = "n_content";
    /**
     * 通知附加字段
     **/
    private static final String KEY_EXTRAS = "n_extras";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handleOpenClick();
    }


    /**
     * 处理点击事件,当前启动配置的Activity都是使用
     * Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
     * 方式启动,只需要在onCreat中调用此方法进行处理
     */
    private void handleOpenClick() {
        String data = null;
        //获取华为平台附带的jpush信息
        if (getIntent().getData() != null) {
            data = getIntent().getData().toString();
        }

        //获取fcm、oppo、vivo、华硕、小米平台附带的jpush信息
        if (TextUtils.isEmpty(data) && getIntent().getExtras() != null) {
            data = getIntent().getExtras().getString("JMessageExtra");
        }
        Timber.tag(TAG).d("【离线通道打开】%s", data);

        if (TextUtils.isEmpty(data)) return;
        try {
            JSONObject jsonObject = new JSONObject(data);
            String msgId = jsonObject.optString(KEY_MSGID);
            byte whichPushSDK = (byte) jsonObject.optInt(KEY_WHICH_PUSH_SDK);
            String title = jsonObject.optString(KEY_TITLE);
            String message = jsonObject.optString(KEY_CONTENT);
            String extras = jsonObject.optString(KEY_EXTRAS);
            // TODO: 2021/12/7/007  处理跳转离线消息
            // 此时的跳转逻辑,需要判断app是否在前台,如果不在,需要添加跳转逻辑新增flag标记
            // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			Intent intent = new Intent(YLApplication.this, MainActivity.class);
            intent.putExtra("title",title);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
			//上传事件统计
            uploadReport(msgId, whichPushSDK, title, message, extras);
        } catch (JSONException e) {
            Timber.tag(TAG).e(e);
        }

        finish();
    }

    private void uploadReport(String msgId, byte whichPushSDK, String title, String message, String extras) {
        StringBuilder sb = new StringBuilder();
        sb.append("msgId:");
        sb.append(msgId);
        sb.append("\n");
        sb.append("title:");
        sb.append(title);
        sb.append("\n");
        sb.append("content:");
        sb.append(message);
        sb.append("\n");
        sb.append("extras:");
        sb.append(extras);
        sb.append("\n");
        sb.append("platform:");
        sb.append(getPushSDKName(whichPushSDK));

        //上报点击事件
        JPushInterface.reportNotificationOpened(this, msgId, whichPushSDK);
    }

    private String getPushSDKName(byte whichPushSDK) {
        String name;
        switch (whichPushSDK) {
            case 0:
                name = "jpush";
                break;
            case 1:
                name = "xiaomi";
                break;
            case 2:
                name = "huawei";
                break;
            case 3:
                name = "meizu";
                break;
            case 4:
                name = "oppo";
                break;
            case 5:
                name = "vivo";
                break;
            case 6:
                name = "asus";
                break;
            case 8:
                name = "fcm";
                break;
            default:
                name = "jpush";
        }
        return name;
    }


}

5.服务端推送配置

这个时候需要新增部分参数,来指定厂商通道时的消息通知页面
服务端java推送的部分代码

pushRequest.setAndroidOpenType("ACTIVITY");
pushRequest.setAndroidActivity("com.example.push.PopupPushActivity");
pushRequest.setAndroidPopupActivity("com.example.push.PopupPushActivity");

6.android端初始化逻辑要记得加上

  JPushInterface.setDebugMode(isDebug);
  JPushInterface.setChannel(application, "xxx");
  JPushInterface.init(application);

7.剩下的api调用按照业务逻辑处理即可,到这里集成就完成了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐