命令行打包 + Xcode Organizer / Transporter 上传。
我先帮你把这些命令的关系理清楚,然后给你整理成以后可以直接照抄的版本。
一、你之前这几个命令分别是什么意思?
你贴的命令大概是这些:
cd /Users/peter/code_arvita
xcodebuild \
-workspace ios/Runner.xcworkspace \
-scheme Runner \
-configuration Release \
-archivePath build/ios/archive/Runner.xcarchive \
-destination 'generic/platform=iOS' \
DEVELOPMENT_TEAM=PNK4JN5NFW \
CODE_SIGN_STYLE=Automatic \
-allowProvisioningUpdates \
archive
xcodebuild \
-exportArchive \
-archivePath build/ios/archive/Runner.xcarchive \
-exportPath build/ios/ipa \
-exportOptionsPlist ios/ExportOptions.plist \
-allowProvisioningUpdates
flutter build ipa --release --export-options-plist=ios/ExportOptions.plist
open /Users/peter/code_arvita/build/ios/archive/Runner.xcarchive
它们的作用分别是:
| 命令 | 作用 |
|---|---|
xcodebuild archive | 用 Xcode 打 .xcarchive 包 |
xcodebuild -exportArchive | 从 .xcarchive 导出 .ipa 或直接上传 |
flutter build ipa | Flutter 官方命令,内部会自动帮你做 archive 和 export |
open .../Runner.xcarchive | 打开 Xcode Organizer,然后手动上传到 App Store Connect |
二、重点:这些命令其实有重复
你现在其实 不需要同时执行这么多命令。
如果你用的是:
flutter build ipa --release --export-options-plist=ios/ExportOptions.plist
它通常已经包含了:
1. 构建 Flutter iOS Release
2. 生成 xcarchive
3. 根据 ExportOptions.plist 导出 ipa 或上传
所以前面的这两个 xcodebuild 命令可以不用每次都跑:
xcodebuild archive
xcodebuild -exportArchive
否则等于重复打包。
三、推荐你以后用这个最简流程
以后更新 App Store,建议你只用这套:
cd /Users/peter/code_arvita
flutter clean
flutter pub get
flutter build ipa \
--release \
--export-options-plist=ios/ExportOptions.plist
open build/ios/archive/Runner.xcarchive
然后会打开 Xcode Organizer。
在 Organizer 里:
Distribute App
选择:
App Store Connect
再选择:
Upload
一路下一步,上传完成后去 App Store Connect 提交新版本。
四、如果你想在命令里直接指定版本号
每次更新 App Store,必须增加:
Version
Build
例如旧版本是:
1.3.0 (25)
新版本可以是:
1.3.1 (26)
你可以直接改 pubspec.yaml:
version: 1.3.1+26
也可以不改文件,直接在命令里指定:
flutter build ipa \
--release \
--build-name=1.3.1 \
--build-number=26 \
--export-options-plist=ios/ExportOptions.plist
解释:
--build-name=1.3.1 对应 App Store 的 Version
--build-number=26 对应 App Store 的 Build
五、你的 ExportOptions.plist 应该长什么样?
你之前用到了:
--export-options-plist=ios/ExportOptions.plist
这个文件很重要。
如果你是用 自动签名,也就是类似你命令里的:
CODE_SIGN_STYLE=Automatic
那么 ios/ExportOptions.plist 可以这样写:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>teamID</key>
<string>PNK4JN5NFW</string>
<key>destination</key>
<string>export</string>
<key>signingStyle</key>
<string>automatic</string>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>
参数解释
| 参数 | 含义 |
|---|---|
method | 打包方式,上架用 app-store |
teamID | 你的开发者团队 ID |
destination | export 表示导出 .ipa,upload 表示直接上传 |
signingStyle | automatic 表示自动签名 |
uploadSymbols | 是否上传 dSYM 符号,建议开启 |
六、如果你想像以前一样导出 IPA,然后用 Transporter 上传
如果你的 ExportOptions.plist 里是:
<key>destination</key>
<string>export</string>
那么执行:
cd /Users/peter/code_arvita
flutter clean
flutter pub get
flutter build ipa \
--release \
--export-options-plist=ios/ExportOptions.plist
打包完成后,.ipa 一般在这里:
build/ios/ipa/
你可以打开:
open build/ios/ipa
然后用 Transporter 上传这个 .ipa。
Transporter 下载:
https://apps.apple.com/cn/app/transporter/id1450874784
打开后:
登录 Apple ID
选择你的 App
选择 .ipa 文件
上传
上传完成后去 App Store Connect 选择这个 Build。
七、如果你想直接通过命令上传,不手动打开 Organizer
可以把 ExportOptions.plist 改成:
<key>destination</key>
<string>upload</string>
完整示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>teamID</key>
<string>PNK4JN5NFW</string>
<key>destination</key>
<string>upload</string>
<key>signingStyle</key>
<string>automatic</string>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>
然后执行:
cd /Users/peter/code_arvita
flutter clean
flutter pub get
flutter build ipa \
--release \
--export-options-plist=ios/ExportOptions.plist
这种方式会尝试直接上传到 App Store Connect。
但是要注意:
- 你的 macOS 上的 Xcode 需要已经登录有权限的 Apple ID
- 该账号需要能访问 App Store Connect
- 有时仍然会弹出认证或需要双重认证
所以我更推荐你用下面这种稳定方式:
destination = export
然后用:
Organizer 上传
或者:
Transporter 上传
八、推荐你保存成固定命令
你可以把下面这段保存成笔记。
日常更新命令
cd /Users/peter/code_arvita
flutter clean
flutter pub get
flutter build ipa \
--release \
--export-options-plist=ios/ExportOptions.plist
open build/ios/archive/Runner.xcarchive
执行后:
Organizer 打开
点击 Distribute App
选择 App Store Connect
选择 Upload
上传
如果要指定新版本号
例如这次要发:
1.3.1
Build 26
执行:
cd /Users/peter/code_arvita
flutter clean
flutter pub get
flutter build ipa \
--release \
--build-name=1.3.1 \
--build-number=26 \
--export-options-plist=ios/ExportOptions.plist
open build/ios/archive/Runner.xcarchive
九、如果你习惯用你原来的 xcodebuild 命令,也可以这样整理
你原来的方式可以整理成:
cd /Users/peter/code_arvita
flutter clean
flutter pub get
xcodebuild \
-workspace ios/Runner.xcworkspace \
-scheme Runner \
-configuration Release \
-archivePath build/ios/archive/Runner.xcarchive \
-destination 'generic/platform=iOS' \
DEVELOPMENT_TEAM=PNK4JN5NFW \
CODE_SIGN_STYLE=Automatic \
-allowProvisioningUpdates \
archive
xcodebuild \
-exportArchive \
-archivePath build/ios/archive/Runner.xcarchive \
-exportPath build/ios/ipa \
-exportOptionsPlist ios/ExportOptions.plist \
-allowProvisioningUpdates
open build/ios/archive/Runner.xcarchive
这个流程也是可以的。
但如果你用了:
flutter build ipa --release --export-options-plist=ios/ExportOptions.plist
就不需要再手动执行前面两个 xcodebuild 命令。
十、上传后还要去 App Store Connect 操作
上传成功不等于自动提交审核。
你还需要打开:
https://appstoreconnect.apple.com/
进入:
我的 App
选择你的 App。
然后:
iOS App
创建新版本,例如:
1.3.1
在版本页面:
选择构建版本 / Build
选择刚上传的:
1.3.1 (26)
填写:
版本说明 / What's New in This Version
例如:
1. 修复已知问题
2. 优化性能
3. 更新隐私说明
然后:
提交审核
十一、你以后只需要记住这个版本
我建议你以后就用这一套:
cd /Users/peter/code_arvita
flutter clean
flutter pub get
flutter build ipa \
--release \
--build-name=新版本号 \
--build-number=新构建号 \
--export-options-plist=ios/ExportOptions.plist
open build/ios/archive/Runner.xcarchive
例如:
cd /Users/peter/code_arvita
flutter clean
flutter pub get
flutter build ipa \
--release \
--build-name=1.3.1 \
--build-number=26 \
--export-options-plist=ios/ExportOptions.plist
open build/ios/archive/Runner.xcarchive
然后:
Organizer -> Distribute App -> App Store Connect -> Upload
最后:
App Store Connect -> 选择新 Build -> 提交审核
十二、你的 ExportOptions.plist 推荐配置
建议放在:
/Users/peter/code_arvita/ios/ExportOptions.plist
内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>teamID</key>
<string>PNK4JN5NFW</string>
<key>destination</key>
<string>export</string>
<key>signingStyle</key>
<string>automatic</string>
<key>uploadSymbols</key>
<true/>
</dict>
</plist>
这样会导出 .ipa,也方便你以后用 Transporter。
十三、如果你发现 build/ios/ipa 里没有 IPA
检查 ExportOptions.plist 里的:
<key>destination</key>
如果是:
<string>upload</string>
它会直接上传,可能不会给你留下 .ipa。
如果你想要 .ipa,改成:
<string>export</string>
十四、常见报错
1. 提示 Build 号已经存在
比如你之前上传过:
1.3.0 (25)
这次不能再用:
1.3.1 (25)
必须改成:
1.3.1 (26)
命令:
--build-number=26
2. App Store Connect 里看不到构建
先等:
10 - 30 分钟
然后检查:
- 邮箱有没有 Apple 发来的构建失败邮件
- Build 号是否重复
- Bundle ID 是否一致
- 是否上传到正确的 App
- 是否使用了正确的开发者团队
3. 签名失败
确保你的 ExportOptions.plist 里是:
<key>signingStyle</key>
<string>automatic</string>
并且 Xcode 里登录了开发者账号。
打开:
Xcode -> Settings -> Accounts
确认有你的 Apple ID。
4. 找不到 ios/ExportOptions.plist
确认文件路径:
/Users/peter/code_arvita/ios/ExportOptions.plist
你也可以用命令打开:
open ios/ExportOptions.plist
如果文件不存在,就新建一个。
十五、最终推荐流程
你可以直接照这个做:
cd /Users/peter/code_arvita
flutter clean
flutter pub get
flutter build ipa \
--release \
--build-name=1.3.1 \
--build-number=26 \
--export-options-plist=ios/ExportOptions.plist
open build/ios/archive/Runner.xcarchive
然后:
Distribute App
App Store Connect
Upload
上传完成后:
App Store Connect
创建新版本
选择新 Build
填写更新说明
提交审核
这就是你之前那套命令的简化版,也是以后最稳的更新方式。

568

被折叠的 条评论
为什么被折叠?



