Flutter项目使用极光推送(JPush)详细教程

6,795 阅读4分钟

前言

本篇文章主要描述Flutter项目如何嵌入极光推送SDK,并兼容iOS及Android两个平台。iOS端目前JPush SDK已经封装的比较完整,但是针对Android端的适配并不太完美,特别是各个机型的离线推送和唤醒APP方面有缺失,本篇文章侧重描述Android端在使用极光推送时的一些额外补充步骤。

一、准备工作

极光推送官网注册账号,并创建APP应用,极光官方文档有详细说明,本文不再赘述。

二、项目配置

在pubspec.yaml文件中添加flutter_sdk,并点击Pub get。

image.png

1、iOS端配置

使用Xcode打开Flutter项目中的iOS文件夹,在info plist文件中添加全局配置项,如下图:

image.png

选中Signing&Capabilities,点击右上角+号,添加Push Notifications选项,如下图:

image.png

2、Android端配置

1、添加华为代码库(如不集成华为厂商通道可忽略此步骤)选择android文件夹,在主gradle中配置mavenCenteal,注意android中有两个build.gradle文件,需要在外层的build.gradle文件中实现下面的配置,如下图:

image.png 代码如下:

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

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath 'com.huawei.agconnect:agcp:1.6.0.300'
    }
}

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

2、在 Module 的 gradle 中添加依赖和 AndroidManifest 的替换变量(android目录下的app文件中的build.gradle文件),需要集成的厂商通道需填写对应的key,其他可以为空,代码如下:

                ......
                defaultConfig {
                    applicationId "com.xxx.xxx" //JPush 上注册的包名.
                    ......

                    ndk {
                        //选择要添加的对应 cpu 类型的 .so 库。
                        abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
                        // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
                    }

                    manifestPlaceholders = [
                        JPUSH_PKGNAME : applicationId,
                        //JPush 上注册的包名对应的 Appkey.
                        JPUSH_APPKEY : "你的 Appkey ", 
                        //暂时填写默认值即可.
                        JPUSH_CHANNEL : "developer-default",

                        //若不集成厂商通道,可直接跳过以下配置
                        MEIZU_APPKEY : "MZ-魅族的APPKEY",
                        MEIZU_APPID : "MZ-魅族的APPID",
                        XIAOMI_APPID : "MI-小米的APPID",
                        XIAOMI_APPKEY : "MI-小米的APPKEY",
                        OPPO_APPKEY : "OP-oppo的APPKEY",
                        OPPO_APPID : "OP-oppo的APPID",
                        OPPO_APPSECRET : "OP-oppo的APPSECRET",
                        VIVO_APPKEY : "vivo的APPKEY",
                        VIVO_APPID : "vivo的APPID"
                        HONOR_APPID : "Honor的APP ID", 
                    ]
                    ......
                }
                repositories {
                    flatDir {
                        dirs 'libs'
                    }
                }       
                ......
            }


            dependencies {
                ......
                // 此处以JCore 3.3.0 版本为例。
                implementation 'cn.jiguang.sdk:jcore:3.3.0'
                // 此处以JPush 4.7.2 版本为例
                implementation 'cn.jiguang.sdk:jpush:4.7.2'  
                
                //若不集成厂商通道,可直接跳过以下依赖
                // 极光厂商插件版本与接入 JPush 版本保持一致,下同
                // 接入华为厂商
                implementation 'com.huawei.hms:push:6.3.0.304'
                implementation 'cn.jiguang.sdk.plugin:huawei:4.7.2'
                // 接入 FCM 厂商
                implementation 'com.google.firebase:firebase-messaging:23.0.5'
                implementation 'cn.jiguang.sdk.plugin:fcm:4.7.2'
                // 接入魅族厂商
                implementation 'cn.jiguang.sdk.plugin:meizu:4.7.2'
                // 接入 VIVO 厂商
                implementation 'cn.jiguang.sdk.plugin:vivo:4.7.2'
                // 接入小米厂商
                implementation 'cn.jiguang.sdk.plugin:xiaomi:4.7.2'
                // 接入 OPPO 厂商
                implementation 'cn.jiguang.sdk.plugin:oppo:4.7.2'
                // 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-push-3.0.0', ext: 'aar')

                //以下为 OPPO 3.0.0 aar需要依赖
                implementation 'com.google.code.gson:gson:2.6.2'
                implementation 'commons-codec:commons-codec:1.6'
                implementation 'androidx.annotation:annotation:1.1.0'
                // 接入荣耀厂商
                implementation 'cn.jiguang.sdk.plugin:honor:4.7.2' 
                //需要单独引入荣耀厂商 aar ,请下载官网 SDK 包并把 jpush-android-xxx-release/third-push/honor/libs 下的 aar 文件单独拷贝一份到应用 module/libs 下
                implementation(name: 'HiPushSdk-v6.0.4.101-release', ext: 'aar')
                implementation(name: 'HiPushSdkCommon-v6.0.4.101-release', ext: 'aar')
                ......
            }

            apply plugin: 'com.google.gms.google-services'
            apply plugin: 'com.huawei.agconnect'

厂商通道参数申请指南参考极光官方文档

厂商通道 SDK 集成指南参考极光官方文档

厂商通道回执配置指南参考极光官方文档

三、初始化

在项目中调用初始化极光SDK

JPush jpush = JPush();
jpush.setup(
  appKey: "极光申请的APPKey",
  channel: "theChannel",
  production: false,
  debug: true, // 设置是否打印 debug 日志
);
jpush.addEventHandler(
  onReceiveNotification: (Map<String, dynamic> message) async {
    // 收到消息时调用此方法
  },
  onOpenNotification: (Map<String, dynamic> message) async {
    //点击通知栏消息,在此时通常可以做一些页面跳转等
    debugPrint(message.toString());
    //设置角标
    jpush.setBadge(0);
    MessageData model;
    if (Platform.isAndroid) {
      Map<String, dynamic> extras = message['extras'];
      String extraJsonStr = '';
      extraJsonStr = extras['cn.jpush.android.EXTRA'];
      extras = convert.jsonDecode(extraJsonStr ?? '');
      model = MessageData.fromJson(extras);
    } else if (Platform.isIOS) {
      model = MessageData.fromJson(message);
    }
  },
);

至此极光推送的基础功能已经实现完毕了,可以运行项目并在极光官网发送一条消息,手机可以接收到消息推送。

四、功能优化

1、iOS无法获取角标的问题

1.使用极光推送时,如果不在iOS项目中添加初始化方法,极光SDK是无法获取APP的角标数量的,所以我们还需要在iOS项目中添加极光推送的初始化方法。 如果iOS项目配置的Swift语言开发,需要先在Runner-Bridging-Header.h文件中引入极光头文件JPUSHService.h;如果是OC开发语言,则在AppDelegate文件中引入即可。

image.png 2.在didFinishLaunchingWithOptions方法中实现极光推送的初始化

image.png

2、安卓手机点击推送消息无法唤起APP的问题

Android端需要配置intent方式(极光推送)或者deeplink方式,才能唤起APP。下面介绍deeplink的设置方法, 在 AndroidManifest 中完成以下配置。


<activity android:name=".DeeplinkTestActivity">
    <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:scheme="jiguang" android:host="deeptest" android:host="/index">
    </data></category></category></action></intent-filter>
</activity>

scheme、host、host都是自定义,设置完成后,需将此url发给后端开发人员,加在消息体中,实例如下:

    "notification" : {
        "android" : {
             "alert" : "hello, JPush!", 
             "title" : "JPush test", 
             "intent": {
                "url": "jiguang://deeptest/index?key1=val1&amp;key2=val2"
            },
        }
    }
}

本文会持续更新,如果小伙伴们遇到其他问题也可以留言询问!!!