Flutter应用集成极光推送的实现示例
作者:xiangzhihong 发布时间:2023-06-24 03:51:04
概述
在移动应用开发中,消息推送可以说是一项非常重要的功能,它能够起到提醒或者唤醒用户的作用,同时也是产品运营人员更高效地实现运营目标的重要手段,比如将新上架一个商品或者最新的一条新闻推送给用户。
事实上,消息推送是一个横跨业务服务器、第三方推送服务托管厂商、操作系统长连接推送服务、用户终端以及移动手机应用等五方面的复杂业务应用场景。在原生iOS开发中,为了简化消息推送,苹果推送服务(简称APNs)接管了系统所有应用的消息通知需求,任何第三方消息推送都需要经过推送服务进行转发。对于原生Android平台来说,则可以使Google提供的类似Firebase云消息传递机制来实现统一的推送托管服务。
具体来说,当某个应用需要发送消息推送时,消息会由应用的服务器先发给苹果或Google的消息推送服务器,然后经由APNs或FCM(Google的消息推送框架)发送到设备,设备接收到消息后经过系统层面完成解析,最终把消息转发给所属应用,整个工作流程如下图所示。
不过,由于Google服务在大陆地区并不稳定,因此在国内的Android手机供应商通常会把Google服务换成自己开发的推送服务,并定制一套推送标准,而对于开发者来说,无疑是增大了适配的负担。所以在处理Android端的消息推送时,通常会使用第三方推送服务,比如极光、个推和友盟推送等。公司在选择第三方工具时候,由于权衡的尺度不一样,所以选择哪家作为推送服务还得根据实际情况而定。
虽然这些第三方推送服务使用自建的长连接,无法享受操作系统底层的优化,但它们会对所有使用推送服务的应用共享推送通道,只要有一个使用第三方推送服务的应用没被系统杀死,就可以让消息及时送达,因此并不需要考虑消息到达率的问题。
由于第三方推送服务厂商提供的功能和接入流程大都一致,考虑到极光的社区和生态相对活跃,并且在国内较早的推出Flutter插件,所以我们可以在Flutter项目中直接使用这个插件,下图是极光推送的架构示意图。
极光推送,英文简称JPush,是一个免费的第三方消息推送服务厂商,围绕推送服务,极光官方推出了众多平台的SDK及插件,如图下图所示。
添加极光插件
Flutter插件支持多种依赖方式,通常有3种:git依赖、pub.dev依赖和本地依赖。
通过git 方式依赖
打开Flutter工程的 pubspec.yaml 配制文件,然后添加添加 如下依赖代码。
# 极光推送插件
jpush_flutter:
# git 依赖方式
git:
# git 依赖的地址
url: git://github.com/jpush/jpush-flutter-plugin.git
# git 仓库中的分支
ref: master
然后,点击 【Packages get 】下载依赖或者直接在terminal 命令行中 使用【 flutter packages get】命令 来加载依赖,如下图所示。
直接通过git 的方式从 github上加载,与你的网速有很大关系,也很有可能加载不成功,需要耐心等待。
pub.dev方式依赖
pub 是Google官方的Dart Packages仓库,类似于node中的npm仓库,android中的jcenter,我们可以在上面查找我们需要的包和插件。我们可以访问国内的pub仓库来更快的搜索我们需要的插件。
然后在 flutter 项目的 pubspec.yaml 文件中配制极光推送的pub依赖,如下所示。
jpush_flutter: 0.1.0
jpush_flutter: ^0.1.0
两种写法的区别在于,后者会自动下载更高版本的,比如说这里配制的是 0.1.0 ,当 pub 仓库中的版本升级为 0.1.3 的时候,那么我们项目中本地依赖的版本不一定是 当前设置的 0.1.0 版本,而是其他版本。当然还可以使用下面的方式。
jpush_flutter: any
前者的区别是 会根据当前的项目环境加载适合当前项目环境中的版本插件,如有时我们指定版本加载时,会出现各种异常的冲突,当几个版本中与你使用到的功能无太大差异时,就可以考虑使用这种方法来简单粗暴的解决。
本地依赖
除了上面两种方式外,我们还可以把极光推送 flutter 插件下载到本地,然后在本地进行依赖。首先,去github上下载极光推送flutter插件的源码。
然后把下载下来的 zip 文件解压,放到一个目录中,然后在 flutter 项目中的 pubspec.yaml 配制极光推送的本地依赖,如下所示。
# 极光推送插件
jpush_flutter:
path: ../jpush-flutter-plugin
这里使用到的 ../ 是校对路径的表示方法,当然也可以使用jpush-flutter-plugin文件夹的全路径。
在 flutter 项目中有多种方式方法来依赖极光推送插件,依赖成功后如下图所示。
推送示例
原生配置
Android平台配置
由于推送会涉及到很多原生的配置,所以为了能够正常的进行消息推送,还需要在原生Android和iOS中进行一些配置工作。对于Android平台来说,配置工作相对简单,打开android/app/build.gradle文件,然后在defaultConfig节点中添加如下代码。
android: {
....
defaultConfig {
applicationId "替换成自己应用ID"
...
//ndk用于真机运行,用来指定对应的芯片架构
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a',
}
manifestPlaceholders = [
JPUSH_PKGNAME : applicationId,
JPUSH_APPKEY : "appkey",
JPUSH_CHANNEL : "developer-default",
]
}
}
如下图所示。
在极光开发者平台中创建推送应用程序,然后填写build.gradle脚本所需的参数,如下图所示。
然后,在Android手机上运行项目,会有 Running Gradle task ... 的提示,去 maven jcenter 下载 android 平台使用到的依赖库以及os库等。
iOS平台依赖
对于iOS平台来说,应用配置相对Android平台来说要繁琐一些,因为iOS的推送配置会涉及应用权限、苹果APNs服务和极光后台信息关联等过程。
然后,使用Xcode打开Flutter项目的iOS工程,然后依次选择【Target】→【Signing & Capabilities】→【Capability】→【Push Notifications】选项开启应用的消息推送功能,如下图所示。
然后,在极光开发者平台中配制 iOS的相关推送认证。
申请推送证书的过程,极光推送官网提供了比较详细的操作步骤,可以按照官网的步骤进行申请。然后,在极光开发者服务后台上传申请到的推送证书,如下图所示。
配制好证书后,运行 Flutter 项目于 iphone 手机上,如下图所示。
运行项目
完成上述操作后,极光推送所需的所有原生环境就配置完成了。接下来,使用Android Studio打开Flutter工程,在main.dart文件的initState生命周期函数中添加初始化JPush代码,如下所示。
void initState() {
super.initState();
JPush jpush = new JPush();
jpush.setup(
appKey: "96d7d7e77bee7abd4d568978",
channel: "flutter_channel",
production: false,
debug: true, //是否打印debug日志
);
}
然后,启动Flutter应用,并在打开极光开发者服务后台添加一条推送消息,选择需要推送的平台,然后点击【立即发送】按钮,如下图所示。
等待消息推送成功后,就可以在对应的移动设备上看到推送的消息,如下图所示。
来源:https://segmentfault.com/a/1190000021852351


猜你喜欢
- 历史原因当系统启动一个APP时,zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈
- 前言.如何设置设置使用的地方1.设置类注释模板代码/*** @author: lujie* @create: $date$* @descri
- 本文为大家分享了10道springboot常见面试题,供大家参考,具体内容如下1.什么是Spring Boot?多年来,随着新功能的增加,s
- 创建新的项目的时候,文件名一直追加,不分层对于刚用idea的小白,这个问题困扰了我好几天了,幸好现在还不怎么敲代码,下面给一个详细的解决方案
- 需求winForm 程序输出类型为 windows 程序(不是命令行程序)在运行时想输入一些信息编译开发调试,如何实现这一功能解答:Allo
- 最长公共子序列(Longest Common Subsequence)定义:两个或多个已知数列的子序列集合中最长的就是最长公共子序列。其实说
- NameServer1.架构设计消息中间件的设计思路一般都是基于主题订阅与发布的机制,RocketMQ也不例外。RocketMQ中,消息生产
- 简介 Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。它
- 我公司最近升级程序经常报出更新失败问题,究其原因,原来是更新时,他们可能又打开了正在被更新的文件,导致更新文件时,文件被其它进程占用,无法正
- 本文实例为大家分享了C#生成PDF文件流的具体代码,供大家参考,具体内容如下1、设置字体static BaseFont FontBase =
- 本文实例为大家分享了Android仿iphone自定义滚动选择器的具体代码,供大家参考,具体内容如下一、多的不说,效果图,先走起二、实例源码
- 当我们在spring容器中添加一个bean时,如果没有指明它的scope属性,则默认是singleton,也就是单例的。例如先声明一个bea
- 实例如下:public class ConfigOperator { #region 从配置文件获取V
- 使用的是idea+restful风格第一:引入依赖为:<!--poi--> <dependenc
- Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需
- 一、JTA组件简介什么是JTAJTA,全称:Java Transaction API。JTA事务比JDBC事务更强大。一个JTA事务可以有多
- 1 Excel上传针对Excel的上传,采用的是比较常规的方法,其实和文件上传是相同的。具体源码如下: @PostMapping
- 几点重要的用法:a 先来介绍几个方法TimeSpan.Minutes(其他时间比如天数,小时数,秒数都一样的情况下得到的分钟数的差),其他的
- 本文实例为大家分享了Android实现屏幕录制功能的具体代码,供大家参考,具体内容如下1.效果图:2.添加依赖 dependenc
- SpringBoot启动自动终止也不报错Error starting ApplicationContext. To display the