菜鸟科技网

Xcode打包命令如何正确使用?

下面我将从基础到高级,详细讲解 xcodebuild 的打包命令。

Xcode打包命令如何正确使用?-图1
(图片来源网络,侵删)

核心命令结构

最常用的打包命令结构如下:

xcodebuild -project <YourProjectName>.xcodeproj \
           -scheme <YourSchemeName> \
           -configuration <YourConfiguration> \
           -destination generic/platform=iOS \
           archive \
           -archivePath <PathToYourArchive>.xcarchive \
           -allowProvisioningUpdates \
           -allowProvisioningDeviceRegistration

我们分解这个命令中的每一个部分。


基础命令参数

这些是构建和打包所必需的核心参数。

参数 描述 示例
-project 指定你的 Xcode 项目文件路径(.xcodeproj)。 -project MyApp.xcodeproj
-scheme 指定你要构建的 Scheme 名称,Scheme 通常包含了目标、配置、运行方式等信息。 -scheme MyApp
-configuration 指定构建的配置,通常是 DebugRelease,打包发布版本应使用 Release -configuration Release
-destination 指定目标平台和设备,对于打包,我们通常不指定具体设备,而是指定平台。 -destination generic/platform=iOS (iOS App)
-destination generic/platform=macOS (macOS App)
-destination generic/platform=watchOS (watchOS App)
archive 这是一个动作,表示执行“归档”操作,归档会编译代码、链接资源,并生成一个 .xcarchive 文件。 archive
-archivePath 指定归档文件的保存路径,文件后缀通常是 .xcarchive -archivePath ./build/MyApp.xcarchive

打包成 IPA 文件

仅仅执行 archive 命令只会生成 .xcarchive 文件,这个文件不能直接安装,你需要再执行一个 exportArchive 动作来将其导出为 .ipa 文件。

Xcode打包命令如何正确使用?-图2
(图片来源网络,侵删)

完整的两步流程命令如下:

# 1. 归档
xcodebuild -project MyApp.xcodeproj \
           -scheme MyApp \
           -configuration Release \
           -destination generic/platform=iOS \
           archive \
           -archivePath ./build/MyApp.xcarchive \
           -allowProvisioningUpdates \
           -allowProvisioningDeviceRegistration
# 2. 导出为 IPA
xcodebuild -exportArchive \
           -archivePath ./build/MyApp.xcarchive \
           -exportPath ./build/ \
           -exportOptionsPlist ./ExportOptions.plist \
           -allowProvisioningUpdates

exportArchive 动作的关键参数:

参数 描述 示例
-exportArchive 导出归档文件的命令。 exportArchive
-archivePath 指定上一步生成的 .xcarchive 文件路径。 -archivePath ./build/MyApp.xcarchive
-exportPath 指定导出文件的存放目录。 -exportPath ./build/
-exportOptionsPlist 这是最重要的参数之一,它指定了一个属性列表文件(.plist),用来控制导出选项,比如是导出为 App Store 上传包、Ad Hoc 分发包还是 Development 开发包。 -exportOptionsPlist ./ExportOptions.plist

ExportOptions.plist 文件详解

ExportOptions.plist 是控制导出类型和方式的核心文件,你必须创建它。

示例 1:导出为 App Store 上传包

Xcode打包命令如何正确使用?-图3
(图片来源网络,侵删)
<!-- ExportOptions-AppStore.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>uploadSymbols</key>
    <true/>
    <key>uploadBitcode</key>
    <false/>
</dict>
</plist>
Key 描述
method 导出方法,常用值:
app-store: App Store 上传包
ad-hoc: Ad Hoc 分发包(需要指定设备和 UDID)
enterprise: 企业分发
development: 开发设备(用于 TestFlight 内部测试)
uploadSymbols 是否上传符号表(.dSYM)到 App Store Connect,对于崩溃分析至关重要。
uploadBitcode 是否上传 Bitcode,App Store 已要求 App 提交时包含 Bitcode,但有时为了调试或特定需求会设为 false

示例 2:导出为 Ad Hoc 分发包

<!-- ExportOptions-AdHoc.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>ad-hoc</string>
    <key>provisioningProfiles</key>
    <dict>
        <key>com.yourcompany.yourappbundleid</key>
        <string>Provisioning Profile Name for AdHoc</string>
    </dict>
    <key>signingCertificate</key>
    <string>iPhone Distribution</string>
    <key>teamID</key>
    <string>YOUR_TEAM_ID</string>
    <key>destination</key>
    <array>
        <string>export</string>
    </array>
</dict>
</plist>

完整实战脚本示例

这是一个完整的 Bash 脚本,它会清理、构建、归档并导出 IPA 文件。

#!/bin/bash
# --- 设置变量 ---
PROJECT_NAME="MyApp.xcodeproj"
SCHEME_NAME="MyApp"
CONFIGURATION="Release"
PLATFORM="iOS"
ARCHIVE_PATH="./build/${SCHEME_NAME}.xcarchive"
IPA_PATH="./build/${SCHEME_NAME}.ipa"
EXPORT_OPTIONS_PLIST="./ExportOptions-AppStore.plist"
# --- 创建构建目录 ---
mkdir -p ./build
echo "🚀 开始构建..."
# --- 1. 清理项目 (可选) ---
echo "🧹 清理项目..."
xcodebuild -project ${PROJECT_NAME} \
           -scheme ${SCHEME_NAME} \
           -configuration ${CONFIGURATION} \
           clean
# --- 2. 归档项目 ---
echo "📦 归档项目..."
xcodebuild -project ${PROJECT_NAME} \
           -scheme ${SCHEME_NAME} \
           -configuration ${CONFIGURATION} \
           -destination "generic/platform=${PLATFORM}" \
           archive \
           -archivePath ${ARCHIVE_PATH} \
           -allowProvisioningUpdates \
           -allowProvisioningDeviceRegistration
# 检查归档是否成功
if [ $? -ne 0 ]; then
    echo "❌ 归档失败!"
    exit 1
fi
echo "✅ 归档成功!"
# --- 3. 导出 IPA ---
echo "📤 导出 IPA..."
xcodebuild -exportArchive \
           -archivePath ${ARCHIVE_PATH} \
           -exportPath $(dirname ${IPA_PATH}) \
           -exportOptionsPlist ${EXPORT_OPTIONS_PLIST} \
           -allowProvisioningUpdates
# 检查导出是否成功
if [ $? -ne 0 ]; then
    echo "❌ 导出 IPA 失败!"
    exit 1
fi
echo "✅ IPA 导出成功!"
echo "📁 IPA 文件位置: ${IPA_PATH}"
# --- 4. 删除归档文件 (可选) ---
# rm -rf ${ARCHIVE_PATH}
echo "🎉 所有任务完成!"

如何使用这个脚本:

  1. 将上述代码保存为 build.sh 文件。
  2. 确保你的 ExportOptions-AppStore.plist 文件在项目根目录下。
  3. 给脚本添加可执行权限:chmod +x build.sh
  4. 在终端中运行:./build.sh

常见问题与技巧

  • 找不到 Scheme 或 Project

    • 使用 xcodebuild -list 命令可以列出当前 Xcode 项目中所有的 Scheme 和目标。
      xcodebuild -list -project MyApp.xcodeproj
  • 签名错误

    • 确保你的 Keychain 中有有效的开发者证书和描述文件。
    • -allowProvisioningUpdates-allowProvisioningDeviceRegistration 参数非常有用,它们会在打包过程中自动更新或创建 Provisioning Profile,避免很多手动操作的麻烦。
  • 自动化构建

    在 CI/CD 工具(如 Jenkins, GitLab CI, GitHub Actions)中,通常会将上述脚本放入,并配置好环境变量(如证书密码、Team ID 等)来实现全自动的构建和打包。

  • 仅编译不打包

    • 如果只是想检查代码是否能编译,可以使用 build 动作代替 archive
      xcodebuild -project MyApp.xcodeproj -scheme MyApp build
  • 使用 .xcworkspace (CocoaPods)

    • 如果你的项目使用 CocoaPods,通常会有一个 .xcworkspace 文件,在这种情况下,你需要使用 -workspace 参数而不是 -project
      xcodebuild -workspace MyApp.xcworkspace \
             -scheme MyApp \
             -configuration Release \
             archive \
             -archivePath ./build/MyApp.xcarchive

希望这份详细的指南能帮助你熟练掌握 Xcode 的命令行打包!

分享:
扫描分享到社交APP
上一篇
下一篇