Flutter 应用程序更新

2023-11-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 多平台发布

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter 应用程序更新 的相关文章

  • 销毁Android应用程序

    我开发了一个运行良好的应用程序 我使用了一些静态变量并设置了应用程序级别变量 我的问题是 即使在每个活动上设置 finish 之后 应用程序仍显示在运行模式下 关闭应用程序后 当我在一段时间后启动应用程序时 它将设置最后的更改 我怎样才能销
  • 我所有的布局 xml 文件都变成了自动生成的文件

    昨天我的应用程序上的所有内容都运行完美 但今天当我打开 Android Studio 时 所有 xml 文件都已损坏 不确定这是否是正确的术语 每个人都是这样的 我今天遇到了同样的问题 下面是我所做的几个步骤 我取得了成功来解决这个问题 只
  • 方法调用 mActionBar=getActionBar() 给出错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用支持库android support v7 app actionbar因为我想要操作栏API 级别 8以上 但是下面的句子给了我
  • Android:是否有一种简单的方法可以为视图创建圆角,而不必每次都创建单独的可绘制对象?

    我在互联网上浏览了各种解决方案 这些解决方案使我们能够创建带有圆角的视图 其中大多数需要使用创建自定义视图 或者每次我们需要圆角视图时都需要在 xml 或九个补丁中创建可绘制对象 问题是 当我实现此类视图时 我需要为每个此类视图创建一个可绘
  • android widget 和 localservice 绑定

    我编写播放器 它的主要活动是运行本地服务 我找不到如何将本地服务绑定到小部件 当我尝试像在活动中一样绑定它时 它失败了 请帮助我 添加 1 何时可以联系后台服务 http www developer com ws data article
  • 在旧版本的 API 上更改 ContentObserver Onchange 上的 uri [重复]

    这个问题在这里已经有答案了 可能的重复 如何获取内容观察器中插入行的 URI https stackoverflow com questions 8432800 how to get uri of inserted row in my co
  • 按大小、日期、名称等在回收器视图中排序并记住选择

    我正在制作图库应用程序 我想为其添加排序功能 我可以使用以下命令在运行时对项目进行排序Comparator但问题是 每当我退出应用程序时 列表都会再次从数据库中出来 并且所有列表都未排序 我想在我的应用程序中提供按日期 大小 名称等排序的选
  • Android P Beta - AlarmManager 通知不起作用

    我正在 Android P beta 版本 4 上测试我的应用程序 我的应用程序目标SdkVersion是27 据观察 警报管理器通知未按预期工作 我使用下面的代码来设置通知 if android os Build VERSION SDK
  • Android BLE - 如何分块读取大特征值(使用偏移量)?

    我正在使用 Android SDKandroid 蓝牙 and android 蓝牙 le APIs 我想实现一个应用程序 发挥核心作用 并连接到 BLE 外设以读取特征值和描述符 应用程序需要读取的特征值较大 因此需要分块连续读取 我对如
  • 如何在phonegap上使用GCM处理android中的多个推送通知

    当推送通知到达时 如果用户无法查看该通知 他收到另一条通知 之前的通知正在更新为新的 但它不应该更新为最新的 我们需要单独显示每个通知 这可以使用 GCM 吗 我已经使用Phonegap来开发应用程序 PushPlugin 支持在有效负载中
  • Android 上的 Chrome 强制隐藏地址栏

    我最近开发了一个获取混合 http https 内容的网站 因此 我总是将地址栏显示在顶部 它不会像其他网站那样自动隐藏 这就是我要说的 This https planetkde org 是网站的链接 内容是从各种来源获取的 因此无法过滤非
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • 如何查看Android Asset资源?

    我想检查 assets 文件夹中是否存在文件 我怎样才能做到呢 请帮忙 我向我的应用程序类之一添加了一个辅助方法 我假设 应用程序运行时 资产列表不会更改 the List
  • 如何增加颤振中切屑的宽度

    我想增加宽度Chip 我怎样才能实现这个目标 Chip elevation 6 0 backgroundColor Colors white shape RoundedRectangleBorder borderRadius BorderR
  • Android:如何为我的应用程序播放的任何音乐文件创建淡入/淡出音效?

    我正在开发的应用程序播放音乐文件 如果计时器到期 我希望音乐淡出 我怎么做 我正在使用 MediaPlayer 播放音乐 音乐文件位于我的应用程序的原始文件夹中 这是我的 Android MediaPlayer 的整个处理程序类 查看 pl
  • 无法读取解析推送通知包数据

    我尝试使用 Parse 推送通知服务发送自定义数据 但从 Bundle 中提取时总是返回 null 值 自定义广播接收器 Override public void onReceive Context context Intent inten
  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提
  • 如何在android中获取当前一周的所有天数?

    我想在字符串数组中获取本周的所有日期 我怎样才能做到这一点 提前致谢 I think你想要这样的东西 假设你总是想要从星期一开始的几周 以及 MM dd yyyy 的日期格式 DateFormat format new SimpleDate
  • 从 Android 中的过渡动画中排除 BottomNavigation

    我一直在四处寻找 但找不到有助于解决这个特定问题的答案 我的应用程序有一个自定义滑入 滑出效果 如下所示 Intent intent new Intent getApplicationContext MyActivity class sta

随机推荐

  • cenos 6.4 安装memcached 服务端

    本文查考借鉴 yum 安装memcached 前提 阿里云 EDS 服务器 操作系统 CentOs 6 4 第一步 查询memcached 安装资源包信息 yun search memcached 该指令可以查询yum库中 所包含memca
  • Centos 安装Vsftpd

    1 安装VSFTP 1 root localhost yum y install vsftpd 2 配置vsftpd conf文件 root localhost vi etc vsftpd vsftpd conf 001 002 003 0
  • tkinter绘制组件(12)——表格

    tkinter绘制组件 12 表格 引言 构思 外观 绘制方法 布局 函数结构 绘制表头 绘制表格内容 获取高度和重绘 完整代码函数 效果 测试代码 最终效果 2021 12 12新样式 2022 1 2新样式 2022 7 3新功能 补充
  • 知识图谱实现步骤和用到的方法

    PDF 下载 https download csdn net download nrlovestudy 10938925 参考资料 1 知识图谱入门 一 知识图谱与语义技术概览 https blog csdn net pelhans art
  • 【CSS】background相关属性深入学习

    最近一次需求中对于background相关的一些属性使用较多 总结下 希望提高下次的开发效率 background属性 background color background image background position backgr
  • .NET面试题——第7篇 C#类和对象

    1 什么是类和对象以及关系 对象 一种具有状态 属性 和行为 方法 的编程实体 用于描述现实世界的某个具体事物 类 具用一系列对象共同特征和行为的通用类型 对象和类的关系 类是对象的抽象 而对象是类的具体实例 类是抽象的 不占用内存 而对象
  • go爬虫框架colly的精简讲解

    1 拉取软件包 go get github com gocolly colly 2 创建colly的收集器 colly NewCollector 可以在创建的时候进行配置 c colly NewCollector colly AllowUR
  • Java 断点调试 循环调试

    java断点调试 以eclipse为例 1 基础调试 这里都是一些基础 除了最后一个都十分常用 名称 快捷键 作用 Resume F8 运行至下一断点 Step Into F5 进入方法 Step Over F6 运行完当前语句 User
  • PCL 点云按高程渲染颜色

    目录 一 算法原理 二 代码实现 三 结果展示 四 CloudCompare 五 备注 一 算法原理 首先按照Z轴方向求取所在点云的高程极值 包括高程最大值与最小值 计算高程中值 然后选取渲染的红 绿 蓝三种颜色的值 最后 自上而下 为红绿
  • NBA的字母哥如何拿到2415万美金年薪

    前言 NBA是世界上最成功的体育联盟之一 为了制定合理的运作规范 联盟会与球员工会签署劳资协议 协议里规定了球队的工资帽 一支球队球员工资总额的上限 顶薪 球员薪水的上限 底薪 球员的最低薪水 和其他规范 2011年 经历了停摆事件 联盟和
  • 一张图理清ASP.NET Core启动流程

    1 引言 对于ASP NET Core应用程序来说 我们要记住非常重要的一点是 其本质上是一个独立的控制台应用 它并不是必需在IIS内部托管且并不需要IIS来启动运行 而这正是ASP NET Core跨平台的基石 ASP NET Core应
  • JS 数组定义及详解

    一 数组简介 1 什么是数组 数组是值的有序集合 每个值叫做元素 每个元素在数组中都有数字位置编号 也就是索引 JS中的数组是弱类型的 数组中可以含有不同类型的元素 数组元素甚至可以是对象或其他数组 例如 var arr 1 true nu
  • kubernetes运维---calico之ipip模式抓包分析

    一 calico介绍 Calico是Kubernetes生态系统中另一种流行的网络选择 虽然Flannel被公认为是最简单的选择 但Calico以其性能 灵活性而闻名 Calico的功能更为全面 不仅提供主机和pod之间的网络连接 还涉及网
  • 功能实现:Unity中一个动画,只播放中间指定的一截,而且循环播放

    一 要播放的动画 直播中间一截 如图 总的动画为长度为2分钟零8秒 二 Button和对应事件 三 事件的代码 在Start 里面绑定 private void Awake myAnim animGo GetComponent
  • Flutter实现app自动升级

    话不多说 有过开发过移动应用的人都应该自动升级流程 首先获取本地应用版本 然后从服务器获取线上移动应用版本号作比较是否升级 第一步获取版本信息 API https pub dev packages package info 获取应用版本号
  • iview on-change用法

    原地址 https segmentfault com q 1010000011589626 iview框架select选择框on change事件如何返回当前选中的值 这是文档中的解释 on change 选中的Option变化时触发 默认
  • C++类与封装实例说明

    众所周知 C 具有三大特性 分别为封装 继承 多态 今天有位同学问到我应该如何去理解 我翻了翻笔记本 找到以前上课时学到的案例来解释 首先 成员函数存在希望公开或不希望公开的属性 这也构成了定义成员函数访问级别的三项 1 public 公开
  • 架构师--IT策略灵魂的创造者

    http blog csdn net aspop archive 2006 01 21 585823 aspx 在比尔 盖茨的众多称谓中 据说他更偏爱 首席软件架构师 同样 在网易创始人丁磊名字前 也有 首席架构师 这样的称谓 对于企业来说
  • IDEA国际化资源Key无法全局重命名的解决方案

    一 前言 最近在开发中使用到了HibernateValidator进行入参校验以及错误消息的国际化支持 大家应该都知道在使用HibernateValidator进行校验的时候 我们只需在需要在校验的变量上添加相应的注解 同时在message
  • Flutter 应用程序更新

    Flutter 应用程序更新 原文 https medium com flutter community in app update the flutter way 2f25e4a02c02 前言 当您推出应用程序的新版本时 您希望您的用户