Flutter终端构建macOS应用时CodeSign失败问题咨询
问题详情
执行终端命令构建Flutter macOS应用:
flutter run -d macOS
构建失败,添加--verbose参数后相关日志如下:
[ +166 ms] CodeSign [项目目录]/build/macos/Build/Products/Debug/mail_app.app (in target 'Runner' from project 'Runner')
[ ] cd [项目目录]/macos
[ ] Signing Identity: "-"
[ ] /usr/bin/codesign --force --sign - --entitlements
[项目目录]/build/macos/Build/Intermediates.noindex/Runner.build/Debug/Runner.build/mail_app.app.xcent --timestamp=none --generate-entitlement-der
[项目目录]/build/macos/Build/Products/Debug/mail_app.app
[ +23 ms] [项目目录]/build/macos/Build/Products/Debug/mail_app.app: code object is not signed at all
[ ] In subcomponent: [项目目录]/build/macos/Build/Products/Debug/mail_app.app/Contents/Frameworks/App.framework
[ ] Command CodeSign failed with a nonzero exit code
[ +10 ms] ** BUILD FAILED **
[ ] The following build commands failed:
[ ] CodeSign [项目目录]/build/macos/Build/Products/Debug/mail_app.app (in target 'Runner' from project 'Runner')
[ ] (1 failure)
版本信息
- Flutter:
Flutter 3.10.3 • channel stable • ssh://git@github.com/flutter/flutter.git Framework • revision f92f44110e (4天前) • 2023-06-01 18:17:33 -0500 Engine • revision 2a3401c9bb Tools • Dart 3.0.3 • DevTools 2.23.1 - macOS: Ventura 13.4
- XCode: 14.3.1
已完成操作
通过XCode打开[项目目录]/macos/Runner.xcworkspace可成功构建,XCode的Signing & Capabilites设置:
- Automatically manage signing: 已勾选
- Team: (我的名字) (Personal Team)
- Provisioning Profile: Not Required
- Signing Certificate: Sign to Run Locally
本地存在有效签名证书,但终端构建仍失败。
解决方案
1. 终端构建时指定签名身份
直接在构建命令中传入签名相关参数,替换成你自己的签名身份和Team ID(可从XCode的Signing配置中复制):
flutter run -d macOS --dart-define=CODE_SIGN_IDENTITY="Apple Development: 你的名字 (XXXXXX)" --dart-define=DEVELOPMENT_TEAM=XXXXXX
2. 清理构建缓存后重试
清理Flutter和CocoaPods的缓存,重新构建:
flutter clean cd macos pod deintegrate pod install cd .. flutter run -d macOS
3. 修改Podfile强制签名配置
编辑macos/Podfile,在post_install块中添加签名配置,确保子框架也能正确签名:
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_macos_build_settings(target) # 配置签名参数 target.build_configurations.each do |config| config.build_settings['CODE_SIGN_IDENTITY'] = 'Apple Development: 你的名字 (XXXXXX)' config.build_settings['DEVELOPMENT_TEAM'] = 'XXXXXX' config.build_settings['CODE_SIGN_STYLE'] = 'Manual' end end end
修改后执行cd macos && pod install,再回到项目根目录执行flutter run -d macOS。
4. 手动签名子框架
先手动给App.framework签名,再执行构建:
codesign --force --sign "Apple Development: 你的名字 (XXXXXX)" [项目目录]/build/macos/Build/Products/Debug/mail_app.app/Contents/Frameworks/App.framework flutter run -d macOS
问题原因
终端执行flutter run时,Flutter默认的构建配置未正确读取XCode的自动签名设置,采用了无签名(--sign -)的方式,但子组件App.framework需要有效的签名才能通过系统验证。而XCode构建时会自动处理所有子组件的签名流程,因此XCode能成功构建。
内容的提问来源于stack exchange,提问作者Shinnosuke Ono

