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

pub package

这是一个实现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

1 回复

更多关于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'),
        ),
      ),
    );
  }
}
回到顶部