将 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
。
所以我们现在应该:
使用 xcodebuild 存档构建存档
使用 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 的东西几乎开箱即用。
问题是我们的 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
的存档不是单包存档。
关于这个错误:
- 检查编辑方案 -> 构建
- 取消勾选其他目标,包括分析、测试、运行、配置文件、存档
xcodebuild
存档
- 再次导出存档
我正在尝试将我的 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
。
所以我们现在应该:
使用 xcodebuild 存档构建存档
使用 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 的东西几乎开箱即用。
问题是我们的 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
的存档不是单包存档。
关于这个错误:
- 检查编辑方案 -> 构建
- 取消勾选其他目标,包括分析、测试、运行、配置文件、存档
xcodebuild
存档- 再次导出存档