在移动应用开发中,消息推送能够说是一项很是重要的功能,它可以起到提醒或者唤醒用户的做用,同时也是产品运营人员更高效地实现运营目标的重要手段,好比将新上架一个商品或者最新的一条新闻推送给用户。node
事实上,消息推送是一个横跨业务服务器、第三方推送服务托管厂商、操做系统长链接推送服务、用户终端以及移动手机应用等五方面的复杂业务应用场景。在原生iOS开发中,为了简化消息推送,苹果推送服务(简称APNs)接管了系统全部应用的消息通知需求,任何第三方消息推送都须要通过推送服务进行转发。对于原生Android平台来讲,则可使Google提供的相似Firebase云消息传递机制来实现统一的推送托管服务。android
具体来讲,当某个应用须要发送消息推送时,消息会由应用的服务器先发给苹果或Google的消息推送服务器,而后经由APNs或FCM(Google的消息推送框架)发送到设备,设备接收到消息后通过系统层面完成解析,最终把消息转发给所属应用,整个工做流程以下图所示。git
不过,因为Google服务在大陆地区并不稳定,所以在国内的Android手机供应商一般会把Google服务换成本身开发的推送服务,并定制一套推送标准,而对于开发者来讲,无疑是增大了适配的负担。因此在处理Android端的消息推送时,一般会使用第三方推送服务,好比极光、个推和友盟推送等。公司在选择第三方工具时候,因为权衡的尺度不同,因此选择哪家做为推送服务还得根据实际状况而定。github
虽然这些第三方推送服务使用自建的长链接,没法享受操做系统底层的优化,但它们会对全部使用推送服务的应用共享推送通道,只要有一个使用第三方推送服务的应用没被系统杀死,就可让消息及时送达,所以并不须要考虑消息到达率的问题。npm
因为第三方推送服务厂商提供的功能和接入流程大都一致,考虑到极光的社区和生态相对活跃,而且在国内较早的推出Flutter插件,因此咱们能够在Flutter项目中直接使用这个插件,下图是极光推送的架构示意图。服务器
极光推送,英文简称JPush,是一个免费的第三方消息推送服务厂商,围绕推送服务,极光官方推出了众多平台的SDK及插件,如图下图所示。架构
Flutter插件支持多种依赖方式,一般有3种:git依赖、pub.dev依赖和本地依赖。app
打开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上加载,与你的网速有很大关系,也颇有可能加载不成功,须要耐心等待。iphone
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和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平台来讲,应用配置相对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应用,并在打开极光开发者服务后台添加一条推送消息,选择须要推送的平台,而后点击【当即发送】按钮,以下图所示。
等待消息推送成功后,就能够在对应的移动设备上看到推送的消息,以下图所示。