Flutter项目之app升级方案

题接上篇的文章的项目,还是那个空货管理app。本篇文章用于讲解基于Flutter的app项目的升级方案。

在我接触Flutter之前,做过一个比较失败的基于DCloud的HTML5+技术的app,做过几个RN项目。在这两种不同机制的app升级方案中,RN采用的是微软的CodePush技术。而那个比较失败的项目采用的是检查版本号,下载安装包的方法。而在这个Flutter项目中,我在写app更新方法时,查资料的时候查到一篇文章,文章大概意思讲解了一下Flutter实行CodePush的可能性。但是,我并未找到可能实现的方法。因此,采用了简单粗暴的进行app升级。

服务器的操作

为了检验版本号和下载app安装包,我们在服务器某文件夹下放置两个文件,第一个为version.json文件,内容为:

{
    "android": "1.0.1"
}

这个文件用于保存版本号,我们可以写一个读取方法来读取这个版本号:

Future<bool> checkNewVersion() async {
  try {
    final res = await http.get(downLoadUrl + ‘/version.json‘);
    if (res.statusCode == 200) {
      final Map<String, dynamic> body = json.decode(res.body);
      if (defaultTargetPlatform == TargetPlatform.android) {
        final packageInfo = await PackageInfo.fromPlatform();
        final newVersion = body[‘android‘];
        return (newVersion.compareTo(packageInfo.version) == 1);
      }
    }
  } catch (e) {
    return false;
  }
  return false;
}

第二个文件为app安装包,用来下载之后安装。

app端的操作

在app端需要增加的方法比较多,有需要处理app的权限和处理版本号读取以及app安装包下载和安装等方法。

权限的获取

targetSdkVersion < 24之前,我们可以通过在AndroidManifest.xml这个文件中写入获取读写权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

但是当Flutter更新到1.0.0版本之后,现阶段的targetSdkVersion为27。API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。因此,我们需要做一下额外的才做来获取权限。

我在stackoverflow上找到了一篇文章了解了一下这个问题的解决方案。这篇文章中赞最高的方法比较负责,因为时间比较短,暂时没有研究,不过项目组大佬说如果要完美地解决这个问题还是要会过来研究一下。

我在本次项目中采用了第二种方法,在MainActivity.java的onCreate方法中添加

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());

然后引入simple_permissions这个依赖查询app的权限和询问是否开启权限。具体方法为:

  //是否有权限
  Future<bool> checkPermission() async {
    bool res = await SimplePermissions.checkPermission(
        Permission.WriteExternalStorage);
    return res;
  }

  //打开权限
  Future<PermissionStatus> requestPermission() async {
    return SimplePermissions.requestPermission(Permission.WriteExternalStorage);
  }

版本号的获取

我们在服务器上放置了一个名为version.json的文件,我们可以获取一下这个文件的内容访问写在里面的版本号:

Future<bool> checkNewVersion() async {
  try {
    final res = await http.get(downLoadUrl + ‘/version.json‘);
    if (res.statusCode == 200) {
      final Map<String, dynamic> body = json.decode(res.body);
      if (defaultTargetPlatform == TargetPlatform.android) {
        // 获取此时版本
        final packageInfo = await PackageInfo.fromPlatform();
        final newVersion = body[‘android‘];
        // 此处比较版本
        return (newVersion.compareTo(packageInfo.version) == 1);
      }
    }
  } catch (e) {
    return false;
  }
  return false;
}

因为这个项目是基于安卓7.0的手持终端的项目,此处做了是否为安卓的查询处理。

安装包下载

在下载安装包这个功能中,我们安装了flutter_downloader这个依赖。先获取一下下载地址,在下载安装包:

// 获取安装地址
Future<String> get _apkLocalPath async {
  final directory = await getExternalStorageDirectory();
  return directory.path;
}
// 下载
Future<void> executeDownload() async {
  final path = await _apkLocalPath;
  //下载
  final taskId = await FlutterDownloader.enqueue(
      url: downLoadUrl + ‘/app-release.apk‘,
      savedDir: path,
      showNotification: true,
      openFileFromNotification: true);
  FlutterDownloader.registerCallback((id, status, progress) {
    // 当下载完成时,调用安装
    if (taskId == id && status == DownloadTaskStatus.complete) {
      _installApk();
    }
  });
}
// 安装
Future<Null> _installApk() async {
  // XXXXX为项目名
  const platform = const MethodChannel(XXXXX);
  try {
    final path = await _apkLocalPath;
    // 调用app地址
    await platform.invokeMethod(‘install‘, {‘path‘: path + ‘/app-release.apk‘});
  } on PlatformException catch (_) {}
}

安装完成。

总结

以上为Flutter项目的更新步骤。在以上步骤中比较坑人的部分时权限获取至一块中,如果不设置,则会无法成功下载安装包。相信在不久的将来,Flutter可能也会用上CodePush。

顺便说一下那个被我称为失败的项目,我去那个项目组的时候这个项目已经做了一半了。而让我十分震惊的是作为一个基于vue的项目,项目进行了一多半还没人使用状态管理,vuex引入了,但是没人用。嗯,强行carray,发现carry不动。只能尽力补救之后,眼睁睁地看着这个项目走向深渊。当时我还是个萌新,想进去学技术的,结果发现一群自称三年经验以上的人还需要我和另一个刚进公司的同事带。当时还是很绝望的,只能一边绝望一边带着他们加班。现在觉得项目组的水平和氛围真的重要!!!

原文地址:https://www.cnblogs.com/lunlunshiwo/p/10361298.html

时间: 2024-10-13 19:41:21

Flutter项目之app升级方案的相关文章

Flutter 项目 Your app isn&#39;t using AndroidX错误

在gradle.properties中添加如下代码即可 android.enableJetifier=true android.useAndroidX=true Flutter 项目 Your app isn't using AndroidX错误 原文地址:https://www.cnblogs.com/sea-stream/p/12242282.html

android 公司app升级UI总结

这个月忙忙碌碌已快接近尾声,主要是公司的app进行项目重构以及UI升级.所以略作总结. 1.出现编译内存不够 Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE [2016-03-02 17:00:11 - EGStarSplash] Please check logcat output for more details. [2016-03-02 17:00:11 - EGStarSplash] Launch failed on dev

iOS项目更新之升级Xcode7 & iOS9

前言      Apple 的WWDC所发布内容在给大家带来惊喜之际,给各位iOS开发的同仁却也带来了不同程度的麻烦.首先不讲新功能,就单指原来老版本的项目升级.代码升级,就是一堆问题,而且是不得不面临的问题.下面就跟着笔者一起来回顾下,此次在项目升级过程中,所遇到的各个问题点,以及解决方案,与各位已经做过和正在做iOS代码升级的同仁共勉,也给各位将要做Xcode 7和iOS9兼容的同仁以参考. 开发环境安装 原本运行得好好的项目,要升级Xcode7,首先就得安装Xcode7,具体的可以从开发者

Flutter 开发集合系列之优雅的 Flutter 组件化 混编方案大神必学

背景 此篇文章,主要针对想要在原有Native工程的基础上集成Flutter的需求,所提供的混编方案的探讨. 官方方案的优缺点 (1)优点: 不需要每次 Run 起来之后,先进行 同步flutter代码(组件化Flutter后,因为组件化后flutter代码已经变为framework,所以每次进来需要先热更新同步代码)不需要单独搞一个组件进行集成,管理组件的版本,发布等.(2)缺点: 会非常耦合工程,需要修改工程配置,添加 BUILD PHASE 调用 flutter 中 xcode_backe

[原创]Java项目统一UTC时间方案

Java项目统一UTC时间方案 作者:Gods_巨蚁 引言 近期团队的个别项目在进行框架升级后,部分时间值存在8小时误差,原因是错误的将数据库中的时间数据理解成了UTC时间(旧版本认为是北京时间) 考虑到未来项目对于时间理解的一致性,我决定将项目统一为使用UTC时间,经调研,形成本文 mysql数据库时区及时间时间类型说明 数据库时区 mysql数据库拥有时区设置,默认使用系统时区 可通过如下语句查询当前时区 show variables like '%time_zone%'; 下图为我个人机器

web app 自适应方案总结 关键字 弹性布局之rem

web app 自适应方案总结 关键字 弹性布局之rem 关于rem,主要参考文档 1.腾讯ISUX (http://isux.tencent.com/web-app-rem.html) 2.http://www.w3cplus.com/css3/define-font-size-with-css3-rem 现在移动端 web app 的自适应布局的方案有 5种. 零. Flexbox 使用css3 flexbox 进行布局,对于富媒体和复杂排版的支持非常强大,未普及兼容性非常差,几乎没有在任何

移动app测试方案及流程&测试点归纳

移动app测试方案及流程 1.首先是测试 资源确认及准备 (1)产品需求文档,产品原型图 ,接口说明文档及设计文档应该齐全 (2)测试设备及测试工具 的准备:IOS和android的不同年版本的真机,以及测试相关工具的准备 2.测试用例的设计及评审 (1)根据产品需求文档,产品原型图等文档,设计客户端的一般功能测试用例 (2)测试用例评审,修改与完善,评审过后着手进入正式测试阶段 3. UI测试 (1)确保手头的原型图与效果图为当前最新版本,符合产品经理及用户需求 (2)测试过程一切以效果图为准

打造android ORM框架opendroid(七)——数据库升级方案

在上一篇博客<打造android ORM框架opendroid(六)--级联查询>我们讲了OpenDroid最后一块功能查询的实现原理.今天我们将进行OpenDroid一个重头戏,也是本系列博客的最后一篇--数据库升级方案. 说道数据库升级,我可是很头疼的, 为什么呢? 因为以前的项目中,根本没有考虑数据库升级方案的问题,就直接drop table了,这样导致的结果就是"以前的数据都消失了".额... 凭空消失确实不是很少的一件事,如果数据不重要还行,重要数据呢? 说消失就

Cordova热更新和App升级 - 简书

原文:Cordova热更新和App升级 - 简书 公司的cordova项目前段时间增加了热更新功能,自己第一次做的时候在网上查找了很多资料,有的资料写的并不全面遇到了很多坑.因此总结一些在开发过程中遇到了问题和解决办法. cordova项目热更新分为两个部分,网页内容(web content)更新和Cordova插件(native side)更新.前者是网页内容,后者是 cordova 插件.web content 的运行是基于 native side.如:登录页面的微信登录,需要在项目中集成微