Flutter 使用Cursor开发 Android / iOS 本地调试、真机调试、命令行打包、TestFlight、应用市场上架完整操作文档
文档说明:
- 开发编辑器:Cursor AI编辑器,不使用Android Studio做开发编辑
- 编译打包全部使用命令行,Cursor仅作为代码编辑器,调用本机系统终端执行flutter命令
- Android两种打包模式:①无证书不上架release测试包;②有JKS正式证书,应用市场上架包
- iOS:Mac环境,Xcode开启Automatically manage signing自动获取证书密钥;新增iOS模拟器本地调试完整流程(含自定义环境变量+指定模拟器ID标准命令);包含模拟器、真机调试、TestFlight、AppStore Connect、审核上架、推送配置
- Android包名、iOS BundleId 关键概念完整说明
目录
- 前置环境准备
- Cursor编辑器配置
- Android包名与iOS BundleId完整概念说明
- 双端版本号独立维护(发版必改)
- 本地开发调试(Android真机 / iOS模拟器 / iOS真机)
- Android 命令行两种打包全流程
- iOS Mac端打包、TestFlight、App Store上架全流程
- 双端推送配置区分与说明
- 全流程高频命令汇总
- .gitignore 证书安全配置
- 常见报错故障排查清单
前置环境准备
Windows(仅可做Android开发编译,无法编译iOS)
- Flutter SDK,配置系统环境变量,终端可执行
flutter --version - Android SDK,配置环境变量
ANDROID_HOME,需要 cmdline‑tools、build‑tools、platforms - JDK17(Flutter3.x推荐版本)
- Cursor编辑器,安装Flutter、Dart插件
- 安卓手机USB驱动
Mac(Android + iOS双端完整编译打包,支持iOS模拟器)
- Flutter SDK,zsh环境变量配置,任意终端可执行flutter命令
- Android SDK,配置
ANDROID_HOME - JDK17
- Xcode(App Store下载,首次打开完成组件、iOS模拟器运行时安装)
- cocoapods:
sudo gem install cocoapods - Cursor编辑器,Flutter&Dart插件
- Apple开发者账号(99美元/年,仅iOS真机、TestFlight、App Store上架需要;iOS模拟器调试免费Apple ID即可)
环境校验(Cursor终端执行)
flutter doctor -v- 红色错误必须全部修复;黄色警告视情况处理。
- Android只需要SDK命令行工具,不需要安装Android Studio软件本体。
项目初始化(拉代码/切分支必执行)
# 拉取项目依赖
flutter pub get
# Mac环境iOS初始化pod
cd ios
pod install --repo-update
cd ..Cursor编辑器配置
Cursor仅负责编写代码,编译、调试、打包全部调用本机终端,Cursor本身不做编译引擎。
- Cursor插件市场安装
Flutter、Dart - 设置
Settings → Flutter → Flutter SDK path,填入本地Flutter SDK根目录 - 使用Cursor打开项目根目录(pubspec.yaml所在文件夹)
- 打开内置终端:
View → Terminal,所有flutter命令在此终端执行
Android包名与iOS BundleId完整概念说明
1. Android 包名(applicationId)是什么
Android包名是安卓系统识别APP的唯一身份标识,上架后永久不可修改,修改等于全新应用,无法覆盖升级。
生效核心配置:
android/app/build.gradle中applicationIdgroovyandroid { defaultConfig { applicationId "com.company.myflutterapp" // 最终生效安卓包名 } }补充:
AndroidManifest.xml的package仅为源码路径,新版Flutter自动同步,最终包名以applicationId为准。
修改Android包名(推荐命令行一键修改)
flutter pub run change_app_package_name:main com.company.myflutterapp2. iOS BundleId(Bundle Identifier)是什么
苹果生态唯一应用标识,绑定签名证书、APNs推送、App Store Connect,上架后不可修改。
- 可视化配置位置:Xcode打开
ios/Runner.xcworkspace→ Runner Target → Signing & Capabilities → Bundle Identifier - 文件底层:
ios/Runner.xcodeproj/project.pbxproj内PRODUCT_BUNDLE_IDENTIFIER - App Store Connect后台新建App必须填写完全一致字符串
开启Automatically manage signing自动管理签名后,填入BundleId会自动向苹果服务器注册AppID、下载调试/发布全套证书。
补充:iOS模拟器调试不校验证书、无需付费开发者账号,BundleId仅做标识即可。
修改iOS BundleId推荐方式
打开ios/Runner.xcworkspace在Xcode可视化界面修改,保存后关闭Xcode,后续命令行打包自动读取配置;不建议直接修改pbxproj文件,极易破坏工程格式。
3. 统一规范(强制最佳实践)
- Android
applicationId= iOS BundleId,字符串完全相同,示例:com.abc.shop - 命名规则:反向域名、全小写,格式
com.企业.项目名,禁止大写、中文、空格、特殊符号 - 推送、第三方登录、支付、统计SDK全部统一使用该套ID
双端版本号独立维护(发版必改)
强制约定(rosun_transaction_app):Android 与 iOS 版本号互不共用。
不要再只改pubspec.yaml就以为双端都升了版——该文件只影响 Android;iOS 必须单独改。
| 平台 | 版本名(用户可见) | Build 号(商店递增用) | 当前示例 |
|---|---|---|---|
| Android | versionName | versionCode(整数,每次上架必须 +1) | 2.3.5 / 135 |
| iOS | MARKETING_VERSION(Xcode 里叫 Version) | CURRENT_PROJECT_VERSION(Xcode 里叫 Build) | 1.2.5 / 26 |
1. 修改 Android 版本号
改哪里: 项目根目录 pubspec.yaml 的 version 字段。
# 格式:版本名+Build号
# 例:2.3.5 是 versionName,135 是 versionCode
version: 2.3.5+135生效链路: android/app/build.gradle.kts 会读取 pubspec.yaml,自动写入 versionName / versionCode。
发版步骤:
- 把
2.3.5+135改成新版本,例如2.3.6+136(版本名按业务递增,Build 号必须比上次上架大) - 执行打包命令(见下文 Android 打包章节)
- 不要指望这一步会改 iOS 版本
2. 修改 iOS 版本号
iOS 不读 pubspec.yaml。Info.plist 已改为引用 Xcode 工程字段:
CFBundleShortVersionString→$(MARKETING_VERSION)(版本名)CFBundleVersion→$(CURRENT_PROJECT_VERSION)(Build 号)
方式 A:Xcode 可视化修改(推荐,不容易改错)
Mac 上打开工程:
bashopen ios/Runner.xcworkspace左侧选中 Runner Target → 顶部 General
找到 Identity 区域:
- Version = 版本名(对应
MARKETING_VERSION,例如1.2.5) - Build = Build 号(对应
CURRENT_PROJECT_VERSION,例如26,每次上传 App Store / TestFlight 必须比上次大)
- Version = 版本名(对应
保存后关闭 Xcode,再用命令行打包
若在文件里搜不到
MARKETING_VERSION:它写在ios/Runner.xcodeproj/project.pbxproj里(Debug / Release / Profile 三份各有一条),Xcode 界面上显示为 Version,不是字面显示MARKETING_VERSION。
方式 B:直接改工程文件(Cursor 可改)
打开 ios/Runner.xcodeproj/project.pbxproj,搜索:
MARKETING_VERSION
CURRENT_PROJECT_VERSION把 Debug / Release / Profile 三处全部改成同一套新值,例如:
MARKETING_VERSION = 1.2.5;
CURRENT_PROJECT_VERSION = 26;三处必须一致,漏改某一配置会导致 Debug 与正式包版本不一致。
3. 发版检查清单
每次准备上架前按需勾选:
- [ ] 只发 Android:只改
pubspec.yaml的version - [ ] 只发 iOS:只改 Xcode Version / Build(或
project.pbxproj三处) - [ ] 双端同发:Android、iOS 各自改各自的号,数值可以不同(例如 Android
2.3.6、iOS1.2.6) - [ ] Android
versionCode、iOS Build 均已比商店上一版更大 - [ ] 未再使用
FLUTTER_BUILD_NAME/FLUTTER_BUILD_NUMBER绑定双端(本项目已拆开)
4. 常见误解
- 「改了
pubspec.yaml,iOS 也升了」→ 错误。本项目 iOS 已与 pubspec 解绑。 - 「双端必须写成同一个版本号」→ 错误。包名/BundleId 建议统一,版本号刻意保持独立。
- 「在
Info.plist里写死版本」→ 不推荐;应改 Xcode 的 Version / Build,由Info.plist引用变量。
本地开发调试(Android真机 / iOS模拟器 / iOS真机)
Android 真机调试流程
手机开启开发者选项、USB调试、USB安装应用,数据线连接电脑并授权调试
Cursor终端查看已连接设备
bashflutter devicesDebug模式运行项目(本地开发调试包,不可分发上架)
bash# 自动选用首个设备 flutter run # 多设备时指定设备ID运行 flutter run -d 设备ID
- 代码修改热重载:终端输入
r;完整重启项目:R
Android 无线调试(Android11及以上,无需USB)
adb connect 手机IP:端口
flutter run -d 设备IDiOS 模拟器本地调试流程(仅Mac,免费Apple ID可用,无需手机)
前置条件
- Xcode已下载对应iOS运行时(Xcode→Settings→Platforms下载)
- Pod依赖完整,已执行
pod install --repo-update - 无需付费开发者账号、无需配置真机签名、无需连接iPhone
方式1:Cursor终端标准业务调试命令(项目开发主推,带环境变量+指定模拟器ID)
完整执行逻辑:进入项目目录 → 唤起模拟器程序 → 注入开发环境标识 + 指定固定模拟器设备运行
# 1. 切换至Flutter项目根目录(pubspec.yaml所在路径,替换为你本地真实路径)
cd /Users/xxx/Desktop/flutter_project
# 2. 启动iOS模拟器程序
open -a Simulator
# 3. 携带开发环境变量,指定固定模拟器ID运行项目
flutter run --dart-define=MYENV=devel -d CA121079-8C07-4513-B89C-1参数详细解释
--dart-define=MYENV=devel编译时注入全局环境变量,Dart代码内可通过String.fromEnvironment("MYENV")获取devel,用于区分开发/测试/预发/生产接口地址、日志开关、第三方SDK环境配置。-d CA121079-8C07-4513-B89C-1指定唯一模拟器设备ID运行;多台模拟器、真机同时在线时,避免Flutter自动匹配错误设备。查询所有模拟器/真机设备ID命令
bashflutter devices
多环境扩展示例命令
# 测试环境模拟器运行
flutter run --dart-define=MYENV=test -d CA121079-8C07-4513-B89C-1
# 预发环境模拟器运行
flutter run --dart-define=MYENV=pre -d CA121079-8C07-4513-B89C-1
# 生产环境模拟器运行
flutter run --dart-define=MYENV=prod -d CA121079-8C07-4513-B89C-1方式2:简易无环境变量快速启动(仅调试UI布局使用)
# 方式1:Mac系统命令打开模拟器
open -a Simulator
# 方式2:flutter内置命令启动iOS模拟器
flutter emulators --launch apple_ios_simulator
# 自动识别当前模拟器运行,不区分环境
flutter run修改Dart代码,终端输入r热重载,全程无需打开Xcode。
方式3:Xcode内启动模拟器调试(适合查看原生OC/Swift日志、断点原生代码)
终端打开工程
bashopen ios/Runner.xcworkspaceXcode左上角播放按钮左侧下拉设备列表,切换至
iOS Simulators,选择任意iPhone/iPad模拟器机型点击左上角播放按钮(快捷键
Command + R),自动启动模拟器并安装运行AppXcode底部控制台可查看原生日志,支持原生代码断点调试
模拟器管理:新增/删除模拟器
- Xcode顶部菜单:
Window→Devices and Simulators - 切换至
Simulators标签,左侧展示全部模拟器 - 左下角
+新建iPhone、iPad模拟器;选中设备按Delete删除无用模拟器
模拟器限制说明
- 不支持真实摄像头、FaceID、指纹、蓝牙、真实APNs推送、陀螺仪等硬件能力
- 定位、通知仅支持模拟数据,无法对接真实厂商推送服务
- 仅用于页面布局、业务逻辑快速开发,上线前必须真机全量测试
iOS 真机调试流程(仅Mac电脑支持,需付费Apple开发者账号)
iPhone连接Mac,手机设置开启开发者模式
首次签名配置(仅需操作一次)
bashopen ios/Runner.xcworkspaceXcode内配置:
Target选中Runner,进入Signing & Capabilities
Team选择你的Apple开发者账号
勾选
Automatically manage signing(自动拉取证书、描述文件)填入与App Store Connect一致的Bundle Identifier
选中真机设备点击运行一次,手机信任开发者描述文件,完成后关闭Xcode
Cursor终端查看iOS设备
bashflutter devices运行Debug调试包(支持携带环境变量)
bash# 基础真机运行 flutter run -d iPhone设备ID # 携带开发环境变量真机调试 flutter run --dart-define=MYENV=devel -d iPhone设备ID终端输入
r实现代码热重载,该包仅本地调试使用。
Android 命令行两种打包全流程
打包前先按「双端版本号独立维护」章节改好 Android 的
pubspec.yaml版本号。
模式A:无证书Release未签名包(仅本地验证编译,禁止分发、不能上架)
仅用于测试Release模式代码是否存在编译报错,高版本安卓无法直接安装未签名APK
flutter build apk --release --target-platform android-arm64输出路径:build/app/outputs/flutter-apk/app-release-unsigned.apk
模式B:JKS正式证书签名打包(用于应用市场上架,生成APK/AAB)
步骤1:生成JKS签名密钥库
项目根目录新建android-key文件夹,终端执行生成证书命令,妥善保存密码与文件
keytool -genkey -v -keystore android-key/my-app-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-app-alias步骤2:创建签名配置文件 android/key.properties
storePassword=你的密钥库密码
keyPassword=你的密钥密码
keyAlias=my-app-alias
storeFile=../android-key/my-app-key.jks步骤3:配置build.gradle读取签名信息
打开android/app/build.gradle添加如下代码
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
// ...原有其他配置
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
shrinkResources true
}
}
}步骤4:命令行构建上架安装包
# 完整通用签名APK
flutter build apk --release
# 按CPU架构拆分APK,减小包体积
flutter build apk --release --split-per-abi
# 上架专用AAB包(Google Play、国内主流应用商店强制推荐)
flutter build appbundle --release输出路径:
- APK:
build/app/outputs/flutter-apk/app-release.apk - AAB:
build/app/outputs/bundle/release/app-release.aab
iOS Mac端打包、TestFlight、App Store上架全流程
前置条件:Mac电脑,Xcode已开启自动管理签名;App Store Connect后台已创建对应BundleId应用
打包前先按「双端版本号独立维护」章节改好 iOS 的 Version(
MARKETING_VERSION)与 Build(CURRENT_PROJECT_VERSION)。不要只改pubspec.yaml。
1. 命令行打包生成归档文件与IPA
# 携带环境变量打包生产IPA
flutter build ipa --release --dart-define=MYENV=prod打包逻辑:自动读取Xcode自动签名配置,联网拉取苹果证书与描述文件,无需手动导入p12、provisioning 输出文件:
- 归档包:
build/ios/archive/Runner.xcarchive - 安装包IPA:
build/ios/ipa/*.ipa
2. IPA上传至App Store Connect两种方案
方案1(可视化简单):Mac App Store下载Transporter,直接拖拽IPA文件上传 方案2(终端命令上传,需App Store Connect API密钥)
xcrun altool --upload-app --file build/ios/ipa/Runner.ipa \
--apiKey "你的API_KEY" \
--apiIssuer "Issuer_ID"3. TestFlight真机灰度测试完整流程
- IPA上传后等待苹果后台处理构建版本(数分钟至数十分钟)
- 登录App Store Connect → 测试 → TestFlight
- 选中已处理完成的构建版本,添加测试人员
- 内部测试:开发者团队成员,上限100人
- 外部测试:普通测试用户,上限10000人,需苹果简易合规审核
- 测试人员接收邮件,安装TestFlight App,打开链接安装测试包真机联调 补充:TestFlight为Release环境包,不支持断点调试,可通过Mac控制台查看手机运行日志
4. App Store生产包审核、发布上线
- TestFlight全量真机测试完成,确认推送、业务、兼容性无问题
- App Store Connect完善应用元数据:截图、应用描述、隐私政策、年龄分级、版本更新文案
- 选择可用构建版本,提交苹果官方审核
- 等待1~3个工作日审核,审核通过后选择手动发布或定时自动上线
双端推送配置区分与说明
Android推送
- 在
AndroidManifest.xml集成对应推送SDK(小米/华为/FCM/个推等) - 推送厂商后台注册应用时填写项目统一Android包名applicationId
- 打包无需额外命令参数,代码内配置完成即可随包打入
iOS推送(自动证书模式)
Xcode → Runner → Signing & Capabilities 添加
Push Notifications权限开启自动管理签名后,Xcode自动生成开发、生产两套APNs推送证书,无需手动下载
App Store Connect后台确认应用推送功能已启用
环境区分:
本地Debug真机运行:使用开发推送证书
TestFlight灰度包 / App Store线上包:使用生产推送证书
补充:iOS模拟器无法接收真实APNs推送,仅真机可测试推送功能
全流程高频命令汇总
# 拉取/更新项目依赖
flutter pub get
# 查看所有连接设备(模拟器+真机)
flutter devices
# 环境完整性检测
flutter doctor -v
# Android真机Debug运行
flutter run -d 设备ID
# iOS模拟器标准开发调试命令(进入项目目录+启动模拟器+环境变量+指定模拟器ID)
cd /Users/xxx/Desktop/flutter_project
open -a Simulator
flutter run --dart-define=MYENV=devel -d CA121079-8C07-4513-B89C-1
# iOS模拟器简易快速启动
open -a Simulator
flutter run
# iOS真机Debug运行(Mac专属,携带环境变量)
flutter run --dart-define=MYENV=devel -d iPhone设备ID
# Android 未签名Release包(仅编译校验)
flutter build apk --release --target-platform android-arm64
# Android 签名上架APK
flutter build apk --release
# Android 上架AAB包
flutter build appbundle --release
# Mac打包iOS生产IPA(携带生产环境变量)
flutter build ipa --release --dart-define=MYENV=prod
# iOS pod修复命令
cd ios
pod deintegrate
pod install --repo-update
cd ..
# 打包异常清理缓存(报错优先执行)
flutter clean
flutter pub get.gitignore 证书安全配置
项目根目录.gitignore添加以下内容,严禁证书、密钥文件提交代码仓库
# Android签名密钥文件
android/key.properties
android-key/*.jks
# Flutter编译产物
build/
# iOS Pod缓存与用户配置
ios/Pods/
ios/.symlinks
ios/Runner.xcworkspace/xcuserdata/常见报错故障排查清单
- 打包编译失败:优先执行
flutter clean && flutter pub get清理缓存重试 - flutter doctor提示Android缺少cmdline-tools:单独下载Android命令行工具解压至SDK目录,无需安装Android Studio
- iOS打包提示证书缺失:打开Xcode确认自动管理签名勾选,Mac保持网络连接,等待Xcode自动下载证书,关闭Xcode后重新终端打包
- 终端
flutter devices识别不到真机/模拟器- 真机:手机重新插拔USB、重新开启USB调试、重新授权电脑
- 模拟器:关闭全部模拟器,重新执行
open -a Simulator
- iOS Pod安装报错:进入ios目录执行
pod deintegrate清除缓存后重新install - Android高版本无法安装APK:确认使用带JKS签名的Release包,未签名包仅作编译验证不可安装分发
- iOS模拟器空白/闪退:Xcode下载对应iOS运行时,清理缓存后重新执行模拟器调试命令
- 模拟器收不到推送:属正常限制,推送功能必须使用iOS真机测试
- --dart-define环境变量不生效:执行
flutter clean清理缓存后重新运行调试命令 - iOS 版本号不对 / 和 Android 一样了:检查是否只改了
pubspec.yaml;iOS 必须改 Xcode Version/Build,或在project.pbxproj搜索MARKETING_VERSION、CURRENT_PROJECT_VERSION(Debug/Release/Profile 三处) - 搜不到
MARKETING_VERSION:在 Cursor 打开ios/Runner.xcodeproj/project.pbxproj全文搜索;或在 Xcode → Runner → General → Identity 看 Version(即该字段)