Flutter应用集成极光推送的实现示例

作者:xiangzhihong 时间:2023-06-24 03:51:04 

概述

在移动应用开发中,消息推送可以说是一项非常重要的功能,它能够起到提醒或者唤醒用户的作用,同时也是产品运营人员更高效地实现运营目标的重要手段,比如将新上架一个商品或者最新的一条新闻推送给用户。

事实上,消息推送是一个横跨业务服务器、第三方推送服务托管厂商、操作系统长连接推送服务、用户终端以及移动手机应用等五方面的复杂业务应用场景。在原生iOS开发中,为了简化消息推送,苹果推送服务(简称APNs)接管了系统所有应用的消息通知需求,任何第三方消息推送都需要经过推送服务进行转发。对于原生Android平台来说,则可以使Google提供的类似Firebase云消息传递机制来实现统一的推送托管服务。

具体来说,当某个应用需要发送消息推送时,消息会由应用的服务器先发给苹果或Google的消息推送服务器,然后经由APNs或FCM(Google的消息推送框架)发送到设备,设备接收到消息后经过系统层面完成解析,最终把消息转发给所属应用,整个工作流程如下图所示。

Flutter应用集成极光推送的实现示例

不过,由于Google服务在大陆地区并不稳定,因此在国内的Android手机供应商通常会把Google服务换成自己开发的推送服务,并定制一套推送标准,而对于开发者来说,无疑是增大了适配的负担。所以在处理Android端的消息推送时,通常会使用第三方推送服务,比如极光、个推和友盟推送等。公司在选择第三方工具时候,由于权衡的尺度不一样,所以选择哪家作为推送服务还得根据实际情况而定。

虽然这些第三方推送服务使用自建的长连接,无法享受操作系统底层的优化,但它们会对所有使用推送服务的应用共享推送通道,只要有一个使用第三方推送服务的应用没被系统杀死,就可以让消息及时送达,因此并不需要考虑消息到达率的问题。

由于第三方推送服务厂商提供的功能和接入流程大都一致,考虑到极光的社区和生态相对活跃,并且在国内较早的推出Flutter插件,所以我们可以在Flutter项目中直接使用这个插件,下图是极光推送的架构示意图。

Flutter应用集成极光推送的实现示例

极光推送,英文简称JPush,是一个免费的第三方消息推送服务厂商,围绕推送服务,极光官方推出了众多平台的SDK及插件,如图下图所示。

Flutter应用集成极光推送的实现示例

添加极光插件

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】命令 来加载依赖,如下图所示。

Flutter应用集成极光推送的实现示例

直接通过git 的方式从 github上加载,与你的网速有很大关系,也很有可能加载不成功,需要耐心等待。

pub.dev方式依赖

pub 是Google官方的Dart Packages仓库,类似于node中的npm仓库,android中的jcenter,我们可以在上面查找我们需要的包和插件。我们可以访问国内的pub仓库来更快的搜索我们需要的插件。

Flutter应用集成极光推送的实现示例

然后在 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应用集成极光推送的实现示例

本地依赖

除了上面两种方式外,我们还可以把极光推送 flutter 插件下载到本地,然后在本地进行依赖。首先,去github上下载极光推送flutter插件的源码。

Flutter应用集成极光推送的实现示例

然后把下载下来的 zip 文件解压,放到一个目录中,然后在 flutter 项目中的 pubspec.yaml 配制极光推送的本地依赖,如下所示。


# 极光推送插件
jpush_flutter:
 path: ../jpush-flutter-plugin

这里使用到的 ../ 是校对路径的表示方法,当然也可以使用jpush-flutter-plugin文件夹的全路径。

Flutter应用集成极光推送的实现示例

在 flutter 项目中有多种方式方法来依赖极光推送插件,依赖成功后如下图所示。

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",
 ]
}  
}

如下图所示。

Flutter应用集成极光推送的实现示例

在极光开发者平台中创建推送应用程序,然后填写build.gradle脚本所需的参数,如下图所示。

Flutter应用集成极光推送的实现示例

然后,在Android手机上运行项目,会有 Running Gradle task ... 的提示,去 maven jcenter 下载 android 平台使用到的依赖库以及os库等。

Flutter应用集成极光推送的实现示例

iOS平台依赖

对于iOS平台来说,应用配置相对Android平台来说要繁琐一些,因为iOS的推送配置会涉及应用权限、苹果APNs服务和极光后台信息关联等过程。

Flutter应用集成极光推送的实现示例

然后,使用Xcode打开Flutter项目的iOS工程,然后依次选择【Target】→【Signing & Capabilities】→【Capability】→【Push Notifications】选项开启应用的消息推送功能,如下图所示。

Flutter应用集成极光推送的实现示例

然后,在极光开发者平台中配制 iOS的相关推送认证。

Flutter应用集成极光推送的实现示例

申请推送证书的过程,极光推送官网提供了比较详细的操作步骤,可以按照官网的步骤进行申请。然后,在极光开发者服务后台上传申请到的推送证书,如下图所示。

Flutter应用集成极光推送的实现示例

配制好证书后,运行 Flutter 项目于 iphone 手机上,如下图所示。

Flutter应用集成极光推送的实现示例

运行项目

完成上述操作后,极光推送所需的所有原生环境就配置完成了。接下来,使用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应用,并在打开极光开发者服务后台添加一条推送消息,选择需要推送的平台,然后点击【立即发送】按钮,如下图所示。

Flutter应用集成极光推送的实现示例

等待消息推送成功后,就可以在对应的移动设备上看到推送的消息,如下图所示。

Flutter应用集成极光推送的实现示例

来源:https://segmentfault.com/a/1190000021852351

标签:Flutter,极光推送
0
投稿

猜你喜欢

  • 为什么Java开发需要配置环境变量

    2023-08-13 13:11:03
  • android打开本地图像的方法

    2022-10-26 08:01:42
  • WPF ComboBox获取当前选择值的实例详解

    2022-02-09 17:26:23
  • java算法之Math.random()随机概率玩法实例演示

    2023-11-28 23:32:17
  • Java中基于Shiro,JWT实现微信小程序登录完整例子及实现过程

    2023-07-05 15:01:42
  • Spring Boot + Vue 前后端分离项目如何踢掉已登录用户

    2021-07-23 21:57:35
  • Spring Bean初始化及销毁多种实现方式

    2023-06-10 13:14:01
  • Android App调试内存泄露之Cursor篇

    2023-11-22 03:36:29
  • 深入理解Spring事务原理

    2022-01-18 04:16:39
  • SpringBoot优雅地实现全局异常处理的方法详解

    2023-09-06 09:17:02
  • Java数据结构及算法实例:三角数字

    2023-08-24 17:52:25
  • java异常处理的简单练习

    2023-12-01 02:20:48
  • Idea servlet映射方法优缺点对比

    2023-06-12 23:59:34
  • spring cloud gateway请求跨域问题解决方案

    2021-11-05 11:19:25
  • 关于Jedis的用法以及Jedis使用Redis事务

    2023-06-28 07:22:56
  • Java实现TCP/IP协议的收发数据(服务端)代码实例

    2023-08-11 08:44:51
  • Spring集成Quartz的简单配置的方法

    2023-08-24 02:52:27
  • Android 适配器模式应用及设计原理

    2023-08-01 19:08:04
  • C#中WPF内存回收与释放LierdaCracker的实现

    2022-11-13 00:15:44
  • C#控件picturebox实现画图功能

    2022-03-07 18:36:43
  • asp之家 软件编程 m.aspxhome.com