Skip to content

Flutter 使用Cursor开发 Android / iOS 本地调试、真机调试、命令行打包、TestFlight、应用市场上架完整操作文档 ​

文档说明:

  1. 开发编辑器:Cursor AI编辑器,不使用Android Studio做开发编辑
  2. 编译打包全部使用命令行,Cursor仅作为代码编辑器,调用本机系统终端执行flutter命令
  3. Android两种打包模式:①无证书不上架release测试包;②有JKS正式证书,应用市场上架包
  4. iOS:Mac环境,Xcode开启Automatically manage signing自动获取证书密钥;新增iOS模拟器本地调试完整流程(含自定义环境变量+指定模拟器ID标准命令);包含模拟器、真机调试、TestFlight、AppStore Connect、审核上架、推送配置
  5. Android包名、iOS BundleId 关键概念完整说明

目录 ​

  1. 前置环境准备
  2. Cursor编辑器配置
  3. Android包名与iOS BundleId完整概念说明
  4. 双端版本号独立维护(发版必改)
  5. 本地开发调试(Android真机 / iOS模拟器 / iOS真机)
  6. Android 命令行两种打包全流程
  7. iOS Mac端打包、TestFlight、App Store上架全流程
  8. 双端推送配置区分与说明
  9. 全流程高频命令汇总
  10. .gitignore 证书安全配置
  11. 常见报错故障排查清单

前置环境准备 ​

Windows(仅可做Android开发编译,无法编译iOS) ​

  1. Flutter SDK,配置系统环境变量,终端可执行 flutter --version
  2. Android SDK,配置环境变量 ANDROID_HOME,需要 cmdline‑tools、build‑tools、platforms
  3. JDK17(Flutter3.x推荐版本)
  4. Cursor编辑器,安装Flutter、Dart插件
  5. 安卓手机USB驱动

Mac(Android + iOS双端完整编译打包,支持iOS模拟器) ​

  1. Flutter SDK,zsh环境变量配置,任意终端可执行flutter命令
  2. Android SDK,配置ANDROID_HOME
  3. JDK17
  4. Xcode(App Store下载,首次打开完成组件、iOS模拟器运行时安装)
  5. cocoapods:sudo gem install cocoapods
  6. Cursor编辑器,Flutter&Dart插件
  7. Apple开发者账号(99美元/年,仅iOS真机、TestFlight、App Store上架需要;iOS模拟器调试免费Apple ID即可)

环境校验(Cursor终端执行) ​

bash
flutter doctor -v
  • 红色错误必须全部修复;黄色警告视情况处理。
  • Android只需要SDK命令行工具,不需要安装Android Studio软件本体。

项目初始化(拉代码/切分支必执行) ​

bash
# 拉取项目依赖
flutter pub get
# Mac环境iOS初始化pod
cd ios
pod install --repo-update
cd ..

Cursor编辑器配置 ​

Cursor仅负责编写代码,编译、调试、打包全部调用本机终端,Cursor本身不做编译引擎。

  1. Cursor插件市场安装 Flutter、Dart
  2. 设置 Settings → Flutter → Flutter SDK path,填入本地Flutter SDK根目录
  3. 使用Cursor打开项目根目录(pubspec.yaml所在文件夹)
  4. 打开内置终端:View → Terminal,所有flutter命令在此终端执行

Android包名与iOS BundleId完整概念说明 ​

1. Android 包名(applicationId)是什么 ​

Android包名是安卓系统识别APP的唯一身份标识,上架后永久不可修改,修改等于全新应用,无法覆盖升级。

  • 生效核心配置:android/app/build.gradle 中 applicationId

    groovy
    android {
      defaultConfig {
          applicationId "com.company.myflutterapp" // 最终生效安卓包名
      }
    }

    补充:AndroidManifest.xml 的 package 仅为源码路径,新版Flutter自动同步,最终包名以applicationId为准。

修改Android包名(推荐命令行一键修改) ​

bash
flutter pub run change_app_package_name:main com.company.myflutterapp

2. iOS BundleId(Bundle Identifier)是什么 ​

苹果生态唯一应用标识,绑定签名证书、APNs推送、App Store Connect,上架后不可修改。

  1. 可视化配置位置:Xcode打开ios/Runner.xcworkspace → Runner Target → Signing & Capabilities → Bundle Identifier
  2. 文件底层:ios/Runner.xcodeproj/project.pbxproj 内 PRODUCT_BUNDLE_IDENTIFIER
  3. App Store Connect后台新建App必须填写完全一致字符串

开启Automatically manage signing自动管理签名后,填入BundleId会自动向苹果服务器注册AppID、下载调试/发布全套证书。

补充:iOS模拟器调试不校验证书、无需付费开发者账号,BundleId仅做标识即可。

修改iOS BundleId推荐方式 ​

打开ios/Runner.xcworkspace在Xcode可视化界面修改,保存后关闭Xcode,后续命令行打包自动读取配置;不建议直接修改pbxproj文件,极易破坏工程格式。

3. 统一规范(强制最佳实践) ​

  1. Android applicationId = iOS BundleId,字符串完全相同,示例:com.abc.shop
  2. 命名规则:反向域名、全小写,格式com.企业.项目名,禁止大写、中文、空格、特殊符号
  3. 推送、第三方登录、支付、统计SDK全部统一使用该套ID

双端版本号独立维护(发版必改) ​

强制约定(rosun_transaction_app):Android 与 iOS 版本号互不共用。
不要再只改 pubspec.yaml 就以为双端都升了版——该文件只影响 Android;iOS 必须单独改。

平台版本名(用户可见)Build 号(商店递增用)当前示例
AndroidversionNameversionCode(整数,每次上架必须 +1)2.3.5 / 135
iOSMARKETING_VERSION(Xcode 里叫 Version)CURRENT_PROJECT_VERSION(Xcode 里叫 Build)1.2.5 / 26

1. 修改 Android 版本号 ​

改哪里: 项目根目录 pubspec.yaml 的 version 字段。

yaml
# 格式:版本名+Build号
# 例:2.3.5 是 versionName,135 是 versionCode
version: 2.3.5+135

生效链路: android/app/build.gradle.kts 会读取 pubspec.yaml,自动写入 versionName / versionCode。

发版步骤:

  1. 把 2.3.5+135 改成新版本,例如 2.3.6+136(版本名按业务递增,Build 号必须比上次上架大)
  2. 执行打包命令(见下文 Android 打包章节)
  3. 不要指望这一步会改 iOS 版本

2. 修改 iOS 版本号 ​

iOS 不读 pubspec.yaml。Info.plist 已改为引用 Xcode 工程字段:

  • CFBundleShortVersionString → $(MARKETING_VERSION)(版本名)
  • CFBundleVersion → $(CURRENT_PROJECT_VERSION)(Build 号)

方式 A:Xcode 可视化修改(推荐,不容易改错) ​

  1. Mac 上打开工程:

    bash
    open ios/Runner.xcworkspace
  2. 左侧选中 Runner Target → 顶部 General

  3. 找到 Identity 区域:

    • Version = 版本名(对应 MARKETING_VERSION,例如 1.2.5)
    • Build = Build 号(对应 CURRENT_PROJECT_VERSION,例如 26,每次上传 App Store / TestFlight 必须比上次大)
  4. 保存后关闭 Xcode,再用命令行打包

若在文件里搜不到 MARKETING_VERSION:它写在 ios/Runner.xcodeproj/project.pbxproj 里(Debug / Release / Profile 三份各有一条),Xcode 界面上显示为 Version,不是字面显示 MARKETING_VERSION。

方式 B:直接改工程文件(Cursor 可改) ​

打开 ios/Runner.xcodeproj/project.pbxproj,搜索:

text
MARKETING_VERSION
CURRENT_PROJECT_VERSION

把 Debug / Release / Profile 三处全部改成同一套新值,例如:

text
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、iOS 1.2.6)
  • [ ] Android versionCode、iOS Build 均已比商店上一版更大
  • [ ] 未再使用 FLUTTER_BUILD_NAME / FLUTTER_BUILD_NUMBER 绑定双端(本项目已拆开)

4. 常见误解 ​

  1. 「改了 pubspec.yaml,iOS 也升了」→ 错误。本项目 iOS 已与 pubspec 解绑。
  2. 「双端必须写成同一个版本号」→ 错误。包名/BundleId 建议统一,版本号刻意保持独立。
  3. 「在 Info.plist 里写死版本」→ 不推荐;应改 Xcode 的 Version / Build,由 Info.plist 引用变量。

本地开发调试(Android真机 / iOS模拟器 / iOS真机) ​

Android 真机调试流程 ​

  1. 手机开启开发者选项、USB调试、USB安装应用,数据线连接电脑并授权调试

  2. Cursor终端查看已连接设备

    bash
    flutter devices
  3. Debug模式运行项目(本地开发调试包,不可分发上架)

    bash
    # 自动选用首个设备
    flutter run
    # 多设备时指定设备ID运行
    flutter run -d 设备ID
  • 代码修改热重载:终端输入r;完整重启项目:R

Android 无线调试(Android11及以上,无需USB) ​

bash
adb connect 手机IP:端口
flutter run -d 设备ID

iOS 模拟器本地调试流程(仅Mac,免费Apple ID可用,无需手机) ​

前置条件 ​

  1. Xcode已下载对应iOS运行时(Xcode→Settings→Platforms下载)
  2. Pod依赖完整,已执行 pod install --repo-update
  3. 无需付费开发者账号、无需配置真机签名、无需连接iPhone

方式1:Cursor终端标准业务调试命令(项目开发主推,带环境变量+指定模拟器ID) ​

完整执行逻辑:进入项目目录 → 唤起模拟器程序 → 注入开发环境标识 + 指定固定模拟器设备运行

bash
# 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
参数详细解释 ​
  1. --dart-define=MYENV=devel 编译时注入全局环境变量,Dart代码内可通过 String.fromEnvironment("MYENV") 获取 devel,用于区分开发/测试/预发/生产接口地址、日志开关、第三方SDK环境配置。

  2. -d CA121079-8C07-4513-B89C-1 指定唯一模拟器设备ID运行;多台模拟器、真机同时在线时,避免Flutter自动匹配错误设备。

  3. 查询所有模拟器/真机设备ID命令

    bash
    flutter devices
多环境扩展示例命令 ​
bash
# 测试环境模拟器运行
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布局使用) ​

bash
# 方式1:Mac系统命令打开模拟器
open -a Simulator
# 方式2:flutter内置命令启动iOS模拟器
flutter emulators --launch apple_ios_simulator
# 自动识别当前模拟器运行,不区分环境
flutter run

修改Dart代码,终端输入r热重载,全程无需打开Xcode。

方式3:Xcode内启动模拟器调试(适合查看原生OC/Swift日志、断点原生代码) ​

  1. 终端打开工程

    bash
    open ios/Runner.xcworkspace
  2. Xcode左上角播放按钮左侧下拉设备列表,切换至 iOS Simulators,选择任意iPhone/iPad模拟器机型

  3. 点击左上角播放按钮(快捷键 Command + R),自动启动模拟器并安装运行App

  4. Xcode底部控制台可查看原生日志,支持原生代码断点调试

模拟器管理:新增/删除模拟器 ​

  1. Xcode顶部菜单:Window → Devices and Simulators
  2. 切换至 Simulators 标签,左侧展示全部模拟器
  3. 左下角 + 新建iPhone、iPad模拟器;选中设备按Delete删除无用模拟器

模拟器限制说明 ​

  1. 不支持真实摄像头、FaceID、指纹、蓝牙、真实APNs推送、陀螺仪等硬件能力
  2. 定位、通知仅支持模拟数据,无法对接真实厂商推送服务
  3. 仅用于页面布局、业务逻辑快速开发,上线前必须真机全量测试

iOS 真机调试流程(仅Mac电脑支持,需付费Apple开发者账号) ​

  1. iPhone连接Mac,手机设置开启开发者模式

  2. 首次签名配置(仅需操作一次)

    bash
    open ios/Runner.xcworkspace

    Xcode内配置:

  • Target选中Runner,进入Signing & Capabilities

  • Team选择你的Apple开发者账号

  • 勾选 Automatically manage signing(自动拉取证书、描述文件)

  • 填入与App Store Connect一致的Bundle Identifier

  • 选中真机设备点击运行一次,手机信任开发者描述文件,完成后关闭Xcode

  1. Cursor终端查看iOS设备

    bash
    flutter devices
  2. 运行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

bash
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文件夹,终端执行生成证书命令,妥善保存密码与文件

bash
keytool -genkey -v -keystore android-key/my-app-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-app-alias

步骤2:创建签名配置文件 android/key.properties ​

properties
storePassword=你的密钥库密码
keyPassword=你的密钥密码
keyAlias=my-app-alias
storeFile=../android-key/my-app-key.jks

步骤3:配置build.gradle读取签名信息 ​

打开android/app/build.gradle添加如下代码

groovy
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:命令行构建上架安装包 ​

bash
# 完整通用签名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 ​

bash
# 携带环境变量打包生产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密钥)

bash
xcrun altool --upload-app --file build/ios/ipa/Runner.ipa \
--apiKey "你的API_KEY" \
--apiIssuer "Issuer_ID"

3. TestFlight真机灰度测试完整流程 ​

  1. IPA上传后等待苹果后台处理构建版本(数分钟至数十分钟)
  2. 登录App Store Connect → 测试 → TestFlight
  3. 选中已处理完成的构建版本,添加测试人员
    • 内部测试:开发者团队成员,上限100人
    • 外部测试:普通测试用户,上限10000人,需苹果简易合规审核
  4. 测试人员接收邮件,安装TestFlight App,打开链接安装测试包真机联调 补充:TestFlight为Release环境包,不支持断点调试,可通过Mac控制台查看手机运行日志

4. App Store生产包审核、发布上线 ​

  1. TestFlight全量真机测试完成,确认推送、业务、兼容性无问题
  2. App Store Connect完善应用元数据:截图、应用描述、隐私政策、年龄分级、版本更新文案
  3. 选择可用构建版本,提交苹果官方审核
  4. 等待1~3个工作日审核,审核通过后选择手动发布或定时自动上线

双端推送配置区分与说明 ​

Android推送 ​

  1. 在AndroidManifest.xml集成对应推送SDK(小米/华为/FCM/个推等)
  2. 推送厂商后台注册应用时填写项目统一Android包名applicationId
  3. 打包无需额外命令参数,代码内配置完成即可随包打入

iOS推送(自动证书模式) ​

  1. Xcode → Runner → Signing & Capabilities 添加Push Notifications权限

  2. 开启自动管理签名后,Xcode自动生成开发、生产两套APNs推送证书,无需手动下载

  3. App Store Connect后台确认应用推送功能已启用

  4. 环境区分:

    • 本地Debug真机运行:使用开发推送证书

    • TestFlight灰度包 / App Store线上包:使用生产推送证书

      补充:iOS模拟器无法接收真实APNs推送,仅真机可测试推送功能

全流程高频命令汇总 ​

bash
# 拉取/更新项目依赖
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添加以下内容,严禁证书、密钥文件提交代码仓库

gitignore
# Android签名密钥文件
android/key.properties
android-key/*.jks

# Flutter编译产物
build/

# iOS Pod缓存与用户配置
ios/Pods/
ios/.symlinks
ios/Runner.xcworkspace/xcuserdata/

常见报错故障排查清单 ​

  1. 打包编译失败:优先执行 flutter clean && flutter pub get 清理缓存重试
  2. flutter doctor提示Android缺少cmdline-tools:单独下载Android命令行工具解压至SDK目录,无需安装Android Studio
  3. iOS打包提示证书缺失:打开Xcode确认自动管理签名勾选,Mac保持网络连接,等待Xcode自动下载证书,关闭Xcode后重新终端打包
  4. 终端flutter devices识别不到真机/模拟器
    • 真机:手机重新插拔USB、重新开启USB调试、重新授权电脑
    • 模拟器:关闭全部模拟器,重新执行 open -a Simulator
  5. iOS Pod安装报错:进入ios目录执行pod deintegrate清除缓存后重新install
  6. Android高版本无法安装APK:确认使用带JKS签名的Release包,未签名包仅作编译验证不可安装分发
  7. iOS模拟器空白/闪退:Xcode下载对应iOS运行时,清理缓存后重新执行模拟器调试命令
  8. 模拟器收不到推送:属正常限制,推送功能必须使用iOS真机测试
  9. --dart-define环境变量不生效:执行flutter clean清理缓存后重新运行调试命令
  10. iOS 版本号不对 / 和 Android 一样了:检查是否只改了 pubspec.yaml;iOS 必须改 Xcode Version/Build,或在 project.pbxproj 搜索 MARKETING_VERSION、CURRENT_PROJECT_VERSION(Debug/Release/Profile 三处)
  11. 搜不到 MARKETING_VERSION:在 Cursor 打开 ios/Runner.xcodeproj/project.pbxproj 全文搜索;或在 Xcode → Runner → General → Identity 看 Version(即该字段)

Released under the MIT License.