我们平时开发原生应用时有新版本发布都会有版本升级提示,然后引导客户去下载更新版本,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、 使用到的三方库
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 这个文件插件中是不存在的,所以需要我们自己创建,具体创建步骤如下
上图为文件路径,创建一个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>
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年进入阿里一直到现在。深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!