题接上篇的文章的项目,还是那个空货管理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不动。只能尽力补救之后,眼睁睁地看着这个项目走向深渊。当时我还是个萌新,想进去学技术的,结果发现一群自称三年经验以上的人还需要我和另一个刚进公司的同事带。当时还是很绝望的,只能一边绝望一边带着他们加班。现在觉得项目组的水平和氛围真的重要!!!

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

  1. 强大的Flutter App升级功能

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 应用程序升级功能是App的基础功能之一,如果没有此功能会造 ...

  2. iOS项目更新之升级Xcode7 & iOS9

    金田 前言      Apple 的WWDC所发布内容在给大家带来惊喜之际,给各位iOS开发的同仁却也带来了不同程度的麻烦.首先不讲新功能,就单指原来老版本的项目升级.代码升级,就是一堆问题,而且是不 ...

  3. Blog.Core 项目已完成升级.NET5.0

    (是时候拿出来这种图了) 本文首发于公众号,但是会有新的内容加进来,所以就在博客园新开了一篇,望见谅.截止发稿,Blog.Core项目Master分支已经迁移到了5.0,新建了3.1的分支. 开心的锣 ...

  4. Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题

    Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题 原文地址:https://m.oschina.net/question/737237_2203576 现在容器用的是tomcat,做维 ...

  5. 使用VS Code新建编译Flutter项目

    本文的前提是你已经安装好了VS Code,并且安装了Flutter和Dart扩展插件. 1. 新建Flutter项目 查看——命令面板,或者Ctrl + Shift + P 输入 Flutter: N ...

  6. 两个星期,用Flutter撸个APP

    前言 Flutter是Google推出的跨平台的解决方案,Slogan是"Design beautiful apps",国内也有知名企业在使用和推广,例如阿里.美团都有在尝试. 个 ...

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

    Java项目统一UTC时间方案 作者:Gods_巨蚁 引言 近期团队的个别项目在进行框架升级后,部分时间值存在8小时误差,原因是错误的将数据库中的时间数据理解成了UTC时间(旧版本认为是北京时间) 考 ...

  8. Cordova热更新和App升级 - 简书

    原文:Cordova热更新和App升级 - 简书 公司的cordova项目前段时间增加了热更新功能,自己第一次做的时候在网上查找了很多资料,有的资料写的并不全面遇到了很多坑.因此总结一些在开发过程中遇 ...

  9. 学习笔记:flutter项目搭建(mac版)

    什么是flutter Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越来越多的 ...

随机推荐

  1. 利用Asp.Net Core的MiddleWare思想处理复杂业务流程

    最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构,在这里把我的设计思路分享出来,希望对大家处理复杂的流程业务能有所帮助. 背景 一个流程初始化接口,接口中根据传入的 ...

  2. 强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)

    在强化学习(十七) 基于模型的强化学习与Dyna算法框架中,我们讨论基于模型的强化学习方法的基本思路,以及集合基于模型与不基于模型的强化学习框架Dyna.本文我们讨论另一种非常流行的集合基于模型与不基 ...

  3. Redis缓存穿透、缓存雪崩和缓存击穿理解

    1.缓存穿透(不存在的商品访问数据造成压力) 缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并 ...

  4. C#-Xamarin的Android项目开发(一)——创建项目

    创建项目 使用Xamarin开发安卓项目,首先需要安装VS2017以上版本.因为VS2017以上的版本,可以直接创建Xamarin项目. 另外用Xamarin开发安卓项目,还需要使用Intel的CPU ...

  5. Java并发编程面试题 Top 50 整理版

    本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然 ...

  6. python从学渣到学沫的半月天

    今天又要引进一个新的知识点了,就是模块,可以直接引用的一个东西,从实用性来说很强大,不过还是需要记住模块的类型啊,如何应用还是需要学习和了解的.其中模块是分三种的,一种内置模块python内部提供的功 ...

  7. 【RL-TCPnet网络教程】第38章 TFTP简单文件传输基础知识

    第38章      TFTP简单文件传输基础知识 本章节为大家讲解TFTP(Trivial File Transfer Protocol,简单文件传输协议)的基础知识,方便后面章节的实战操作. (本章 ...

  8. 2. VIM 系列 - 初探vim配置文件

    目录 配置文件 .vimrc 基本配置 tab 键设置 热键配置 配置文件 刚安装vim默认配置,功能是很简单的,vim的功能很多是需要配置开启的. .vimrc 使用vim打开配置文件~/.vimr ...

  9. javascript 实现数据结构 - 栈

    栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.栈就好像是一个底部密封的盒子,我们往里面 ...

  10. Docker Machine搭建并加入节点

    对于集群服务器来讲,要在每台机器上手动安装Docker是一件及其痛苦的事情,还好有Docker Machine这一工具,Docker三剑客中的一角. 一.Docker Machine介绍 这个工具已经 ...