前言
本篇文章主要描述Flutter项目如何嵌入极光推送SDK,并兼容iOS及Android两个平台。iOS端目前JPush SDK已经封装的比较完整,但是针对Android端的适配并不太完美,特别是各个机型的离线推送和唤醒APP方面有缺失,本篇文章侧重描述Android端在使用极光推送时的一些额外补充步骤。
一、准备工作
在极光推送官网注册账号,并创建APP应用,极光官方文档有详细说明,本文不再赘述。
二、项目配置
在pubspec.yaml文件中添加flutter_sdk,并点击Pub get。
1、iOS端配置
使用Xcode打开Flutter项目中的iOS文件夹,在info plist文件中添加全局配置项,如下图:
选中Signing&Capabilities,点击右上角+号,添加Push Notifications选项,如下图:
2、Android端配置
1、添加华为代码库(如不集成华为厂商通道可忽略此步骤)选择android文件夹,在主gradle中配置mavenCenteal,注意android中有两个build.gradle文件,需要在外层的build.gradle文件中实现下面的配置,如下图:
代码如下:
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文件中引入即可。
2.在didFinishLaunchingWithOptions方法中实现极光推送的初始化
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&key2=val2"
},
}
}
}
本文会持续更新,如果小伙伴们遇到其他问题也可以留言询问!!!