Flutter应用版本管理插件app_versioning的使用

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

Flutter应用版本管理插件app_versioning的使用

概述

app_versioning 是一个用于管理和提示用户更新Flutter应用程序的插件。它支持Android和iOS平台,并且可以通过自定义的方式建议或强制用户更新应用。该插件基于 in_app_update(Android) 和 upgrader(iOS) 实现,并利用 version_tracker 插件来跟踪应用版本的历史记录。

功能

  • 从Google Play Store或Apple App Store获取可用更新信息。
  • 通过配置最小版本号,强制用户更新应用(可以使用自定义后端或Firebase Remote Config)。
  • 在Android上使用原生的In-App Updates流程,支持灵活和即时更新。
  • 在iOS上通过重定向用户到App Store请求更新。
  • 跟踪版本更新历史和启动次数,以便触发引导流程、数据库迁移等操作。

开始使用

安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  app_versioning: latest
初始化
  1. 初始化 AppVersioning:根据你的需求选择使用API或Firebase Remote Config来获取版本信息。

    • 使用API服务:

      final appVersioning = AppVersioning.apiService(
        apiConfig: ApiConfig(
          endpoints: ApiVersioningEndpoints(
            "https://api.example.org",
            minimumVersioningEndpoint: "api/api-compatibility",
          ),
        ),
        updateConfig: UpdateConfig(
          appStoreAppId: "1234567890",
          playStoreAppId: "org.example.versioning",
          appstoreCountryCode: "US",
        ),
      );
      
    • 使用Firebase Remote Config:

      final appVersioning = AppVersioning.firebaseService(
        remoteConfigKeys: const RemoteConfigKeys(
          minimumIosVersionKey: "minimumIosVersion",
          minimumAndroidVersionKey: "minimumAndroidVersion",
        ),
        updateConfig: const UpdateConfig(
          appStoreAppId: "1234567890",
          playStoreAppId: "org.example.versioning",
          appstoreCountryCode: 'US',
        ),
      );
      
  2. 跟踪当前版本:在应用启动时调用 track() 方法来记录当前版本。

    await appVersioning.tracker.track();
    
  3. 检查是否有新版本可用

    final appUpdateInfo = await appVersioning.getAppUpdateInfo();
    
  4. 提示用户更新:如果检测到有新版本可用,根据更新类型(可选或强制)显示不同的UI提示。

    if (appUpdateInfo.isUpdateAvailable) {
      switch (appUpdateInfo.updateType) {
        case AppUpdateType.Optional:
          _showUpdatePopup(forceUpdate: false);
          break;
        case AppUpdateType.Mandatory:
          _showUpdatePopup(forceUpdate: true);
          break;
      }
    }
    
  5. 启动更新流程:如果用户同意更新或更新是强制的,调用 launchUpdate() 方法启动更新。

    appVersioning.launchUpdate(updateInBackground: true);
    

示例代码

以下是一个完整的示例项目,展示了如何使用 app_versioning 插件来管理应用版本并提示用户更新。

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

import 'service_provider.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final appVersioning = ServiceProvider.appVersioning;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Home(
        appVersioning: appVersioning,
      ),
    );
  }
}

class Home extends StatefulWidget {
  final AppVersioning appVersioning;

  const Home({required this.appVersioning});

  [@override](/user/override)
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  AppUpdateInfo? appUpdateInfo;
  bool isLoading = false;
  int _currentIndex = 0;

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

  void _startVersioningServices() async {
    setState(() {
      isLoading = true;
    });

    await Future.wait([
      _getAppVersioning(),
      _trackVersions(),
    ]);

    setState(() {
      isLoading = false;
    });
  }

  Future<void> _getAppVersioning() async {
    // 获取API版本信息(仅用于显示在屏幕上)
    final appUpdateInfo = await widget.appVersioning.getAppUpdateInfo();
    setState(() {
      this.appUpdateInfo = appUpdateInfo;
    });

    // 检查是否有更新可用
    if (appUpdateInfo.isUpdateAvailable) {
      switch (appUpdateInfo.updateType) {
        case AppUpdateType.Optional:
          _showUpdatePopup(forceUpdate: false);
          break;
        case AppUpdateType.Mandatory:
          _showUpdatePopup(forceUpdate: true);
          break;
      }
    }
  }

  Future<void> _trackVersions() async {
    await widget.appVersioning.tracker.track();
  }

  void _showUpdatePopup({required bool forceUpdate}) {
    showDialog(
      context: context,
      barrierDismissible: false,
      builder: (context) => Container(
        child: Column(
          children: [
            Text(forceUpdate ? "更新必需!" : "可选更新"),
            TextButton(
              onPressed: () {
                widget.appVersioning.launchUpdate(updateInBackground: !forceUpdate);
              },
              child: Text("确定"),
            )
          ],
        ),
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('应用版本管理示例')),
      body: IndexedStack(
        index: _currentIndex,
        children: [
          Stack(
            children: [
              Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text(
                      '当前版本信息',
                      style: Theme.of(context).textTheme.titleLarge,
                    ),
                    Text(
                      '当前版本: ${appUpdateInfo?.currentVersion}',
                    ),
                    Text(
                      '最小版本: ${appUpdateInfo?.minimumVersion}',
                    ),
                    Text(
                      '是否有更新: ${appUpdateInfo?.isUpdateAvailable}',
                    ),
                    Text(
                      '更新类型: ${appUpdateInfo?.updateType}',
                    ),
                  ],
                ),
              ),
              if (isLoading)
                Center(
                  child: CircularProgressIndicator(),
                ),
            ],
          ),
          Stack(
            children: [
              Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text(
                      '版本跟踪状态',
                      style: Theme.of(context).textTheme.titleLarge,
                    ),
                    Text(
                      '是否首次启动: ${widget.appVersioning.tracker.isFirstLaunchEver}',
                    ),
                    Text(
                      '是否首次启动当前版本: ${widget.appVersioning.tracker.isFirstLaunchForCurrentVersion}',
                    ),
                    Text(
                      '是否首次启动当前构建: ${widget.appVersioning.tracker.isFirstLaunchForCurrentBuild}',
                    ),
                    Text(
                      '版本历史: ${widget.appVersioning.tracker.versionHistory}',
                    ),
                  ],
                ),
              ),
              if (isLoading)
                Center(
                  child: CircularProgressIndicator(),
                ),
            ],
          )
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: (index) => setState(() {
          _currentIndex = index;
        }),
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.analytics),
            label: "应用版本管理",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.history),
            label: "版本跟踪",
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _startVersioningServices,
        tooltip: '刷新',
        child: Icon(Icons.refresh),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用app_versioning插件来进行版本管理的示例代码。app_versioning插件允许你访问应用的版本信息,如版本号、构建号等。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  app_versioning: ^2.0.0  # 请确保使用最新版本号

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

2. 使用app_versioning插件

接下来,你可以在你的Dart代码中使用这个插件来获取应用的版本信息。以下是一个简单的示例:

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

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

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

class VersionInfoScreen extends StatefulWidget {
  @override
  _VersionInfoScreenState createState() => _VersionInfoScreenState();
}

class _VersionInfoScreenState extends State<VersionInfoScreen> {
  String? appVersion;
  String? packageName;
  String? buildNumber;

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

  Future<void> _getAppVersionInfo() async {
    final AppVersioning _appVersioning = AppVersioning();
    String? version = await _appVersioning.getVersionName;
    String? packageName = await _appVersioning.getPackageName;
    String? buildNumber = await _appVersioning.getBuildNumber;

    setState(() {
      appVersion = version;
      this.packageName = packageName;
      this.buildNumber = buildNumber;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('App Version Info'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'App Version:',
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 8),
            Text(appVersion ?? 'Loading...'),
            SizedBox(height: 16),
            Text(
              'Package Name:',
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 8),
            Text(packageName ?? 'Loading...'),
            SizedBox(height: 16),
            Text(
              'Build Number:',
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 8),
            Text(buildNumber ?? 'Loading...'),
          ],
        ),
      ),
    );
  }
}

3. 运行应用

确保你已经正确配置了Flutter开发环境,然后运行应用:

flutter run

这个示例应用会在启动时异步获取应用的版本信息,并在UI上显示版本号、包名和构建号。如果获取成功,这些信息会显示在屏幕上;如果还在加载中,则会显示“Loading…”。

这个示例展示了如何使用app_versioning插件来获取和显示Flutter应用的版本信息。你可以根据需要进一步自定义和扩展这个示例。

回到顶部