You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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的测试轨道!

  1. 上传新版本到Google Play Console的内部测试或封闭测试轨道
  2. 添加测试账号到测试列表,用该账号在设备上安装旧版本应用
  3. 打开应用后,应该会触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:53:12