如何在构建 IPA 时修复 Xcode 6.1 错误
Posted
技术标签:
【中文标题】如何在构建 IPA 时修复 Xcode 6.1 错误【英文标题】:How to fix Xcode 6.1 error while building IPA 【发布时间】:2014-12-17 08:05:09 【问题描述】:今天刚刚升级到 Xcode 6.1,你猜怎么着:现在我无法使用 TestFlight 桌面应用提交构建。这是我在应用开始构建 IPA 时遇到的错误:
错误:/usr/bin/codesign --force --preserve-metadata=identifier,entitlements,resource-rules --sign 854059d45eed724593debef577a562e1ba96ab55 --resource-rules=/tmp/QYFSJIvu7W/Payload/XX.app/ResourceRules.plist /tmp/QYFSJIvu7W/Payload/XX.app 失败,错误 1。输出: 警告:使用带有选项“resource-rules”的 --preserve-metadata (在 Mac OS X >= 10.10 中已弃用)!警告:--resource-rules 已被 在 Mac OS X >= 10.10 中已弃用! /tmp/QYFSJIvu7W/Payload/XX.app/ResourceRules.plist:无法读取 资源
“支持文章”不知道发生了什么。
这似乎不是 TestFlight 问题,因为在使用 xcrun 或类似工具的 Jenkins 等 CI 环境中也会发生同样的事情。
该应用已经有几个月没有更新了,所以我知道我不应该期待任何更新很快就能解决这个问题。它曾经对我和我的客户非常有效,所以我也不太热衷于放弃它来做其他事情。
任何关于这个错误是什么以及如何解决它的想法将不胜感激。
【问题讨论】:
这似乎不是 TestFlight 问题,因为在 CI 环境中使用 xcrun 命令也会发生同样的事情:xcrun -sdk iphoneos PackageApplication -v <Path_to_App> -o <Path_to_IPA> --sign <Distribution_certificate> --embed <Provisioning_profile>
。使用 Xcode 6.0.1,一切正常。
【参考方案1】:
来自 Alistra 的 answer 为我工作,但我不想更改不属于我的脚本(未来的 Xcode 版本可能会更改此文件并且更正将会丢失)。
diff PackageApplication PackageApplicationFixed 155,157c155,156 <- my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements,resource-rules", <- "--sign", $optsign, <- "--resource-rules=$destApp/ResourceRules.plist"); --- -> my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements", -> "--sign", $optsign);
我认为来自 Vladimir Grigorov 的 answer 是最好的,如果你有一个存档使用:
xcodebuild -exportArchive -archivePath [path to archive] -exportPath [path to output directory] -exportOptionsPlist [path to options.plist file]
就我而言,我没有存档,因为我在构建后修改了应用程序,并且需要更改 Bundle Id 和签名证书。
我找到的解决方案是在使用PackageApplication
之前自己打电话给codesign
并要求PackageApplication
不要签名。像这样:
replace :
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "<app_path>" -o "<ipa_path>" --sign "<provisioning_profile.certificateSubject>" --embed "<provisioning_profile.path>"
by :
/bin/cp -rpfv "<provisioning_profile.path>" "<app_path>/embedded.mobileprovision"
/usr/bin/codesign -v -vvvv -f -s "<provisioning_profile.certificateSubject>" --entitlements="<entitlement_path>" "<app_path>"
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "<app_path>" -o "<ipa_path>"
别忘了嵌入 .mobileprovision
文件,使用 cp
签名。
【讨论】:
【参考方案2】:Tim Gostony 的answer 自 Xcode 7 发布以来不再有效。现在,当存在资源规则时,App Store 提交过程会失败。解决方案是清除您的代码签名资源规则路径并将 xcrun 替换为 xcodebuild 工具:
xcodebuild -exportArchive -archivePath [path to archive] -exportPath [path to output directory] -exportOptionsPlist [path to options.plist file]
用于导出临时分发 ipa 文件的最简单的 Options.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>iCloudContainerEnvironment</key>
<string>Production</string>
<key>teamID</key>
<string>[YOUR TEAM ID]</string>
<key>method</key>
<string>ad-hoc</string>
</dict>
</plist>
对于这个 plist 文件还有其他可用的选项,涉及位码、应用程序细化等。这就是为什么我认为 xcodebuild 工具是为 ios 9 及更高版本导出 ipa 文件的正确工具。
有关选项 plist 的更多详细信息可通过 xcodebuild -help 命令获得。
【讨论】:
感谢 Vladimir,我对它与 Xcode 7 提交的冲突感到非常困惑。 究竟是如何替换 xcrun 的?我在 Jenkins Xcode 插件中看不到任何设置:(【参考方案3】:在带有 XCode 6.4 的 Yosemite 上,即使使用 SDKROOT 补丁,代码设计也会失败。下面的文章解释了如何修补 XCode 脚本来解决这个问题。请注意,这是修补 XCode,因此它是特定于版本的,但可以解决问题。
http://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts
【讨论】:
【参考方案4】:PackageApplications 的以下补丁为我修复了它,我删除了资源规则,因为它说它在 10.10 已弃用。
Testflight 构建工作没有它。 Appstore 也在构建。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
% diff PackageApplication PackageApplicationFixed
155,157c155,156
< my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements,resource-rules",
< "--sign", $optsign,
< "--resource-rules=$destApp/ResourceRules.plist");
---
> my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements",
> "--sign", $optsign);
【讨论】:
从 PackageApplication 中删除了不推荐使用的流氓参数,并且 buildozer 现在为 iOS 构建了我的 Python 应用程序 很好的修复!非常感谢 :) 上面的“代码签名资源规则路径”设置并没有解决我的问题,但这个答案确实解决了,而且修复现在在所有项目中都是全局的 :) @IanEllis:请告诉我您是如何从 PackageApplication 中删除“resource-rules”参数的。会有很大帮助的!! 这是一个修复 PackageApplication 的单行程序: perl -p -i'Orig' -e 'BEGINundef $/; s/,resource-rules(.*sign).*ResourceRules.plist "/$1/smg' "/Applications/Xcode6.1.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication" (调整你的路径)和一个完整的脚本来应用这个:bitbucket.org/WeWantToKnow/xcode_scripts/raw/…使用:xcode_fix_PackageApplicationResourceRules.sh /Applications/Xcode6.1.1.app 这是正确答案。构建设置答案强制使用已弃用的 API。【参考方案5】:如another answer 中所述,您也可以不指定要签名的分发证书,它会正确打包。 TestFlight 需要更新他们的应用才能执行此操作。
【讨论】:
【参考方案6】:我希望我知道为什么它有效,但 here's a fix 对我有效:
找到了解决办法!
单击您的项目 > 目标 > 选择您的目标 > 构建设置 >
Code Signing Resource Rules Path
并添加:
$(SDKROOT)/ResourceRules.plist
【讨论】:
谢谢!坦率地说,我不在乎它为什么会起作用 :) 只是苹果公司在过去几个月里打破了他们的大连败的最新情况。无论如何,感谢您指出解决方案。 (对于我在发布之前没有彻底查找错误的反对意见) 如果您通过脚本或命令行编辑 xcodeproj 设置,CODE_SIGN_RESOURCE_RULES_PATH 是变量名。 developer.apple.com/library/ios/recipes/… 我在构建设置中看不到Code Signing Resource Rules Path
。有什么想法吗?
确保您选择了 ALL 而不是 BASIC 设置(“常规、功能、信息、构建设置等”下面的行)
显然这会让你的应用被拒绝:***.com/questions/26488077/…【参考方案7】:
我通过电子邮件发送了 TestFlight 支持并收到了以下回复:
我们的团队目前正在使用 TestFlight 桌面应用调查此问题。同时,请使用 Xcode 创建 IPA 文件,然后使用桌面应用程序或 TestFlight 网站上传。
建议的解决方法确实有效。
【讨论】:
我只需要使用 Xcode 制作 .ipa,然后通过桌面应用程序上传即可。 @livingtech 是的,但是我也得到了可怕的“Xcode 生成一个新的配置文件而不是选择我想要的配置文件”-bug :) 使用 testflight 直接上传非常棒。以上是关于如何在构建 IPA 时修复 Xcode 6.1 错误的主要内容,如果未能解决你的问题,请参考以下文章