Flutter自动更新插件auto_update的使用

Flutter自动更新插件auto_update的使用

该插件用于Flutter应用程序,处理应用商店外的原生应用更新。

功能

功能 Android iOS macOS Linux Windows
下载与更新
GitHub发布版本检查

使用方法

导入包

import 'package:auto_update/auto_update.dart';

检查GitHub上的新版本

Map<dynamic, dynamic> results = await AutoUpdate.fetchGithubApk("github_user", "package_name");
if (results != null) {
    if (results['assetUrl'] == "up-to-date") {
        /* 应用程序已是最新版本 */
    } else if (results['assetUrl'].isEmpty()) {
        /* 用户或包未找到 */
    } else {
        /* 发现更新URL */
    }
}

下载并更新

在Android上,如果需要权限,包会请求用户授权。如果所需的权限已授予,需要再次调用函数以下载并更新到新版本。

await AutoUpdate.downloadAndUpdate("https://release_raw_url");

完整示例

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:auto_update/auto_update.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Map<dynamic, dynamic> _packageUpdateUrl = {};

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    Map<dynamic, dynamic> updateUrl;
    // 平台消息可能会失败,所以我们使用try/catch来捕获PlatformException。
    // 我们还处理消息可能返回null的情况。
    try {
      updateUrl = await AutoUpdate.fetchGithub("user", "packageName");
    } on PlatformException {
      updateUrl = {'assetUrl': 'Failed to get the url of the new release.'};
    }

    // 如果小部件在异步平台消息仍在飞行时从树中移除,则我们希望丢弃回复而不是调用setState来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _packageUpdateUrl = updateUrl;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Auto Update Example'),
        ),
        body: Center(
          child: Column(
            children: [
              Text('Update url: ${_packageUpdateUrl['assetUrl']}\n'),
              IconButton(
                  onPressed: () async {
                    if (_packageUpdateUrl['assetUrl'].isNotEmpty &&
                        _packageUpdateUrl['assetUrl'] != "up-to-date" &&
                        (_packageUpdateUrl['assetUrl'] as String).contains("https://")) {
                      try {
                        await AutoUpdate.downloadAndUpdate(_packageUpdateUrl['assetUrl']);
                      } on PlatformException {
                        setState(() {
                          _packageUpdateUrl['assetUrl'] = "Unable to download";
                        });
                      }
                    }
                  },
                  icon: const Icon(Icons.download_for_offline_outlined))
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter自动更新插件auto_update的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自动更新插件auto_update的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用auto_update插件来实现自动更新的代码示例。请注意,实际使用中可能需要根据具体的平台(Android和iOS)进行一些配置和权限设置。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加auto_update插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  auto_update: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置权限

对于Android,你需要在AndroidManifest.xml中添加必要的权限(如网络权限):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

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

    <!-- 其他配置 -->

</manifest>

对于iOS,你可能需要在Info.plist中添加网络权限,这通常通过Xcode的图形界面配置。

3. 使用auto_update插件

在你的Flutter代码中,你可以按照以下方式使用auto_update插件:

import 'package:flutter/material.dart';
import 'package:auto_update/auto_update.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String updateStatus = "Checking for updates...";

  @override
  void initState() {
    super.initState();
    _checkForUpdates();
  }

  Future<void> _checkForUpdates() async {
    try {
      // 假设你有一个API返回最新版本信息
      String latestVersion = "2.0.0";  // 这里应该是从服务器获取的最新版本号
      String currentVersion = "1.0.0";  // 当前应用的版本号,可以通过package_info插件获取

      if (compareVersions(currentVersion, latestVersion) < 0) {
        bool isUpdateAvailable = await AutoUpdate.checkUpdate(
          iosAppId: 'your_ios_app_id',  // iOS应用ID
          androidPackageName: 'com.example.yourapp',  // Android包名
          forceUpdate: false,  // 是否强制更新
          updateDescription: "This is a new update with cool features!",
        );

        if (isUpdateAvailable) {
          setState(() {
            updateStatus = "Update available! Starting download...";
          });

          // 下载并安装更新
          await AutoUpdate.downloadAndUpdate();

          setState(() {
            updateStatus = "Update downloaded and installed!";
          });
        } else {
          setState(() {
            updateStatus = "No update available.";
          });
        }
      } else {
        setState(() {
          updateStatus = "You are already on the latest version!";
        });
      }
    } catch (e) {
      setState(() {
        updateStatus = "Error checking for updates: $e";
      });
    }
  }

  // 比较版本号的辅助函数
  int compareVersions(String v1, String v2) {
    def v1Parts = v1.split("\\.".toRegex()).map { it.toInteger() }
    def v2Parts = v2.split("\\.".toRegex()).map { it.toInteger() }
    for (int i = 0; i < Math.max(v1Parts.size(), v2Parts.size()); i++) {
      int part1 = i < v1Parts.size() ? v1Parts[i] : 0
      int part2 = i < v2Parts.size() ? v2Parts[i] : 0
      if (part1 < part2) return -1
      if (part1 > part2) return 1
    }
    return 0
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Auto Update Demo"),
      ),
      body: Center(
        child: Text(updateStatus),
      ),
    );
  }
}

注意

  1. 上述代码中的compareVersions函数是一个Dart版本的版本号比较函数,你可能需要将其转换为适合你的项目语言(例如Kotlin或Swift)的部分逻辑,或者继续使用Dart并在合适的地方调用。
  2. latestVersioncurrentVersion在实际应用中应从服务器和本地获取。对于本地版本号,可以使用package_info插件。
  3. AutoUpdate.checkUpdate的参数需要根据实际情况填写,尤其是iOS和Android的相关参数。
  4. AutoUpdate.downloadAndUpdate方法在不同平台上的行为可能有所不同,请根据官方文档进行进一步配置。

4. 获取当前应用的版本号

你可以使用package_info插件来获取当前应用的版本号:

dependencies:
  package_info: ^x.y.z  # 请替换为最新版本号

然后在代码中:

import 'package:package_info/package_info.dart';

Future<String> getCurrentVersion() async {
  PackageInfo packageInfo = await PackageInfo.fromPlatform();
  return packageInfo.version;
}

你可以在_checkForUpdates方法中调用getCurrentVersion来获取当前应用的版本号。

希望这能帮助你实现Flutter应用的自动更新功能!

回到顶部