Flutter OTA更新插件ota_update_fork的使用
Flutter OTA更新插件ota_update_fork的使用
Fork项目
Fork该项目:https://github.com/4Q-s-r-o/ota_update
解决错误:
AAPT: error: resource android:attr/lStar not found
这是一个实现OTA更新的Flutter插件。在Android上,它会下载文件(并报告进度)并触发应用程序安装意图。在iOS上,它会在指定的ip地址打开Safari。(目前尚未实现)
迁移到5.0.0+
此版本移除了对Flutter Android嵌入v1的支持。这应该不会影响任何人。如果还在使用旧的嵌入,请考虑升级到v2。
迁移到4.0.0+
此版本解决了许多使用Android下载管理器并将文件保存到外部下载文件夹时出现的问题。
重要变化:
- 文件不再使用DownloadManager下载。
- 因为不使用下载管理器,所以没有默认的系统通知来报告进度。但是,由于更新事件发布到了Flutter代码中,如果需要,你可以自行实现通知。
文件现在保存在内部目录中,消除了使用SAF的需求,并防止了多个应用使用此包时可能覆盖APK的情况。
升级版本号后,你需要将android/src/main/res/xml/filepaths.xml
文件的内容替换为以下内容:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="internal_apk_storage" path="ota_update/"/>
</paths>
使用方法
要使用此插件,需要在pubspec.yaml
文件中添加依赖项:
dependencies:
ota_update_fork: ^最新版本号
示例
以下是使用该插件的基本示例:
// 导入包
import 'package:ota_update_fork/ota_update_fork.dart';
// 执行OTA更新
// 开始监听下载进度报告事件
try {
// 链接包含来自Flutter SDK示例的Flutter HelloWorld的APK
OtaUpdate()
.execute(
'https://internal1.4q.sk/flutter_hello_world.apk',
// 可选参数
destinationFilename: 'flutter_hello_world.apk',
// 只在Android中可用 - 能验证文件校验和:
sha256checksum: "d6da28451a1e15cf7a75f2c3f151befad3b80ad0bb232ab15c20897e54f21478",
).listen(
(OtaEvent event) {
setState(() => currentEvent = event);
},
);
} catch (e) {
print('Failed to make OTA update. Details: $e');
}
Android配置
在AndroidManifest.xml
中添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
在AndroidManifest.xml
内的<application>
节点中添加以下provider引用:
<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](/user/xml)/filepaths" />
</provider>
创建文件android/src/main/res/xml/filepaths.xml
,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="internal_apk_storage" path="ota_update/"/>
</paths>
对于非HTTPS流量,由于Android下载管理器默认禁用了明文流量以增强安全性,你可以创建一个名为res/xml/network_security_config.xml
的文件:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在AndroidManifest.xml
中的<application>
标签内引用它:
android:networkSecurityConfig="[@xml](/user/xml)/network_security_config"
更多关于Flutter OTA更新插件ota_update_fork的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter OTA更新插件ota_update_fork的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
ota_update_fork
是一个 Flutter 插件,用于实现应用程序的 OTA(Over-The-Air)更新功能。这个插件是 ota_update
插件的一个分支,提供了一些额外的功能和改进。通过这个插件,你可以在不经过应用商店的情况下,直接从服务器下载并安装应用程序的更新。
以下是使用 ota_update_fork
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 ota_update_fork
插件的依赖:
dependencies:
flutter:
sdk: flutter
ota_update_fork: ^1.2.0 # 请根据最新版本号进行更新
然后运行 flutter pub get
来获取依赖。
2. 配置权限
为了下载和安装 APK 文件,你需要在 AndroidManifest.xml
文件中添加以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
3. 使用插件
在你的 Dart 代码中,你可以使用 ota_update_fork
插件来检查更新并下载安装 APK 文件。
import 'package:flutter/material.dart';
import 'package:ota_update_fork/ota_update_fork.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
Future<void> checkForUpdate() async {
try {
OtaUpdate()
.execute(
'https://your-server.com/path/to/your/app.apk',
destinationFilename: 'app_update.apk',
)
.listen(
(OtaEvent event) {
switch (event.status) {
case OtaStatus.DOWNLOADING:
print('Downloading... ${event.value}%');
break;
case OtaStatus.INSTALLING:
print('Installing...');
break;
case OtaStatus.ALREADY_RUNNING_ERROR:
print('Update is already running...');
break;
case OtaStatus.PERMISSION_NOT_GRANTED_ERROR:
print('Permission not granted...');
break;
case OtaStatus.INTERNAL_ERROR:
print('Internal error...');
break;
case OtaStatus.DOWNLOAD_ERROR:
print('Download error...');
break;
case OtaStatus.CHECKSUM_ERROR:
print('Checksum error...');
break;
case OtaStatus.INSTALL_ERROR:
print('Install error...');
break;
case OtaStatus.COMPLETE:
print('Update complete!');
break;
}
},
);
} catch (e) {
print('Failed to make OTA update. Details: $e');
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('OTA Update Example'),
),
body: Center(
child: ElevatedButton(
onPressed: checkForUpdate,
child: Text('Check for Update'),
),
),
);
}
}