Xcode 14下xcodebuild命令行打包失败,Xcode 13可正常运行
Xcode 14命令行打包签名证书找不到问题解决指南
核心问题
原脚本在Xcode 13可正常运行,升级到Xcode 14后归档失败,报错找不到匹配团队ID "HHGY6CWBZB" 且带私钥的iOS Development签名证书,且无法回退Xcode 13(苹果不再接受其构建包)。
可能原因
Xcode 14对签名验证机制做了更严格的规范,以下是常见诱因:
- 当前机器钥匙串中缺失对应团队ID的签名证书私钥
- 命令行环境未获取钥匙串访问权限
- 自动签名逻辑在Xcode 14中存在兼容性问题
exportOptionsPlist配置与Xcode 14不匹配
分步解决方案
1. 验证钥匙串中的证书完整性
打开钥匙串访问工具,切换到「登录」钥匙串:
- 确认存在团队ID为
HHGY6CWBZB的iOS Development证书 - 证书左侧需显示展开箭头(表示已关联私钥)
- 若缺失私钥,需从开发者账号重新下载证书,或从其他可信机器导出
.p12格式的证书+私钥文件导入当前机器
2. 给命令行授予钥匙串访问权限
在打包脚本开头添加钥匙串解锁命令(建议通过Jenkins环境变量传递密码,避免明文泄露):
security unlock-keychain -p "$KEYCHAIN_PASSWORD" login.keychain-db
3. 显式指定签名参数
修改xcodebuild archive命令,强制指定签名团队和证书类型,避免自动签名的不确定性:
xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -configuration "$CONFIGURATION" -destination 'generic/platform=iOS' -archivePath "$ARCHIEVE_PATH" -allowProvisioningUpdates -teamID "HHGY6CWBZB" -signingCertificate "iOS Development" clean archive
-allowProvisioningUpdates:允许Xcode自动同步开发者账号的配置文件-teamID/-signingCertificate:明确指定签名主体,消除Xcode自动签名的模糊逻辑
4. 检查exportOptionsPlist配置
确保配置文件中的签名相关字段与实际匹配:
<key>teamID</key> <string>HHGY6CWBZB</string> <key>signingStyle</key> <string>manual</string> <!-- 若使用自动签名则设为automatic -->
手动签名模式下,需确认项目已正确关联对应配置文件。
5. 切换到Xcode 14命令行工具
确认当前终端使用的是Xcode 14的命令行工具:
xcode-select -p
若输出非Xcode 14路径,执行切换命令:
sudo xcode-select -switch /Applications/Xcode_14.app/Contents/Developer
修改后的完整脚本示例
function buildArchieve { BUILD_FILES="$BUILD_DIR/${ASSET_BASENAME}" mkdir -p "$BUILD_FILES" # 解锁钥匙串(密码通过Jenkins环境变量传递) security unlock-keychain -p "$KEYCHAIN_PASSWORD" login.keychain-db # 归档构建,添加显式签名参数 ARCHIEVE_PATH="$BUILD_DIR/${ASSET_BASENAME}/$EXPORT_METHOD/${PRODUCT_NAME}.xcarchive" (xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -configuration "$CONFIGURATION" -destination 'generic/platform=iOS' -archivePath "$ARCHIEVE_PATH" -allowProvisioningUpdates -teamID "HHGY6CWBZB" -signingCertificate "iOS Development" clean archive 1> /dev/null || xcodebuild -workspace "$WORKSPACE" -scheme "$SCHEME" -configuration "$CONFIGURATION" -destination 'generic/platform=iOS' -archivePath "$ARCHIEVE_PATH" -allowProvisioningUpdates -teamID "HHGY6CWBZB" -signingCertificate "iOS Development" clean archive || failed "XCode failed to build app") # 导出归档包 EXPORT_PATH="$BUILD_DIR/${ASSET_BASENAME}/$EXPORT_METHOD" xcodebuild -exportArchive -archivePath "$ARCHIEVE_PATH" -exportPath "$EXPORT_PATH" -exportOptionsPlist "$EXPORT_PLIST_FILE" 1> /dev/null # 提取DSYM文件 if [ "$METHOD" == "app-store" ]; then DYSM_FILE="${EXPORT_PATH}/${PRODUCT_NAME}.xcarchive/dSYMs/WhiteLabel.app.dSYM" ditto -c -k --norsrc "$DYSM_FILE" "${BUILD_FILES}/${PRODUCT_NAME}_${bvers}.dSYM.zip" fi # 删除归档文件 rm -rf "$ARCHIEVE_PATH" }
内容的提问来源于stack exchange,提问作者Surbhi Garg
相关产品推荐
相关产品推荐

