Flutter版本管理插件flutter_prince_of_versions的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter版本管理插件flutter_prince_of_versions的使用

flutter_prince_of_versions 是一个用于检查应用更新的Flutter插件。它支持从远程资源获取更新信息,并且可以针对iOS和Android平台分别进行配置。

目录

使用

获取所有远程数据

你可以通过调用 checkForUpdates 方法来检查是否有新的应用版本可用。该方法允许你自定义更新流程,例如在有新次要版本时强制更新应用。

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Future<void> checkForUpdates() async {
    final url = "https://your-update-config-url.com"; // 替换为你的URL
    try {
      final data = await FlutterPrinceOfVersions.checkForUpdates(
        url: url,
        shouldPinCertificates: false,
        requirementChecks: {
          'region': (String region) {
            return region == 'hr'; // 示例条件:仅当地区为'hr'时返回true
          },
          'bluetooth': (String bluetoothVersion) {
            return bluetoothVersion == '5.0'; // 示例条件:仅当蓝牙版本为'5.0'时返回true
          }
        },
      );
      print('Update status: ${data.status}');
      print('Installed version: ${data.updateInfo.installedVersion}');
      print('Last version: ${data.updateInfo.lastVersionAvailable}');
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Flutter Prince of Versions Demo")),
        body: Center(
          child: ElevatedButton(
            onPressed: checkForUpdates,
            child: Text("Check for Updates"),
          ),
        ),
      ),
    );
  }
}

自动检查App Store更新

如果你不想手动管理JSON配置文件,可以使用 checkForUpdatesFromAppStore 方法。该方法会自动获取应用的Bundle ID并从App Store中获取版本信息。

Future<void> checkForUpdatesFromAppStore() async {
  final updateData = await FlutterPrinceOfVersions.checkForUpdatesFromAppStore();
  print('Update status: ${updateData.status}');
  print('Current version: ${updateData.version}');
}

自动检查Google Play更新

对于Google Play上的应用,可以使用 checkForUpdatesFromGooglePlay 方法来检查更新。该方法会触发回调函数,以便在更新状态发生变化时通知用户。

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

class MyCallback extends Callback {
  MyCallback(BuildContext context) {
    _context = context;
  }
  BuildContext _context;

  @override
  void error(String localizedMessage) {
    showDialog<bool>(
      context: _context,
      builder: (BuildContext context) {
        return CupertinoAlertDialog(
          title: Text('An error occurred'),
          content: Text('$localizedMessage'),
          actions: <Widget>[
            CupertinoDialogAction(
              child: Text('Ok'),
              isDestructiveAction: false,
              onPressed: () => Navigator.pop(context, true),
            ),
          ],
        );
      },
    );
  }
}

Future<void> checkForUpdatesFromGooglePlay() async {
  final callback = MyCallback(context);
  await FlutterPrinceOfVersions.checkForUpdatesFromGooglePlay(
      "Google Play URL", callback);
}

JSON文件格式化

为了正确地配置更新检查,你需要提供一个符合特定格式的JSON文件。以下是iOS和Android的示例:

iOS示例

{
   "ios": {
      "minimum_version": "1.2.3",
      "minimum_version_min_sdk": "8.0.0",
      "latest_version": {
         "version": "2.4.5",
         "notification_type": "ALWAYS",
         "min_sdk": "12.1.2"
      }
   },
   "ios2": [
      {
         "required_version": "1.2.3",
         "last_version_available": "1.9.0",
         "notify_last_version_frequency": "ALWAYS",
         "requirements": {
            "required_os_version": "8.0.0",
            "region": "hr",
            "bluetooth": "5.0"
         },
         "meta": {
            "key1": "value1",
            "key2": 2
         }
      }
   ]
}

Android示例

{
  "android": [{
    "required_version": 10,
    "last_version_available": 12,
    "notify_last_version_frequency": "ONCE",
    "requirements": {
      "required_os_version": 18
    },
    "meta": {
      "key1": "value3"
    }
  }]
}

R8/ProGuard

如果你正在使用R8或ProGuard,请确保添加以下选项以避免混淆相关类:

-keep class com.infinum.princeofversions.** { *; }

更多关于Flutter版本管理插件flutter_prince_of_versions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter版本管理插件flutter_prince_of_versions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_prince_of_versions插件来进行版本管理的示例代码。flutter_prince_of_versions插件允许你检查应用的当前版本,并与远程服务器上的最新版本进行比较,从而决定是否需要提示用户更新。

步骤 1: 添加依赖

首先,你需要在pubspec.yaml文件中添加flutter_prince_of_versions的依赖:

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

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

步骤 2: 配置PrinceOfVersions

你需要在应用的入口文件(通常是main.dart)中配置PrinceOfVersions。首先,你需要定义一个配置文件URL,这个URL应该指向一个包含应用版本信息的JSON文件。

示例配置文件(JSON格式)

假设你的配置文件URL是https://example.com/app/versions.json,内容如下:

{
  "latest_version": "2.1.0",
  "mandatory_update_version": "2.0.0",
  "android": {
    "url": "https://example.com/app/releases/myapp-v2.1.0.apk"
  },
  "ios": {
    "url": "https://example.com/app/releases/myapp-v2.1.0.ipa"
  }
}

配置PrinceOfVersions

在你的main.dart文件中:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 配置 PrinceOfVersions
    final config = PrinceConfig(
      updateConfigFileUrl: Uri.parse('https://example.com/app/versions.json'),
      mandatoryUpdateConfiguration: MandatoryUpdateConfiguration(
        currentVersion: '1.0.0', // 替换为你的当前版本号
        mandatoryVersion: '2.0.0' // 替换为你的强制更新版本号
      ),
      storeUpdateConfiguration: StoreUpdateConfiguration(
        android: AndroidStoreUpdateConfiguration(
          appId: 'com.example.myapp', // 替换为你的Android应用ID
        ),
        ios: IosStoreUpdateConfiguration(
          appId: '123456789', // 替换为你的iOS应用ID
        ),
      ),
    );

    // 使用 PrinceOfVersions
    return PrinceOfVersions(
      config: config,
      builder: (context, prince) {
        // 根据 PrinceOfVersions 的状态构建应用
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: Scaffold(
            appBar: AppBar(
              title: Text('Flutter Demo Home Page'),
            ),
            body: Center(
              child: Text('Hello, Flutter!'),
            ),
          ),
          // 在这里处理更新逻辑
          onGenerateRoute: (settings) {
            // 检查是否需要显示更新对话框
            if (prince.state == PrinceState.mandatoryUpdateNeeded) {
              // 显示强制更新对话框
              showDialog(
                context: context,
                builder: (BuildContext context) {
                  return AlertDialog(
                    title: Text('强制更新'),
                    content: Text('请更新应用到最新版本以继续使用。'),
                    actions: <Widget>[
                      TextButton(
                        onPressed: () {
                          // 打开下载页面或应用商店页面
                          if (kIsAndroid) {
                            prince.openAndroidDownloadPage();
                          } else if (kIsIOS) {
                            prince.openIosAppStorePage();
                          }
                        },
                        child: Text('去更新'),
                      ),
                    ],
                  );
                },
              );
              return null; // 阻止其他路由的生成
            } else if (prince.state == PrinceState.optionalUpdateAvailable) {
              // 显示可选更新提示
              // 你可以在这里添加自定义的更新提示逻辑
            }
            // 处理其他路由
            return null; // 或者返回你的路由处理器
          },
        );
      },
    );
  }
}

注意事项

  1. 权限:确保你的应用有访问网络的权限,特别是Android需要在AndroidManifest.xml中添加INTERNET权限。
  2. 版本控制:确保你的versions.json文件中的版本号是正确的,并且与你的应用当前的版本号和强制更新版本号匹配。
  3. 测试:在发布前,确保在多个设备和平台上测试版本更新逻辑。

这个示例展示了如何使用flutter_prince_of_versions插件来管理Flutter应用的版本更新。根据你的具体需求,你可能需要调整配置和更新逻辑。

回到顶部