Flutter 63: 图解 Flutter 集成极光 JPush 小结
我们每天都在接收各种推送消息,而最初的 Flutter 推送主要是与原生交互进行;现阶段极光推出了 Flutter JPush,虽不如原生强大,但日常需求均可满足,小菜尝试集成了 Flutter 版的 JPush;
前期准备
- 在 极光 后台注册账号并【创建应用】;
- 在【推送设置】中设置 Android/iOS 基本信息,小菜以 Android 为例,注意应用包名为 ApplicationID;
- 在【应用信息】中获取 AppKey 等关键参数;
中期集成
Android 配置
与原生接入 JPush 相同,需要在 Android Gradle 加入配置信息;
defaultConfig { applicationId "com.example.flutterapp01" minSdkVersion 16 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { //选择要添加的对应 cpu 类型的 .so 库。 abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a' } manifestPlaceholders = [ JPUSH_PKGNAME : "com.example.flutterapp01", JPUSH_APPKEY : "AppKey", // NOTE: JPush 上注册的包名对应的 Appkey. JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可. ] }
Flutter 配置
按照平常插件接入的方法在工程 pubspec.yaml 中加入 jpush_flutter: 0.1.0 并同步即可;
dependencies: jpush_flutter: 0.1.0
API 调用
JPush 的使用方式很简单,Demo 中都很全面,小菜仅尝试常见的方法;
1. 初始化
在原生开发中各类三方的插件几乎均须在 Application 中初始化,同样 Flutter 也需要先调用 JPush.setup 进行初始化;其中 channel 可自定义,小菜未从源码中获取准确消息,个人理解与高版本的 Android Channel 通道类似;
初始化成功之后即可获取消息推送,只是暂不能处理;
final JPush _jPush = JPush(); @override void initState() { super.initState(); initPlatformState(); } Future<void> initPlatformState() async { _jPush.setup( appKey: "后台获取 AppKey", channel: "flutter_channel", production: false, debug: true, ); if (!mounted) return; }
2. RegistrationID
每个用户均有作为接收消息的唯一标识 RegistrationID,方便对单个或多个设备进行推送测试;
_jPush.getRegistrationID().then((rid) { setState(() { _result = "JPush RegistrationID 唯一标识:\n $rid"; _registID = rid; }); });
3. 本地通知
JPush 提供了本地推送的方法,可以灵活调用获取本地推送消息;注意 id 为 int 类型,设置不能过长;
// 源码分析 const LocalNotification ({ @required this.id, // 通知 id, 可用于取消通知 @required this.title, // 通知标题 @required this.content, // 通知内容 @required this.fireTime, // 通知触发时间(毫秒) this.buildId, // 通知样式:1 为基础样式,2 为自定义样式(需先调用 'setStyleCustom' 设置自定义样式) this.extra, // 额外信息 this.badge = 0, // iOS:本地推送触发后应用角标值 this.soundName, // iOS:指定推送的音频文件 this.subtitle // iOS:子标题 }): onTap: () { var fireDate = DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch + 3000); var localNotification = LocalNotification( id: 000001, title: 'Local Push 本地标题', buildId: 1, content: 'Local Push 本地内容', fireTime: fireDate, extra: {"extra_key": "extra_value"}); _jPush.sendLocalNotification(localNotification).then((res) { setState(() { _result = res; }); }); }
4. 通知类消息
小菜集成原生推送时分为 通知类消息 和 透传类消息(自定义消息),两种推送略有不同;通知类消息可以通过极光后台配置消息标题、消息内容等多种信息,且 App 接收到之后直接调用推送通道展现在通知栏中;
try { _jPush.addEventHandler( onReceiveNotification: (Map<String, dynamic> message) async { // 获取通知数据 print('Flutter JPush 获取通知类数据:\n $message'); setState(() { _result = 'Flutter JPush 获取通知类数据:\n $message'; _message = message; }); } ); } on PlatformException { platformVersion = 'Failed to get platform version.'; }
5. 透传类消息
透传类消息通过极光后台配置发送,主要配置通知内容;App 接收到不会直接调用推送通道,获取内容后我们可根据内容灵活使用,是否展示推送消息或其他操作等;且通知类消息与透传类消息获取参数不同;
try { _jPush.addEventHandler( onReceiveMessage: (Map<String, dynamic> message) async { // 获取透传数据 print('Flutter JPush 获取透传类数据:\n $message'); setState(() { _result = 'Flutter JPush 获取透传类数据:\n $message'; _message = message; }); } ); } on PlatformException { platformVersion = 'Failed to get platform version.'; }
6. 推送点击监听
获取到推送之后注定要有点击操作,JPush 也同样提供了监听方法,包括通知类消息和本地推送消息;
try { _jPush.addEventHandler( onOpenNotification: (Map<String, dynamic> message) async { // 点击通知信息 print('Flutter JPush 点击通知消息:\n $message'); setState(() { _result = 'Flutter JPush 点击通知消息:\n $message'; _message = message; }); } ); } on PlatformException { platformVersion = 'Failed to get platform version.'; }
7. 清空通知栏
在用户收到推送通知后若未点击,原生 Android 可通过 NotificationManager.cancel() 清除通知,Flutter 也提供了清空通知栏方法;但小菜测试只可清空通知类推送消息,本地发送的通知消息无法清空;
Future clearAllNotifications() async { await _channel.invokeMethod('clearAllNotifications'); } _jPush.clearAllNotifications();
后期测试
1. 通知类消息
- 在极光后台【发送通知】中按要求编辑目标平台、通知标题、通知内容、发送时间和选择目标等基本信息;
- App 接收消息,并展示推送消息,各参数如下:
2. 透传类消息
- 在极光后台【自定义消息】中按要求编辑目标平台、通知内容、发送时间和选择目标等基本信息;其中 Registration ID 为测试时获取的唯一标识;
- App 接收消息,不会展示推送消息,若需要可调用本地通知;各参数如下:
onOpenNotification: (Map<String, dynamic> message) async { setState(() { _result = 'Flutter JPush 点击通知消息:\n $message'; _message = message; Map<String, dynamic> message2 = convert.jsonDecode(_message['extras']['cn.jpush.android.EXTRA']); if (message2['type'] == "1") { Toast.show('自定义通知消息!', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM); } }); } onReceiveMessage: (Map<String, dynamic> message) async { setState(() { _result = 'Flutter JPush 获取透传类数据:\n $message'; _message = message; Map<String, dynamic> message2 = convert.jsonDecode(_message['message']); var fireDate = DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch + 2000); var localNotification = LocalNotification( id: message2['id'], title: message2['title'], buildId: 1, content: message2['context'], fireTime: fireDate, extra: {"type": message2['type']}); _jPush.sendLocalNotification(localNotification).then((res) { setState(() { _result = res; }); }); }); }
小菜认为 Flutter 版的极光推送与 Android 原生版本的差异在于,大部分的配置有 App 端移到了极光后台,包括图标 icon,页面处理,通知级别等;小菜仅尝试了基本的消息推送及处理,还是有很多细节需要认真学习;如有问题,请多多指导!
来源: 阿策小和尚
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何使用JavaScript开发AR(增强现实)移动应用 (一)
本文封面配图是去年Jerry看的一部电影《异形:契约》的剧照。 所谓AR(Augmented Reality), 即增强现实,是一种将通过计算机渲染出的虚拟图像与真实世界巧妙融合的手段,背后广泛运用了多媒体、三维建模、实时跟踪、智能交互、传感等多种计算机技术,将程序代码生成的文字、图像、三维模型、音乐、视频等虚拟信息模拟仿真后,显示在终端用户通过移动设备的摄像头观察到的真实世界中,虚拟和真实的两种世界互为补充,从而让终端用户感受到真实世界被“增强”的体验。 前端开发者的一个福音,就是如今我们可以仅仅凭借JavaScript技能,就能开发一个支持增强实现的移动应用了。使用的工具是React-Native + ViroReact. 下面这个视频是Jerry的同事,SAP成都研究院数字创新空间的开发工程师Leo Wang用React-Nati
- 下一篇
RxJava2 和 Retrofit2 结合使用详解
不讲 rxjava 和 retrofit 而是直接上手 2 了,因为 2 封装的更好用的更多。 1. 观察者模式 常见的 button 点击事件为例,button 是被观察者,listener 是观察者,setOnClickListener 过程是订阅,有了订阅关系后在 button 被点击的时候,监听者 listener 就可以响应事件。 这里的button.setOnClickListener(listener)看上去意思是被观察者订阅了观察者(杂志订阅了读者),逻辑上不符合日常生活习惯。其实这是设计模式的习惯,不必纠结,习惯了这种模式就利于理解观察者模式了。 2. RxJava 中的观察者模式 Observable:被观察者(ble 结尾的单词一般表示 可...的,可观察的) Observer:观察者(er 结尾的单词一般表示 ...者,...人) subscribe:订阅 首先创建 Observable 和 Observer,然后 observable.subscribe(observer),这样 Observable 发出的事件就会被 Observer 响应。一般我们不手动创...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G