Flutter应用版本管理插件app_versioning的使用
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
初始化
-
初始化
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', ), );
-
-
跟踪当前版本:在应用启动时调用
track()
方法来记录当前版本。await appVersioning.tracker.track();
-
检查是否有新版本可用:
final appUpdateInfo = await appVersioning.getAppUpdateInfo();
-
提示用户更新:如果检测到有新版本可用,根据更新类型(可选或强制)显示不同的UI提示。
if (appUpdateInfo.isUpdateAvailable) { switch (appUpdateInfo.updateType) { case AppUpdateType.Optional: _showUpdatePopup(forceUpdate: false); break; case AppUpdateType.Mandatory: _showUpdatePopup(forceUpdate: true); break; } }
-
启动更新流程:如果用户同意更新或更新是强制的,调用
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
更多关于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应用的版本信息。你可以根据需要进一步自定义和扩展这个示例。