Flutter iOS

在 Windows 上写 Flutter,
用远程 Mac 打包 iOS

Flutter 让一套 Dart 代码同时跑在 Android 和 iOS 上,但 iOS 的编译、签名和上传只能在 macOS 上完成。这篇把流程拆成五步:在远程 Mac 上装好环境、同步代码、用模拟器调试、导出 IPA、上传 TestFlight 与提交审核。读完你可以在不买 Mac 的情况下把 Flutter App 发到 App Store。

三万主机 · 更新于

01 / WHY

为什么 Flutter 也绕不开 Mac

Flutter 在 iOS 上的产物是一个标准的 Xcode 工程(项目里的 ios/ 目录)。flutter build ios 和 flutter build ipa 实际上会调用 xcodebuild,CocoaPods 负责安装原生插件依赖,签名则用到钥匙串里的证书和描述文件。这些工具只在 macOS 上提供,所以 Windows 和 Linux 上的 Flutter 在 flutter doctor 里不会出现 iOS 工具链。

常见的分工是:Windows 上完成日常开发和 Android 调试,iOS 相关的构建、模拟器验证、签名和上传放到一台远程 Mac 上。这台 Mac 可以只是一台常开的构建机,通过 SSH 执行命令,需要看界面时用屏幕共享。

02 / SETUP

在远程 Mac 上配置 Flutter 与 Xcode

先通过屏幕共享登录,用 App Store 或 Apple Developer 网站安装 Xcode,再在终端完成首次启动和许可确认,并下载 iOS 模拟器运行时:

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license accept
xcodebuild -runFirstLaunch
xcodebuild -downloadPlatform iOS

Flutter SDK 按官方文档安装(下载压缩包或 git clone 稳定分支,再把 flutter/bin 加入 PATH),CocoaPods 可以用 Homebrew 安装。完成后运行 flutter doctor -v,Xcode 一项应显示为通过:

brew install cocoapods
flutter doctor -v
flutter precache --ios

建议 Mac 上的 Flutter 版本和 Windows 上保持一致,可以用 FVM 之类的版本管理工具在项目里锁定版本,避免两边生成的代码或锁文件不一致。

资料来源:Flutter 官方文档:在 macOS 上安装

03 / SYNC

同步代码与安装 iOS 依赖

最省事的方式是 Git:Windows 上提交推送,Mac 上拉取。不要直接拷贝整个目录,build/、ios/Pods/ 和 .dart_tool/ 都应该在 Mac 上重新生成。

git clone git@github.com:yourname/your_app.git
cd your_app
flutter pub get
cd ios && pod install && cd ..

如果 Windows 上从来没有生成过 ios/ 目录,可以在 Mac 上执行 flutter create --platforms=ios . 补齐。之后用 Xcode 打开 ios/Runner.xcworkspace(注意是 workspace,不是 xcodeproj),在 Signing & Capabilities 里选择你的开发团队并确认 Bundle Identifier。这些设置会写进工程文件,提交回仓库后两边就一致了。

提醒:Podfile.lock 建议提交到仓库。插件升级后若 pod install 报版本冲突,可以先执行 pod repo update 再重试。

04 / DEBUG

模拟器调试,真机交给 TestFlight

在屏幕共享里打开模拟器,然后在 SSH 或终端里运行:

open -a Simulator
flutter devices
flutter run -d "iPhone 16"

flutter run 启动后,终端里按 r 热重载、R 热重启,效果在屏幕共享窗口里查看。设备名以 flutter devices 输出为准。远程画面的流畅度取决于你到机房的网络,可以先用 延迟测试工具 看一下。

真机调试是这种模式的局限:iPhone 需要通过 USB 或同一局域网连到运行 Xcode 的 Mac,远程 Mac 连不上你桌上的手机。相机、蓝牙、推送等必须在真机上验证的功能,建议打 Release 包上传 TestFlight,用手机上的 TestFlight App 安装测试。

05 / RELEASE

导出 IPA、上传与提交审核

确认 pubspec.yaml 里的 version(例如 1.2.0+15,加号后是构建号,每次上传必须递增),然后构建:

flutter build ipa --release
# 产物:
# build/ios/archive/Runner.xcarchive
# build/ios/ipa/*.ipa

上传有几种方式:用 Xcode 打开 .xcarchive,在 Organizer 里选择 Distribute App;用 Apple 的 Transporter App 拖入 IPA;或者用 fastlane 的 upload_to_testflight 配合 App Store Connect API Key 在命令行完成。上传后在 App Store Connect 等待处理,添加测试员,处理完成即可在 TestFlight 安装。

测试通过后,在 App Store Connect 填写版本信息、截图、隐私信息,选择这次构建并提交审核。证书和描述文件的管理可以参考 fastlane match 管理证书,上架全流程见 没有 Mac 怎么上架 App Store,想让推送自动出包可以看 iOS 构建机配置。

资料来源:Flutter 官方文档:Build and release an iOS app

FAQ

常见问题

Windows 上能不能直接把 Flutter 项目编译成 iOS 包?

不能。iOS 构建依赖 Xcode 和 Apple 的签名工具链,而 Xcode 只能运行在 macOS 上。Windows 和 Linux 上的 Flutter 可以开发和调试 Android、Web、桌面目标,iOS 这一步必须交给一台 Mac 完成,可以是自己的、公司的、云端或远程租用的。

手机在国内,远程 Mac 在海外,还能真机调试吗?

真机调试需要 iPhone 通过 USB 或同一局域网连接到运行 Xcode 的 Mac,跨洋的远程 Mac 无法直接连上你手边的手机。实际做法是:日常调试用远程 Mac 上的模拟器,真机验证通过 TestFlight 安装测试版。

每次改一点代码都要推送到 Mac 上重新构建吗?

不需要。大部分 Dart 逻辑和界面可以在 Windows 上用 Android 模拟器或桌面目标先调好,只有 iOS 专属的插件、权限、推送和界面差异才需要到 Mac 上验证。用 Git 同步,在 Mac 上 pull 之后再跑 iOS 构建即可。

微信
微信客服二维码扫码加微信客服手机上长按二维码识别
Telegram 客服