草庐IT

Flutter 应用程序更新

会煮咖啡的猫咪 2023-04-03 原文

Flutter 应用程序更新

原文 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
          ),
        )
      );
    }
}

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

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

await Upgrader.clearSavedSettings()

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

测试包装

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

你需要做的是:

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

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

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

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

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

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

如果您看到这个错误:

安装错误(- 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 查看:

源代码

https://github.com/ducafecat/BirthdayCalendar

结束语

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

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

祝你有一个美好的一天~


© 猫哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://video.ducafecat.tech

本文由 mdnice 多平台发布

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

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  4. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  10. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

随机推荐