Flutter如何实现app_update下载文件

在Flutter中如何实现app_update功能并下载文件?目前需要让用户检测到新版本时自动下载安装包,但不知道该如何处理文件下载和进度显示。希望能提供一个完整的实现方案,包括版本检测、下载文件、显示进度条以及安装apk的步骤。最好能兼容Android和iOS平台。

2 回复

Flutter中可通过package_info_plus获取版本号,再使用httpdio下载APK文件。下载后使用open_file打开文件进行安装。注意Android需申请存储权限并配置FileProvider。

更多关于Flutter如何实现app_update下载文件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现应用更新文件下载,可以通过以下步骤完成:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  flutter_downloader: ^1.10.2
  permission_handler: ^10.0.0  # 用于权限处理
  path_provider: ^2.0.0       # 获取存储路径

2. 配置权限

Android (android/app/src/main/AndroidManifest.xml):

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

iOS (ios/Runner/Info.plist):

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

3. 核心下载代码

import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:path_provider/path_provider.dart';

class AppUpdate {
  static Future<void> downloadUpdate(String url) async {
    // 检查存储权限
    if (await Permission.storage.request().isGranted) {
      final directory = await getExternalStorageDirectory();
      final taskId = await FlutterDownloader.enqueue(
        url: url,
        savedDir: directory!.path,
        fileName: 'app_update.apk',
        showNotification: true,
        openFileFromNotification: true,
      );
    }
  }
  
  // 监听下载进度
  static void setDownloadCallback() {
    FlutterDownloader.registerCallback(downloadCallback);
  }

  static void downloadCallback(String id, DownloadTaskStatus status, int progress) {
    print('下载进度: $progress%');
    if (status == DownloadTaskStatus.complete) {
      print('下载完成');
    }
  }
}

4. 初始化与使用

main() 中初始化:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await FlutterDownloader.initialize();
  AppUpdate.setDownloadCallback();
  runApp(MyApp());
}

触发下载:

ElevatedButton(
  onPressed: () => AppUpdate.downloadUpdate('https://example.com/update.apk'),
  child: Text('下载更新'),
)

关键说明:

  • Android:下载APK后需要手动安装
  • iOS:只能通过App Store更新,此方法仅适用于企业证书应用
  • 建议添加版本检查逻辑,通过API获取最新版本号
  • 可结合package_info_plus获取当前版本信息

这种方式适用于Android应用内更新,iOS需遵循官方审核指南。

回到顶部