添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我们平时开发原生应用时有新版本发布都会有版本升级提示,然后引导客户去下载更新版本,iOS一般的做法是跳转到AppStore更新,Android的处理办法要么是商店更新,要么是应用内直接下载安装更新,因为第一次用Flutter开发应用,所以碰到了这个更新的问题,网上也没有找到写的特别详细简洁的处理办法,最后经过一番努力做好了版本升级,感觉做的还可以,所以这里做次记录,希望能帮到有需要的人。
本文iOS是跳转到AppStore更新,Android是应用内下载,下载完毕后跳转安装

二、效果图

三、升级逻辑

  • 请求版本升级接口
    接口返回数据应该有下面这些,在拿到接口数据的版本号后和本地版本号对比,如果接口版本号大于本地版本号则提示升级
1-版本号
// 或者将本地版本号传给后台,后台进行对比返回是否升级
version_code: 1.0.0,  
2-下载地址
ios_download_url: itms-apps://itunes.apple.com/cn/app/id1480944644?mt=8, 
android_download_url: http://xxx.com/xxx-release.apk,
3-升级文案
content: 1.性能优化 2.问题修复, 

四、具体升级方案

####1、 使用到的三方库

  • PackageInfo:获取版本号
  • ota_update:支持Android应用内下载,实现应用内更新功能
  • url_launcher:网页打开工具,适用于iOS版本更新,可以打开应用地址,跳转AppStore更新
2、主要代码
import 'package:flutter/material.dart';
import 'package:package_info/package_info.dart';
import 'dart:io';
import 'package:url_launcher/url_launcher.dart';
import 'package:ota_update/ota_update.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      home: MyHomePage(title: 'Flutter Demo Home Page'),
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
class _MyHomePageState extends State<MyHomePage> {
  String vInfo = '';
  String progress = '';
  @override
  void initState() {
    super.initState();
    _initData();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('版本升级'),
      body: Container(
        alignment: Alignment.center,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
                color: Colors.black38,
                onPressed: _updateVersion,
                child: Text('版本升级')
            Container(
              child: Text('$vInfo'),
            Container(
              child: Text('$progress'),
  void _initData() async {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    String version = packageInfo.version;
    setState(() {
      vInfo = Platform.isIOS ? 'iOS_$version' : 'android_$version';
  void _updateVersion() async{
    if (Platform.isIOS){
      String url = 'itms-apps://itunes.apple.com/cn/app/id414478124?mt=8'; // 这是微信的地址,到时候换成自己的应用的地址
      if (await canLaunch(url)){
        await launch(url);
      }else {
        throw 'Could not launch $url';
    }else if (Platform.isAndroid){
     String url = 'http://3g.163.com/links/4636'; // 网易新闻下载地址,地址可能失效,在测试时候可以先确认下下载地址是否是有效的
      try {
        // destinationFilename 是对下载的apk进行重命名
        OtaUpdate().execute(url, destinationFilename: 'news.apk').listen(
              (OtaEvent event) {
            print('status:${event.status},value:${event.value}');
            switch(event.status){
              case OtaStatus.DOWNLOADING: // 下载中
                setState(() {
                  progress = '下载进度:${event.value}%';
                break;
              case OtaStatus.INSTALLING: //安装中
                break;
              case OtaStatus.PERMISSION_NOT_GRANTED_ERROR: // 权限错误
                print('更新失败,请稍后再试');
                break;
              default: // 其他问题
                break;
      } catch (e) {
        print('更新失败,请稍后再试');

五、注意事项

  • 1、 ota_update 这个插件需要在AndroidManifest.xml中增加以下引用,具体的可以参考这个插件用法,但是 资源 xml/filepaths 这个文件插件中是不存在的,所以需要我们自己创建,具体创建步骤如下
    image.png

上图为文件路径,创建一个xml文件夹,然后创建一个filepaths.xml文件,文件内容为

<paths>
    <external-path
        name="external-path"
        path="."/>
    <external-cache-path
        name="external-cache-path"
        path="."/>
    <external-files-path
        name="external-files-path"
        path="."/>
    <files-path
        name="files_path"
        path="."/>
    <cache-path
        name="cache-path"
        path="."/>
    <root-path
        name="name"
        path="."/>
</paths>

2020.7.8更新

ota_upage 插件已经更新,现在要传destinationFilename: 'news.apk'apk的命名,但是很遗憾的是以前老的使用这个方法的应用无法自动更新了,只能重新下载,作者并没有做好兼容,这个很遗憾

最后附上Demo地址,如有什么不足和错误请指正,觉得受用反手就给颗🌟吧

iOS 和Android 更新是完全不一样的。 iOS 只能跳转到 AppStore,比较好实现 Android则需要下载apk包,由于Android机型较多,这里我们用 dart 连接第三方(这里)的原生 android 下载库。 更新界面和下载更新分开处理的。 iOS 没得下载进度这一说,Android 则有。 2. 代码 2.1 iOS 直接采用url_launcher就可以了 if (Platform.isIOS) { final url = https://itunes.apple.com/cn/app/id1380512641; // id 后面的数字换成自己 原文 https://medium.com/flutter-community/in-app-update-the-flutter-way-2f25e4a02c02 当您推出应用程序的新版本时,您希望您的用户了解它。无论是因为您修复了一个关键的 bug,添加了一个新特性,还是仅仅因为应用程序运行得更平滑或更快。作为应用程序开发人员,我们希望所有用户都使用应用程序的最新版本。 但是我们如何确保用户知道我们的应用程序的新版本呢? 这个问题的答案很简单: 为什么不在我 向00001101-d102-11e1-9b23-00025b00a5a5写入指令 0x000A400112 表示订阅升级通知。提交完成蓝牙会自动断开 ,间隔1S后重连 重新测试通知 再次发送升级请求跟文件md5。Gaia 的UUID是00001107-D102-11E1-9B23-00025B00A5A5;SPP 的UUID是00001101-0000-1000-8000-00805F9B34FB;首先订阅升级通知通道 00001102-d102-11e1-9b23-00025b00a5a5。 由于在 IOS 中没法直接下载安装,如果版本不一致则直接跳转到IOS应用对应的应用市场就可以了,所以本文仅介绍Android App的升级流程。​ Android App升级流程: 1. 获取本地版本号; 2. 请求服务器获取服务器版本号; 3. 如果本地版本和服务器版本不一致则提示升级,弹窗提示用户是否更新; 4. 用户确定升级,调用文件传输方法下载apk文件; 5. 监听下载进度; 6. 下载完成打开apk进行安装。 simple_update 最简单的APP更新方式(下载并触发安装),支持所有平台。 默认情况下,会从avenge.cn下载最新版本APP,这是一个简单的APP版本管理系统,欢迎试用_ 你也可以设置自己的服务器来发布APP版本。 https://avenge.cn/register 创建应用版本 https://avenge.cn/home/resources/apps/new https://avenge.cn/home/reso 3. 如果本地版本和服务器版本不一致则提示升级,弹窗更新提示框;4. 用户确定升级,调用文件传输方法下载apk文件;5. 监听下载进度,当下载完成打开apk进行安装;2. 请求接口获取服务器版本号和更新包地址;1. 获取本地apk版本号; 使用dio工具库的下载,也可以采用下载插件flutter_downloader,这个插件支持Android、IOS下载 我这里使用的是dio下载 ,使用install_plugin 安装apk ,ios则跳转到 app stor /// 下载apk Future<File> _downloadApk(String datasource) async { /// 创建文件 Directory stora... 如果有新版本更新,我们需要下载并安装更新包。在 Android 系统中,可以使用 Intent.ACTION_VIEW 意图来启动系统自带的安装器来安装 APK 文件。我们需要在服务器端维护一个版本信息文件,用来记录最新版本版本号和下载地址等信息。我们可以使用 package_info 插件来获取当前应用版本信息。我们可以使用 http 插件来获取版本信息文件中的内容。1. 获取当前应用版本信息,比如版本号(versionCode)和版本名(versionName)。 前段时间我发布了一个只针对Android的版本更新框架flutter_xupdate,发布以来收到了大家许多的建议.当时我也只是为了自己方便才写的这么一个插件,并没有考虑很多. 建议有很多,大致可以分为如下几类: 能否支持ios版本更新? 能否支持自定义api? 能否支持自定义版本更新弹窗? 能否开发apk安装能力? 看到最后,居然还有人问:能不能给我提供检查版本、弹窗显示、apk下载、apk安装的能力,这样我就可以自己写更新逻辑了… 看来真的是不同的人对版本更新是有不同的需求,我想了一下,与 在 Flutter 代码产物替换中,因为替换的 4 个文件皆为直接加载到内存中的引擎代码,所以这部分优化空间有限。但在资源的热更新中,资源是从Assets取得,所以这里应该有更优的方案。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!