概述
在移动应用开发中,消息推送可以说是一项非常重要的功能,它能够起到提醒或者唤醒用户的作用,同时也是产品运营人员更高效地实现运营目标的重要手段,比如将新上架一个商品或者最新的一条新闻推送给用户。
事实上,消息推送是一个横跨业务服务器、第三方推送服务托管厂商、操作系统长连接推送服务、用户终端以及移动手机应用等五方面的复杂业务应用场景。在原生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文件夹的全路径。
推送示例
原生配置
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",
]
}
}
iOS平台依赖
对于iOS平台来说,应用配置相对Android平台来说要繁琐一些,因为iOS的推送配置会涉及应用权限、苹果APNs服务和极光后台信息关联等过程。
申请推送证书的过程,极光推送官网提供了比较详细的操作步骤,可以按照官网的步骤进行申请。然后,在极光开发者服务后台上传申请到的推送证书,如下图所示。
运行项目
完成上述操作后,极光推送所需的所有原生环境就配置完成了。接下来,使用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应用,并在打开极光开发者服务后台添加一条推送消息,选择需要推送的平台,然后点击【立即发送】按钮,如下图所示。