将 xcarchive 转换为 IPA 时出错 - 单包归档 + 缺少 plist 方法值

Errors converting xcarchive to IPA - single-bundle archive + missing plist method values

我正在尝试将我的 xcarchive 转换为 IPA (XCode 7.1.1)。以下命令

xcodebuild 
    -exportArchive -archivePath foo.xcarchive -exportPath . -exportFormat IPA

因错误而失败

the archive at path 'foo.xcarchive' is not a single-bundle archive

由于上面的命令在技术上已被弃用,我也尝试了新的形式:

xcodebuild 
    -exportArchive -archivePath foo.xcarchive -exportPath . 
    -exportOptionsPlist ipa.plist

其中ipa.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>
</dict>
</plist>

然后导致错误:

error: exportArchive: exportOptionsPlist error for key 'method': expected one of {}, but found app-store

现在,为了对此进行调试,我打开了 xcarchive 文件夹并检查了它的结构。我注意到我有一个与 Products\Applications\foo.app 处于同一级别的文件夹,所以我将其删除并再次尝试无济于事(结果相同)。然后我继续从 foo.app 中删除文件,直到我只剩下 DWARF 二进制文件 - 仍然没有雪茄(相同的结果),尽管这可能是因为我通过删除文件弄乱了应用程序签名手动。

由于您创建 IPA 的方式已被弃用,您应该改为执行以下操作:

xcodebuild -scheme "Foo" -configuration Release clean build CODE_SIGN_IDENTITY="iPhone Distribution: Foo Corporation" -derivedDataPath "/path/to/some/folder/"

xcrun -sdk iphoneos PackageApplication "/path/to/some/folder/Build/Products/Release-iphoneos/foo.app" -o "/path/to/some/folder/foo.ipa"

确保将 "Foo" 替换为您的架构名称,并将 "iPhone Distribution: Foo Corporation" 替换为您的签名身份。而“/path/to/some/folder/”应该是一些构建文件夹。

尝试使用绝对路径作为 xcodebuild 选项的参数而不是相对路径。

所以像这样:

xcodebuild -exportArchive -archivePath "$PWD/foo.xcarchive" \
-exportPath "$PWD" -exportOptionsPlist "$PWD/ipa.plist"

只要您的 .xcarchive 完好无损且签名正确,就应该可以。这就是我在我的构建系统中使用的。

在命令行上构建模拟器时,我在 XCode 7.2 中遇到了一些类似的奇怪错误。您可以尝试将 -sdk iphoneos 添加到 xcodebuild 命令(以跳过模拟器构建),或者如果您正在为模拟器构建,则添加 -destination 'platform=iOS Simulator,name=iPhone 6,OS=latest' 之类的内容。

Apple 回复了我一个解决方案。从 Xcode 7 开始,我们应该使用 xcodebuild 而不是 PackageApplication 来生成 .ipa 文件。

xcodebuild 有一个新的 -exportArchive 选项来创建一个更像 Xcode 管理器的 .ipa

所以我们现在应该:

  1. 使用 xcodebuild 存档构建存档

  2. 使用 xcodebuild 创建 .ipa -exportArchive

我们现在这样构建存档:

xcodebuild -workspace myApp.xcworkspace -scheme myApp -sdk iphoneos -configuration AppStoreDistribution archive -archivePath $PWD/build/myApp.xcarchive

我们现在像这样导出.ipa:

xcodebuild -exportArchive -archivePath $PWD/build/myApp.xcarchive -exportOptionsPlist exportOptions.plist -exportPath $PWD/build

这两个命令创建文件 build/myApp.xcarchive 和 build/myApp.ipa

请注意,xcodebuild -exportArchive 需要一个 -exportOptionsPlist 参数,该参数指向带有导出选项的 .plist 文件。有关可以放入该 plist 的内容的完整列表,运行 xcodebuild -help。文件的最少内容如下所示:

<?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>YOUR_TEN_CHARACTER_TEAM_ID</string>
</dict>
</plist>

我最近转而使用 fastlane gym 工具来构建和创建 ipa 文件...我遇到了一个问题,其中一个命令行用于制作临时构建,我需要一个不同的配置来制作应用商店构建但无法解决。 fastlane 的东西几乎开箱即用。

https://github.com/fastlane/gym

问题是我们的 post-build 步骤之一在 TARGET_BUILD_DIR 中留下了一个杂散文件夹。这导致生成的 xcarchive 被格式化为可怕的 通用存档 。我在事后从 xcarchive 本身删除文件夹的尝试注定要失败,因为 xcarchive 在创建时已被标记为 generic(如一些缺失的 Info.plist 字段证明了这一点)。一旦我确定 TARGET_BUILD_DIR 仅包含 .app 在所有构建阶段都说完并完成后,生成的 xcarchive 被正确格式化为 iOS 应用程序归档。反过来,xcarchive 很容易通过 xcodebuild -exportArchive -exportPlistOptions 导出到适当的 IPA,这是官方支持的 Apple 推荐,它处理所有有问题的 SWIFT 支持文件夹等。

路径 foo.xcarchive 的存档不是单包存档。

关于这个错误:

  1. 检查编辑方案 -> 构建
  2. 取消勾选其他目标,包括分析、测试、运行、配置文件、存档
  3. xcodebuild存档
  4. 再次导出存档