如何在构建 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 错误的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Xcode 6.1 安装 IPA

Xcode 6.0/6.1 并使用客户端的配置文件进行构建

如何从 xcode bot 生成 .ipa?

Xcode:提交失败 - IPA 无效

如何从 xcode 构建 .ipa 并将其安装在 iphone 上?

使用 Xcode 11 构建项目时 IPA 处理失败