直接使用 Xcode 自带的 xcodebuild 命令行工具编写脚本,是在 macOS 环境下实现 iOS 自动化打包最原生且可控的方案,适合集成到 Jenkins、GitLab CI 或本地定时任务中。
核心结论:原生工具链最稳定,重点在于证书配置和导出参数。
- 适合:macOS 构建环境,已有有效签名证书
- 先准备:导出选项 plist 文件与 provisioning profiles
- 建议:先手动在 Xcode 成功归档,再转为脚本
完整脚本 Demo
以下是一个包含错误处理、变量定义和完整流程的 build.sh 脚本示例。保存为 build.sh 并赋予执行权限(chmod +x build.sh)后运行。
#!/bin/bash
set -e
# 配置变量
PROJECT_NAME="YourProject"
SCHEME_NAME="YourSchemeName"
WORKSPACE_NAME="YourProject.xcworkspace"
ARCHIVE_PATH="./build/${PROJECT_NAME}.xcarchive"
EXPORT_PATH="./build/ipa"
PLIST_PATH="./exportOptions.plist"
# 清理旧构建
echo "Cleaning build..."
xcodebuild clean -scheme "${SCHEME_NAME}" -workspace "${WORKSPACE_NAME}"
# 归档
echo "Archiving..."
xcodebuild -scheme "${SCHEME_NAME}" \
-workspace "${WORKSPACE_NAME}" \
archive \
-archivePath "${ARCHIVE_PATH}" \
-configuration Release
# 导出 IPA
echo "Exporting IPA..."
xcodebuild -exportArchive \
-archivePath "${ARCHIVE_PATH}" \
-exportPath "${EXPORT_PATH}" \
-exportOptionsPlist "${PLIST_PATH}"
# 验证结果
if [ -f "${EXPORT_PATH}/${PROJECT_NAME}.ipa" ]; then
echo "Build Success: ${EXPORT_PATH}/${PROJECT_NAME}.ipa"
else
echo "Build Failed: IPA not found"
exit 1
fiexportOptions.plist 配置示例
导出 IPA 必须提供 exportOptions.plist 文件,指定签名方式和导出类型。以下是适用于 App Store 分发的 XML 配置示例:
<?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>YourTeamID</string>
<key>uploadSymbols</key>
<true/>
<key>compileBitcode</key>
<false/>
<key>manageAppVersionAndBuildNumber</key>
<true/>
</dict>
</plist>注意:method 字段可选值包括 app-store, ad-hoc, enterprise, development 等,需与 provisioning profile 类型匹配。
环境与证书检查
在运行脚本前,建议通过以下命令确认构建环境和签名身份是否就绪:
1. 确认 Xcode 路径
xcode-select -p如果路径不对,使用 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer 修正。
2. 检查签名证书
确保钥匙串中已导入有效的证书和私钥:
security find-identity -v -s "iPhone Distribution"验证与排查
脚本执行完毕后,不要只看终端是否有报错,建议加入以下检查步骤:
1. 检查文件存在性
ls -lh ./build/ipa/YourProject.ipa2. 验证签名
使用 codesign 命令验证 IPA 的签名是否完整(注意参数前不要加反引号):
codesign -verify `--verbose` ./build/ipa/YourProject.ipa常见问题与排查
1. 代码签名身份匹配
脚本运行环境(如 CI 服务器)必须导入与项目中配置的 Code Signing Identity 匹配的证书和私钥,否则构建会报错。
2. 路径包含空格
项目路径或方案名称如果包含空格,必须在命令中用引号包裹,否则 xcodebuild 会识别错误。
3. Provisioning Profile 自动管理
如果项目开启了 Automatically manage signing,脚本运行环境需要登录有效的 Apple ID 或配置好对应的 provisioning profile 文件,否则无法通过签名验证。
4. Xcode 版本变动
不同版本的 Xcode 可能调整了命令行参数的行为,升级 Xcode 后建议先在本地手动运行一遍脚本确认兼容性。