如何实现Flutter应用在Google Play与App Store的程序化更新?双插件部署求助
分步实现Flutter跨平台应用程序化更新(iOS: Upgrader + Android: In App Update)
我之前成功用这两个插件搭过跨平台的自动更新流程,给你分享一下详细的分步方案,帮你避开我踩过的坑:
前提准备
- 确保你的Flutter项目已经完成iOS和Android的开发者配置,并且应用已经在App Store Connect(iOS)和Google Play Console(Android)上架(至少是测试版本,比如TestFlight或Google Play内部测试轨道)
- 在项目的
pubspec.yaml中添加两个插件的依赖,建议用兼容的稳定版本:
dependencies: flutter: sdk: flutter upgrader: ^11.0.0 # iOS更新插件 in_app_update: ^4.0.0 # Android更新插件
然后执行flutter pub get安装依赖。
iOS端(基于Upgrader插件)
1. 配置Info.plist
在iOS项目的Info.plist中添加必要的配置:
- 确保
CFBundleShortVersionString(应用版本号)和CFBundleVersion(构建号)与你上传到App Store的版本一致 - 添加
ITSAppUsesNonExemptEncryption并设置为NO(如果你的应用没有使用加密功能,否则需要额外配置) - 确保应用有网络权限(默认应该已经配置,若没有则添加
NSAppTransportSecurity相关键,允许HTTP/HTTPS请求)
2. 初始化Upgrader并触发更新检查
你可以选择在首页初始化Upgrader,或者封装成工具类统一调用:
import 'package:upgrader/upgrader.dart'; class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { late Upgrader _upgrader; @override void initState() { super.initState(); // 配置Upgrader参数 _upgrader = Upgrader( minAppVersion: '1.1.0', // 可选:指定最低允许使用的版本,低于此版本强制更新 shouldPopScope: () => false, // 强制更新时阻止用户返回上一页 debugLogging: true, // 开启调试日志,方便排查问题 // 如果不用默认的App Store检查,也可以自定义appcast XML链接 // appCastURL: 'https://your-domain.com/appcast.xml', ); // 主动检查更新 _upgrader.checkVersion(); } @override Widget build(BuildContext context) { // 用UpgradeAlert包裹页面内容,自动显示更新弹窗 return UpgradeAlert( upgrader: _upgrader, child: Scaffold( appBar: AppBar(title: Text('首页')), body: Center(child: Text('应用内容')), ), ); } }
3. 测试iOS更新
- 上传新版本到TestFlight或App Store Connect的测试轨道
- 用测试设备安装旧版本应用,打开后应该会触发更新提示
- 若想本地模拟更新,可以开启测试模式:
Upgrader.testing = true;,然后自定义测试版本信息。
Android端(基于In App Update插件)
1. 配置AndroidManifest.xml
- 确保
android/app/build.gradle中的versionCode和versionName正确,且新版本的versionCode必须高于旧版本(Google Play依据versionCode判断更新) - 确保应用有
INTERNET权限(默认已包含,若没有则在AndroidManifest.xml中添加:<uses-permission android:name="android.permission.INTERNET" />)
2. 初始化In App Update并触发更新检查
同样可以封装成工具类,或者在首页初始化:
import 'package:in_app_update/in_app_update.dart'; class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { @override void initState() { super.initState(); _checkAndroidUpdate(); } Future<void> _checkAndroidUpdate() async { try { // 检查是否有可用更新 final updateInfo = await InAppUpdate.checkForUpdate(); if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) { // 选择更新类型:立即更新(强制)或灵活更新(后台下载) // 立即更新:用户必须更新才能继续使用 await InAppUpdate.performImmediateUpdate(); // 灵活更新:允许用户继续使用应用,后台下载更新 // await InAppUpdate.startFlexibleUpdate(); } } catch (e) { print('Android更新检查失败: $e'); // 这里可以添加错误处理,比如提示用户手动去Google Play更新 } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('首页')), body: Center(child: Text('应用内容')), ); } }
3. 测试Android更新
注意:In App Update无法在本地模拟器或真机调试中测试,必须通过Google Play的测试轨道!
- 上传新版本到Google Play Console的内部测试或封闭测试轨道
- 添加测试账号到测试列表,用该账号在设备上安装旧版本应用
- 打开应用后,应该会触发Google Play的原生更新弹窗
跨平台整合(统一调用逻辑)
为了让代码更整洁,可以封装一个跨平台的更新管理类,自动区分iOS和Android:
import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:upgrader/upgrader.dart'; import 'package:in_app_update/in_app_update.dart'; class UpdateManager { // 统一检查更新方法 static Future<void> checkForUpdates() async { if (kIsWeb) return; // 忽略Web平台 if (Platform.isIOS) { final upgrader = Upgrader( minAppVersion: '1.1.0', shouldPopScope: () => false, debugLogging: true, ); await upgrader.checkVersion(); } else if (Platform.isAndroid) { try { final updateInfo = await InAppUpdate.checkForUpdate(); if (updateInfo.updateAvailability == UpdateAvailability.updateAvailable) { await InAppUpdate.performImmediateUpdate(); } } catch (e) { print('Android更新失败: $e'); // 可选:提示用户手动前往Google Play更新 } } } }
然后在main.dart或者首页的initState中调用:
@override void initState() { super.initState(); UpdateManager.checkForUpdates(); }
常见问题排查
iOS端Upgrader不显示更新提示
- 确认App Store/TestFlight上的新版本已经发布(需要等待审核通过,TestFlight一般需要10-15分钟)
- 检查设备网络是否正常,Upgrader需要请求App Store的API获取版本信息
- 开启
debugLogging: true查看控制台日志,排查是否有API请求失败的情况 - 确保当前应用的版本号低于App Store上的版本
Android端In App Update无反应
- 必须上传新版本到Google Play测试轨道,且测试账号已添加到测试列表
- 确保新版本的
versionCode高于当前安装的版本 - 不要在模拟器上测试,建议用真实设备
- 检查控制台日志,看是否有权限或网络相关的错误
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

