在构建 IPA 时如何修复 Xcode 6.1错误

今天刚刚升级到 Xcode 6.1,你猜怎么着: 现在我在使用 TestFlight 桌面应用程序提交构建时遇到了麻烦。下面是我在应用程序开始构建 IPA 时遇到的错误:

The error

Error:/usr/bin/codesign —— force 错误:/usr/bin/codesign —— force —— keep-meta = Identider,entiments,resource-rules —— sign 854059d45eed724593debef577a562e1ba96ab55 —— resource-rules =/tmp/QYFSJIvu7W/Payload/XX.app/ResourceRules.plist /tmp/QYFSJIvu7W/Payload/XX.app 失败,错误1。输出: 警告: 使用“ resource-rules”选项来保存元数据 (在 Mac OS X > = 10.10中弃用) ! 警告: —— resource-rules has been 在 Mac OS X 中弃用 > = 10.10! /tmp/QYFSJIvu7W/Payload/XX.app/ResourceRules.plist: 无法读取 资源

“支持文章”不知道发生了什么。

这似乎不是一个 TestFlight 问题,因为在类似于 Jenkins 使用 xcrun 或类似工具的 CI 环境中会发生同样的事情。

这个应用程序已经几个月没有更新了,所以我知道我不应该期待任何更新来解决这个问题。它曾经对我和我的客户非常有效,所以我也不想为了别的东西而放弃它。

如果您能告诉我们这个错误是关于什么的,以及如何修复它,我们将不胜感激。

40467 次浏览

我给 TestFlight 支持部门发了邮件,得到了这样的回复:

我们的团队目前正在使用 TestFlight 桌面应用程序调查这个问题。同时,请使用 Xcode 创建 IPA 文件,然后使用桌面应用程序或 TestFlight 网站上传它。

建议的解决办法确实有效。

我希望我知道 为什么它工作,但 有个办法为我工作:

找到解决办法了!

点击你的项目 > 目标 > 选择你的目标 > 构建设置 >

Code Signing Resource Rules Path

然后加上:

$(SDKROOT)/ResourceRules.plist

正如在 另一个答案中指定的那样,您也可以不指定要签名的分发证书,它将正确地打包。TestFlight 需要更新他们的应用程序来做到这一点。

下面的 PackageApplications 补丁为我修复了这个问题,我删除了资源规则,因为它在10.10版本中已经废弃了。

没有它,测试飞行可以工作,应用商店也可以。

/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", $opt{sign},
<                          "--resource-rules=$destApp/ResourceRules.plist");
---
>     my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements",
>                          "--sign", $opt{sign});

在 Yosemite w/XCode 6.4上,即使使用 SDKROOT 补丁,协同设计也会失败。下面的文章解释了如何修补 XCode 脚本以绕过这个问题。请注意,这是修补 XCode,因此它是版本特定的,但修复了问题。

Http://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts

Tim Gostony 的 回答在 Xcode 7发布后就不再工作了。现在,当资源规则存在时,AppStore 提交过程将失败。解决方案是清除代码签名资源规则路径,并用 xcodebuild 工具替换 xcrun:

xcodebuild -exportArchive -archivePath [path to archive] -exportPath [path to output directory] -exportOptionsPlist [path to options.plist file]

最简单的用于导出 ad-hoc 发行版 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 工具是导出 iOS9及以上版本的 ipa 文件的正确工具。

通过 xcodebuild-help 命令可以获得关于选项 plist 的更多详细信息。

来自 Alistra 的 abc0对我有用,但我不想改变一个不是我的脚本(未来的 Xcode 版本可能会改变这个文件,修正将丢失)。

 diff PackageApplication PackageApplicationFixed 155,157c155,156
<-     my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements,resource-rules",
<-                          "--sign", $opt{sign},
<-                          "--resource-rules=$destApp/ResourceRules.plist");
---
->     my @codesign_args = ("/usr/bin/codesign", "--force", "--preserve-metadata=identifier,entitlements",
->                          "--sign", $opt{sign});

我认为 Vladimir Grigorov 的 回答是最好的,如果你有一个使用:

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>"

不要忘记嵌入用于与 cp签名的 .mobileprovision文件。