flutter自动更新
3. 如果本地版本和服务器版本不一致则提示升级,弹窗更新提示框;4. 用户确定升级,调用文件传输方法下载apk文件;5. 监听下载进度,当下载完成打开apk进行安装;2. 请求接口获取服务器版本号和更新包地址;1. 获取本地apk版本号;
·
一. 应用程序升级流程
本文仅介绍Android App的升级流程:
1. 获取本地apk版本号;
2. 请求接口获取服务器版本号和更新包地址;
3. 如果本地版本和服务器版本不一致则提示升级,弹窗更新提示框;
4. 用户确定升级,调用文件传输方法下载apk文件;
5. 监听下载进度,当下载完成打开apk进行安装;
二.获取本地版本信息
1、安装包
2、引用包
// 引入获取版本信息包
import 'package:package_info/package_info.dart';
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String appName = packageInfo.appName;
String version = packageInfo.version;
String packageName = packageInfo.packageName;
// 应用名称
print("appName:${appName}");
// 版本号
print("version:${version}");
// 包名称
print("packageName:${packageName}");
三.获取应用安装目录
1、安装包
2、引用包
// 引入获取文件存储路径的包
import 'package:path_provider/path_provider.dart';
Directory appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;
// 获取应用的安装目录
print("appDocDir:${appDocPath}");
四.下载更新apk文件
1、安装包
2、引用包
// 引入下载文件的包
import 'package:ota_update/ota_update.dart';
String fileName = "下载包名称.apk";//包名称必须保持一致
String url = "http://xxxx/下载包名称.apk";//线上更新包地址
String _progress = '0';
OtaUpdate()
.execute(url, destinationFilename: fileName)
.listen(
(OtaEvent event) async{
switch (event.status) {
case OtaStatus.DOWNLOADING: // 下载中
_progress = event.value!;
print('下载进度:${event.value!}%');
break;
case OtaStatus.INSTALLING: //安装中
_progress = '100';
break;
case OtaStatus.PERMISSION_NOT_GRANTED_ERROR: // 权限错误
print('由于缺少权限,无法继续!');
break;
default: // 其他问题
break;
}
},
);
五.配置信息
1、android/app/src/main/AndroidManifest.xml
<!-- 访问网络 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 用于写入缓存数据到扩展存储卡 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!--application中添加-->
<provider
android:name="sk.fourq.otaupdate.OtaUpdateFileProvider"
android:authorities="${applicationId}.ota_update_provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
<!--application里添加 android:requestLegacyExternalStorage="true" -->
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="项目名称"
android:requestLegacyExternalStorage="true"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true">
2、android/app/src/main/res/xml/filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path name="camera_photos" path="" />
<external-path name="files_root" path="Android/data/下载包名称/" />
<external-path name="external_storage_root" path="." />
</paths>
</resources>
3、android/build.gradle
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
project.evaluationDependsOn(':app')
project.configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'com.android.support'
&& !details.requested.name.contains('multidex') ) {
details.useVersion "27.1.1"
}
}
}
}
4、android/app/src/build.gradle
android {
lintOptions {
checkReleaseBuilds false
abortOnError false
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)