1:版本说明

该文写作日期为2024年5月20日,以极光推送 jpush_flutter: 3.0.0 为版本进行对接参考;

我推送平台选择为:iOS、oppo、vivo、荣耀、小米、华为。

相关资源下载地址:https://docs.jiguang.cn/jpush/resources

2:Flutter代码部分

(1)在pubspec.yaml 中添加

jpush_flutter: 3.0.0

(2)在合适位置调用极光推送初始化代码,例如:

// print("推送开启");
    jPush.addEventHandler(
      // 接收通知回调方法。
      onReceiveNotification: (Map<String, dynamic> message) async {
        print("flutter onReceiveNotification: $message");
      },
      // 点击通知回调方法。
      onOpenNotification: (Map<String, dynamic> message) async {
        print("flutter onOpenNotification: $message");
      },
      // 接收自定义消息回调方法。
      onReceiveMessage: (Map<String, dynamic> message) async {
        print("flutter onReceiveMessage: $message");
      },
      onConnected: (Map<String, dynamic> message) async {
        print("flutter onConnected: $message");
      },
    );
    jPush.setup(
      appKey: "替换为自己的极光APPKEPY",
      channel: "theChannel",
      production: kDebugMode ? false : true,
      debug: false, // 设置是否打印 debug 日志
    );
    if(Platform.isIOS){//此处为iOS提示推送权限
      jPush.applyPushAuthority(const NotificationSettingsIOS(sound: true, alert: true, badge: true));
    }
    jPush.getRegistrationID().then((rid) {});
    jPush.resumePush();//恢复接收推送
    Future.delayed(Duration(seconds: 5)).then((onValue) async{
      jPush.setAlias("替换为注册自定义别名").then((map) { });
    });
    jPush.setBadge(0);

以上代码注释:

延迟五秒注册别名,是为了在注册极光极光时,可能会有部分网络延迟因素导致返回时间长,如果在注册后立刻注册别名,可能会出现60XX报错,所以适当延迟5秒(官方文档中推荐7-8秒);

iOS推送不适用 await Permission.notification.status 来判断,因为该判断永远会直接返回拒绝,不知道是权限问题还是系统版本问题。

jPush.resumePush();//恢复接收推送,这里是配合后续的停止推送模块进行的适配,多次恢复极光不会报错。调用就行了。

(3)停止极光推送

    jPush.setAlias("").then((map) { });
    jPush.stopPush();

在退出登陆或被动退出登陆时调用上述代码,可以停止对该设备的消息推送,将别名注册为空字符串,一个是可以解除对别名的占用,一个别名只能绑定10个设备,为空别名后也可以避免接收到离线消息推送。

3:安卓部分

1:在root的build.gradle中添加代码,示例如下:

buildscript {
    repositories {
        google()
        mavenCentral()
        // hms, 若不集成华为厂商通道,可直接跳过
        maven { url 'https://developer.huawei.com/repo/' }
    }

    dependencies {
        // hms,若不集成华为厂商通道,可直接跳过
        classpath 'com.android.tools.build:gradle:7.1.3'
        classpath 'com.huawei.agconnect:agcp:1.9.1.301'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://developer.huawei.com/repo/' }
    }

}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

tasks.register("clean", Delete) {
    delete rootProject.buildDir
}

如果不集成华为推送,则无需改动上述文件。

2:在root-app下增加一个libs目录,示例如下图

荣耀与oppo平台的aar包需要我们手动引入。不包含这2个平台可以不创建libs目录。

aar包可在https://docs.jiguang.cn/jpush/resources的Android SDK的下载中获取,目录为jpush-android-xxx-release/third-push/

3:在root-app-build.gradle中修改:

plugins {
    id "com.android.application"
    id "kotlin-android"
    id "dev.flutter.flutter-gradle-plugin"
    id "com.huawei.agconnect"
}

如不对接华为推送平台可以不加id "com.huawei.agconnect"

在defaultConfig 中添加

 manifestPlaceholders += [
                JPUSH_PKGNAME : applicationId,
                JPUSH_APPKEY : "替换为你的极光APPKEY", // NOTE: JPush 上注册的包名对应的 Appkey.
                JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
                MEIZU_APPKEY : "MZ-魅族的APPKEY",//MZ- 需要保留下同
                MEIZU_APPID : "MZ-魅族的APPID",
                XIAOMI_APPID : "MI-小米的APPID",//MI- 需要保留下同
                XIAOMI_APPKEY : "MI-小米的APPKEY",
                OPPO_APPKEY : "OP-oppo的APPKEY",//OP- 需要保留下同
                OPPO_APPID : "OP-oppo的APPID",
                OPPO_APPSECRET : "OP-oppo的APPSECRET",
                VIVO_APPKEY : "VIVO的APPKEY",//无前缀
                VIVO_APPID : "VIVO的APPID",
                HONOR_APPID : "HONOR的APPID",
        ]

在dependencies中添加下述依赖

// 此处以JPush 5.2.4 版本为例,5.2.4 版本开始可以自动拉取 JCore 包,无需另外配置
implementation 'cn.jiguang.sdk:jpush:5.2.4'
//若不集成厂商通道,可直接跳过以下依赖
// 极光厂商插件版本与接入 JPush 版本保持一致,下同
// 接入华为厂商
implementation 'cn.jiguang.sdk.plugin:huawei:5.3.1'
implementation 'com.huawei.hms:push:6.12.0.300'
// 接入 FCM 厂商
implementation 'com.google.firebase:firebase-messaging:24.0.0'
implementation 'cn.jiguang.sdk.plugin:fcm:5.3.1'
// 接入魅族厂商
implementation 'cn.jiguang.sdk.plugin:meizu:5.3.1'
// 接入 VIVO 厂商
implementation 'cn.jiguang.sdk.plugin:vivo:5.3.1'
// 接入小米厂商
implementation 'cn.jiguang.sdk.plugin:xiaomi:5.3.1'
// 接入 OPPO 厂商
implementation 'cn.jiguang.sdk.plugin:oppo:5.3.1'
// JPush Android SDK v4.6.0 开始,需要单独引入 oppo 厂商 aar ,请下载官网 SDK 包并把 jpush-android-xxx-release/third-push/oppo/libs 下的 aar 文件单独拷贝一份到应用 module/libs 下
// implementation(name: "com.heytap.msp_3.4.0", ext: 'aar')

//以下为 OPPO 3.1.0 aar需要依赖
implementation 'com.google.code.gson:gson:2.10'
implementation 'commons-codec:commons-codec:1.11'
implementation 'androidx.annotation:annotation:1.8.0'
// 接入荣耀厂商
implementation 'cn.jiguang.sdk.plugin:honor:5.3.1'
//需要单独引入荣耀厂商 aar ,请下载官网 SDK 包并把 jpush-android-xxx-release/third-push/honor/libs 下的 aar 文件单独拷贝一份到应用 module/libs 下
// implementation(name: 'HiPushSDK-7.0.61.302', ext: 'aar')
implementation fileTree(include: ['*.aar'], dir: 'libs')

implementation fileTree(include: ['*.aar'], dir: 'libs')采用这个语句,可以直接将之前创建的libs目录下所有的aar包直接全部引入,省去之后改动的麻烦。

4:在root-app-main-AndroidManifest.xml中添加

<!-- Since JCore2.0.0 Required SDK核心功能-->
        <!-- 可配置android:process参数将Service放在其他进程中;android:enabled属性不能是false -->
        <!-- 这个是自定义Service,要继承极光JCommonService,可以在更多手机平台上使得推送通道保持的更稳定 -->
        <service android:name=".common.UserService"
            android:enabled="true"
            android:exported="false"
            android:process=":pushcore">
            <intent-filter>
                <action android:name="cn.jiguang.user.service.action" />
            </intent-filter>
        </service>

        <service android:name=".jpush.PushMessageService"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.SERVICE_MESSAGE" />
                <category android:name="${applicationId}"></category>
            </intent-filter>
        </service>

即可完成对安卓代码部分的完全配置。

4:华为特别配置

请首先参考https://docs.jiguang.cn/jpush/client/Android/android_3rd_guide#华为通道集成指南 下的指南进行agconnect-services.json 文件配置。

然后在华为开放平台一定要去配置app签名文件的 SHA256证书指纹才能成功调用通华为的厂商通道

荣耀方面会进行自动配置。

5:安卓其他问题

"intent": {
                "url": "intent:#Intent;action=android.intent.action.MAIN;end"
            },

安卓推送体中intent 添加上述代码即可点击推送,打开app。

"classification": 1

这样消息走的时系统消息,运营消息每天会有限额

"huawei": {
                "category": "IM",
                "distribution": "secondary_push",
                "distribution_fcm": "secondary_fcm_push",
            },

华为需要配置二级category才不会被限额,需要去华为开放平台自助申请。