Flutter 应用程序更新

news2024/11/23 2:32:18

Flutter 应用程序更新

alt

原文 https://medium.com/flutter-community/in-app-update-the-flutter-way-2f25e4a02c02

前言

当您推出应用程序的新版本时,您希望您的用户了解它。无论是因为您修复了一个关键的 bug,添加了一个新特性,还是仅仅因为应用程序运行得更平滑或更快。作为应用程序开发人员,我们希望所有用户都使用应用程序的最新版本。

但是我们如何确保用户知道我们的应用程序的新版本呢?

这个问题的答案很简单: 为什么不在我们的应用程序的新版本发布时通知他们呢。你可以通过多种方式来做到这一点:

  • 推送通知
  • 当应用程序启动时

在本文中,我们将不讨论推送通知,而是将重点放在展示如何(使用一两个包)向用户显示一个对话框,通知他们新版本的应用程序已经发布,并处理更新。

正文

等等,这不是已经包括在内了吗?

您可能认为这种功能应该已经包含在现代移动操作系统中。你是对的,但只适用于安卓系统。IOS (目前)不支持开发人员查看应用程序是否有新版本并通知用户的能力。在 Android 中,应用程序内部更新库是 GooglePlay 库的一部分。

由于 Flutter 支持这两个平台,我将介绍两个突出的软件包,它们可以帮助您处理应用程序的版本更新:

  1. upgrader
  2. in_app_update

两者都可以得到你想要的结果,但是它们在实现方式上有很大的不同。

在我们开始之前,了解您的应用程序的版本必须直接从 GooglePlay 商店安装,这一点至关重要。这是必需的,因为这两个包都依赖于 GooglePlay 服务,并且它能够验证应用程序的所有者。如果您没有这样做,那么在尝试使用其中一个包时,您将看到以下错误:

安装错误(- 10) : 该应用程序不属于此设备上的任何用户。如果一个应用程序是从 Play 获得的,那么它就是“拥有的”。( https://developer.android.com/reference/com/google/android/play/core/install/model/installerrorcode#error_app_not_owned )

In App Update

需要马上说明的是,这个软件包只能在 Android 上使用。因为它的内部工作依赖于应用程序中的更新库。这个包基本上是 Android 库的包装器,下面是它公开的 API 方法:

  • Future<AppUpdateInfo> checkForUpdate() : 检查是否有可用的更新
  • Future<AppUpdateResult> performImmediateUpdate() : 执行即时更新(全屏)
  • Future<AppUpdateResult> startFlexibleUpdate() : 启动一个灵活的更新(后台下载)
  • Future<void> completeFlexibleUpdate() : 实际上安装了一个可用的灵活更新

Something 如果你想了解更多关于即时更新和灵活更新之间的区别,请点击这里。

开始设置

  1. 将包添加到 pubspec.yaml 文件:
dependencies:
  flutter:
    sdk: flutter
  in_app_update: ^3.0.0
  1. Perform pub get

  2. 在应用程序内部,在应用程序更新中执行逻辑处理时,添加以下导入:

import 'package:in_app_update/in_app_update.dart';

我们首先需要添加检查应用程序是否有更新的逻辑。为此,我们将使用 checkForUpdate 方法。它的返回值是 Future<AppUpdateInfo>,其中包含有关应用程序更新的可用性和进度的信息。我们可以使用 updateUtiability 属性检查更新是否可用。如果一个更新是可用的,它的值将为 UPDATE_AVAILABLE。所以,你的方法可能看起来像这样:

InAppUpdate.checkForUpdate().then((updateInfo) {
  if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) {
      //Logic to perform an update
  }
});

接下来,我们需要决定要触发哪种类型的更新。要么灵活,要么立即更新。应该为对用户至关重要的应用程序更新保留即时更新。这可能意味着修复关键错误或提供新特性的版本。若要立即启动更新,可以使用 PerformimateUpdate 方法。此方法返回 AppUpdateResult 枚举,该枚举让您知道更新是否成功。在调用此方法之前,我们需要检查是否允许运行即时更新。我们可以通过访问 AppUpdateInfo 对象上的 limateUpdateAlallow 标志来实现这一点。

如果我们想触发一个灵活的更新,我们使用 startFleixbleUpdate 方法。这在后台运行,类似于即时更新方法,它还返回 AppUpdateResult 枚举。如果在这个场景中,更新是成功的,我们需要调用 CompleteFlexibleUpdate 方法来将更新安装到我们的应用程序中。

因此,如果我们查看上面的代码片段并为不同类型的更新添加逻辑,它将如下所示:

InAppUpdate.checkForUpdate().then((updateInfo) {
  if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) {
      if (updateInfo.immediateUpdateAllowed) {
          // Perform immediate update
          InAppUpdate.performImmediateUpdate().then((appUpdateResult) {
              if (appUpdateResult == AppUpdateResult.success) {
                //App Update successful
              }
          });
      } else if (updateInfo.flexibleUpdateAllowed) {
        //Perform flexible update
        InAppUpdate.startFlexibleUpdate().then((appUpdateResult) {
              if (appUpdateResult == AppUpdateResult.success) {
                //App Update successful
                InAppUpdate.completeFlexibleUpdate();
              }
          });
      }
  }
});

Upgrader 升级器

与第一个选项不同,这个选项为 iOS 和 Android 提供了一个解决方案。它依赖于从存储中收集数据,并根据来自应用程序本身的当前数据对其进行检查。这个包没有使用 API 来查询数据,而是使用 widget 在底层执行逻辑。

我们把包裹放好。

  1. 将包添加到 pubspec.yaml 文件:
dependencies:
  flutter:
    sdk: flutter
  upgrader: ^5.0.0
  1. Perform Pub get

  2. 在应用程序内部,在应用程序更新中执行逻辑处理时,添加以下导入:

import 'package:upgrader/upgrader.dart';

这里我们有实际的 widget ,我们可以使用它们中的两个:

  • UpgradeAlert
  • UpgradeCard

这两个选项之间的主要区别只是一个 UI 选项,所以选择一个最适合您的选项。要集成这个包,您需要用 UpgradeAlert 或 UpgradeCard 包装您的 body widget 。下面是一个例子:

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
      return MaterialApp(
        title: applicationName,
        home: UpgradeAlert(                  /// <------------------
          child: MainPage(
              key: Key("YOUR_KEY"),
              title: applicationName
          ),
        )
      );
    }
}

如果您的应用程序的新版本在商店中可用,您将看到以下内容:

alt

要测试这些内容,请确保添加

await Upgrader.clearSavedSettings()

在 main.dart 文件的 main 方法中。

测试包装

无论您选择使用哪个包,您都需要知道您的逻辑正常运行。但是,如果不发布应用程序的官方版本,怎么能做到这一点呢?您可以在 GooglePlayConsole 中使用内部测试选项。通过向内部测试人员发布应用程序的新版本,它将不会是公开版本,并允许您测试升级功能。

你需要做的是:

  1. 登录到您的 Google Play Console 帐户,进入您正在开发的应用程序,以获得更新逻辑

  2. 在“安装 → 内部应用程序共享”下,转到“管理测试人员”并确保允许测试人员下载和安装共享应用程序。你可以选择通过链接或电子邮件这样做

alt
  1. 然后,进入测试 → 内部测试,点击创建新的发布按钮(右上)
alt
  1. 一旦您执行了一个版本,您就可以返回到主内部测试页面并单击 Tester 选项卡。在那里您将看到一个包含测试人员电子邮件的列表(现在为空)。点击蓝色箭头图标。
alt
  1. 在此屏幕中,您可以添加自己作为内部测试人员(添加电子邮件地址)
alt
  1. 完成后,可以返回到“内部测试”窗口。向下滚动到底部,您将看到 How 测试人员加入您的测试,您将看到一个 Copy 链接按钮

  2. 你可以点击这个按钮,然后给自己发送链接,这样你就可以下载新版本的应用程序了。

如果您未能执行上述步骤之一,生成的链接将导致一个未找到(错误 404)页面:

alt

如果一切顺利,单击生成的链接时将看到以下内容:

alt

如果您看到这个错误:

安装错误(- 6) : 由于当前设备状态(例如,电池电量低,磁盘空间小,...) ,不允许下载/安装。( https://developer.android.com/reference/com/google/android/play/core/install/model/installerrorcode#error_install_not_allowed )

这可能意味着您正在模拟设备上运行您的应用程序,您需要在其上安装 Google Play Store 并登录。

写这篇文章的原因是,在将 in app update 包与我自己的应用程序集成时,我必须经历相同的过程。欢迎你到 Google Play Store 查看:

alt

源代码

https://github.com/ducafecat/BirthdayCalendar

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

祝你有一个美好的一天~


© 猫哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://video.ducafecat.tech

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/47749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础(八):循环深入讲解

文章目录 循环深入讲解 一、循环简介 1、循环的作用 2、循环的分类 二、while的语法 1、快速体验 三、while的应用 1、应用一&#xff1a;计算1-100累加和 2、应用二&#xff1a;计算1-100偶数累加和 四、break和continue 1、理解 五、while循环嵌套 1、应用场景 …

YOLO V3 详解

YOLO V3 论文链接&#xff1a;YOLOv3: An Incremental Improvement 主要改进 Anchor: 9个大小的anchor&#xff0c;每个尺度分配3个anchor。Backbone改为Darknet-53, 引入了残差模块。引入了FPN&#xff0c;可以进行多个尺度的训练&#xff0c;同时对于小目标的检测有了一定…

【微服务】RestClient操作文档

为了与索引库操作分离&#xff0c;我们再增加一个测试类&#xff0c;做两件事情&#xff1a; 初始化RestHighLevelClient我们的酒店数据在数据库&#xff0c;需要利用IHotelService去查询&#xff0c;所以注入这个接口 package cn.itcast.hotel;import cn.itcast.hotel.pojo.…

【车载开发系列】UDS诊断---电控单元复位 ($0x11)

【车载开发系列】UDS诊断—电控单元复位&#xff08;$0x11&#xff09; UDS诊断---电控单元复位&#xff08;$0x11&#xff09;【车载开发系列】UDS诊断---电控单元复位&#xff08;$0x11&#xff09;一.概念定义二.应用场景三.报文格式1&#xff09;请求2&#xff09;肯定响应…

js文字提示层案例分析

前言 &#x1f496;js文字提示层在项目中比较常见&#xff0c;今天初次学习记录一下 功能介绍 在一段文本中鼠标触及红色字体&#xff0c;下方显示一个文字提示信息&#xff0c;鼠标离开红色字体区域&#xff0c;文字提示层消失。 知识点 onmouseover&#xff1a;鼠标指针移…

平衡搜索树——B-树小记

文章目录B- 树系列定义插入规则代码B-树结点定义查找key在结点哪个子树插入分裂B- 树系列 定义 B-树是一棵多叉 平衡 搜索树(不是二叉树&#xff0c;B-树中每个结点中可以有多个key&#xff0c;也有多个孩子) B-树中每个结点在实现时人为规定一个key的上限(KEY_LIMIT 4) B-…

Mysql语法五:idea连接数据库和jdbc

目录 1.连接数据库 1.1.下载驱动包 1.2&#xff1a;连接数据库 2.jdbc编程 2.1&#xff1a;何为jdbc 2.2&#xff1a;jdbc的使用。 2.2.1&#xff1a;直接插入操作 2.2.2&#xff1a;利用&#xff1f;进行插入 2.2.3&#xff1a;修改操作 2.2.4&#xff1a;删除操作 …

算法基础:动态规划

目录 动态规划之禅 多种纬度解决Fibonacci 数列 什么是Fibonacci数列 朴素递归方案 朴素递归的问题 Fib自上而下、备忘录方案 Fib自下而上法 动态规划之禅 动态规划是算法基础部分中最有趣的一个了&#xff0c;我想了很多天&#xff0c;怎么用很短的一些话把动态规划像之…

onnx删除无用属性

这里写自定义目录标题在推理onnx模型时&#xff0c;报了一个错&#xff0c;如下&#xff1a;InvalidGraph: [ONNXRuntimeError] : 10 : INVALID_GRAPH : This is an invalid model. In Node, ("Conv_0", Conv, "", -1) : ("x": tensor(float),&q…

DPVS时间轮移植

DPDK自带的定时器采用跳表实现&#xff0c;时间复杂度是O(logn)&#xff0c;当有大量事件要定时触发时&#xff0c;比如会话session老化&#xff0c;效率并不高。因此DPVS采用了O(1)复杂度的时间轮。0. 概述 a. 添加定时器事件的核心是 static int __dpvs_timer_sched(struct…

为何 SPARK 在应用 GPU 后表现更出色

什么是 APACHE SPARK&#xff1f; 伴随数据的巨量增长&#xff0c;Apache Spark 已成为分布式横向扩展数据处理的热门框架之一&#xff0c;可以在本地和云端数以百万计的服务器上运行。 Apache Spark 是应用于大型数据处理的快速通用分析引擎&#xff0c;可在 YARN、Apache Mes…

程序员还在为变量取名苦恼,那是因为你不知道,这个变量命名神器

作为程序员&#xff0c;变量命名应该是我们编程的开端&#xff0c;也是我们每天都必须需要做的事情。变量命名规范的重要性&#xff0c;相信大家都知道非常重要&#xff0c;良好的代码风格&#xff0c;带来好处有&#xff1a; 1、具有良好的可读性&#xff1b; 2、维护代码时…

【独立篇】React UI组件库

文章目录1、React UI组件库1.1、material-ui&#xff08;国外&#xff09;1.2、ant-design&#xff08;国内蚂蚁金服-antd&#xff09;2、AntD的简单使用2.1、CODE2.2、Result1、React UI组件库 1.1、material-ui&#xff08;国外&#xff09; 官网: http://www.material-ui.…

硬件定义软件?还是,软件定义硬件?

文章目录**1 软件和硬件****1.1 软件和硬件的定义****1.2 “硬件定义软件”和“软件定义硬件”的定义****1.3 CPU&#xff0c;软件和硬件解耦****1.4 CPU的软硬件定义****2 硬件定义软件****2.1 系统从软件逐步到硬件****2.2 硬件架构决定了软件设计****2.2.1 ASIC的硬件定义**…

【车辆配送】基于模拟退火 (SA)求解车辆配送 (VPR) (Matlab代码实现)

目录 1 车辆配送问题 2 模拟退火法 3 实现结果 4 参考文献 5 Matlab代码实现 1 车辆配送问题 式(9)~( 12)中, 为配送车辆到达需求点i的时间;为需求点i到需求点j的运输成本;、分别为配送车辆提前到达需求点i的或者滞后到达需求点i的单位时间内的等待成本以及惩罚成本。该数…

基于vue项目的代码优化

前言 项目上线后其整体性能的优良是用户也是研发人员所关注的。项目优化非常重要&#xff0c;一丝一毫的提升都是对用户的负责。因此我们在开发中就应该注重细节&#xff0c;优化工作从日常开发做起。本篇文章就分享一些在日常开发中代码层面的优化手段。 开发常用优化手段 …

04-Docker-容器数据卷

目录 一、坑&#xff01;&#xff01;&#xff01;&#xff01; 二、什么是容器卷 三、容器卷的作用 四、容器卷案例 1、宿主vs容器之间映射添加容器卷 五、容器卷ro和rw规则 一、坑&#xff01;&#xff01;&#xff01;&#xff01; 容器卷记得加入 --privilegedtrue …

2022-11-30 Github Forking 工作流模式

Forking 工作流 fork 操作是在个人远程仓库新建一份目标远程仓库的副本&#xff0c;流程如下&#xff1a; 比如在 GitHub 上操作时&#xff0c;在项目的主页点击 fork 按钮&#xff08;页面右上角&#xff09;&#xff0c;即可拷贝该目标远程仓库。 假设开发者 A 拥有一个远程仓…

HTML网页设计制作大作业(游戏主题)---电竞

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游戏官网 | 游戏网站 | 电竞游戏 | 游戏介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 …

《MongoDB》Mongo Shell中的基本操作-文档查询

前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 来个关注吧&#xff0c;点个赞…