建立IPA时发生Xcode 6.1错误


140

今天刚刚升级到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。输出:警告:--preserve-metadata与选项“ resource-rules”一起使用(在Mac OS X> = 10.10中已弃用)!警告:--resource-rules在Mac OS X> = 10.10中已被弃用!/tmp/QYFSJIvu7W/Payload/XX.app/ResourceRules.plist:无法读取资源

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

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

该应用程序已经几个月没有更新了,所以我知道我不应该期望有任何更新可以很快解决此问题。过去,它对我和我的客户来说都非常有效,所以我也不是很想放弃其他东西。

任何有关此错误的内容以及解决方法的想法都将不胜感激。


4
它似乎不是TestFlight的问题,因为使用xcrun命令在CI环境中会发生相同的事情,如下所示:xcrun -sdk iphoneos PackageApplication -v <Path_to_App> -o <Path_to_IPA> --sign <Distribution_certificate> --embed <Provisioning_profile>。使用Xcode 6.0.1,一切正常。
丹尼尔·马丁

Answers:


312

我希望我知道它为什么起作用,但是下面的修复对我有用:

找到了解决办法!

单击项目>目标>选择目标>构建设置>

Code Signing Resource Rules Path

并添加:

$(SDKROOT)/ResourceRules.plist


7
谢谢!坦率地说,我不在乎它为什么起作用:)只是最近几个月苹果在其巨大的连环亏损中所打破的最新消息。无论如何,感谢您指出解决方案。(和我的一个downvote不查找错误之前发布彻底)
Şafak基色

10
如果您通过脚本或命令行编辑xcodeproj设置,则CODE_SIGN_RESOURCE_RULES_PATH是变量名。developer.apple.com/library/ios/recipes/...
roblocop

5
Code Signing Resource Rules Path在“构建设置” 中看不到。任何想法?
乔治2014年

7
确保选择全部而不是基本设置(“常规,功能,信息,构建设置等”下面的行)
2014年

显然,这将让你的应用程序被拒绝:stackoverflow.com/questions/26488077/...
格伦·梅纳德·

61

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

从PackageApplication中删除了不赞成使用的恶意参数,buildozer现在为iOS构建我的Python应用程序
Ian Ellis

很好的解决!非常感谢:)上面的“代码签名资源规则路径”设置不能解决我的问题,但是此答案可以解决,而且此解决方案现在在所有项目中都是全局的:)
Pellet 2014年

@IanEllis:能否让我知道您是如何从PackageApplication中删除“ resource-rules”参数的。这将有很大的帮助!
Rashmi Ranjan mallick

8
这是修复PackageApplication的一个衬垫:perl -p -i'Orig'-e'BEGIN {undef $ /;} s /,resource-rules(。* sign})。* ResourceRules.plist“ / $ 1 / smg'” /应用程序/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
coffeebreaks 2015年

这是正确的答案。构建设置答案将强制使用已弃用的API。
詹姆森2015年

10

我通过电子邮件发送给TestFlight支持人员,并收到以下回复:

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

建议的解决方法确实起作用。


1
它对我来说只是用Xcode制作.ipa,然后通过桌面应用上传。
livingtech

@livingtech是的,但是我也很害怕“ Xcode生成一个新的配置文件,而不是选择我想要的配置文件” -bug :)使用testflight上传直接效果非常好。
helmesjo 2014年

10

自从Xcode 7发布以来,Tim Gostony 的答案不再起作用。现在,如果存在资源规则,则App Store提交过程将失败。解决方案是清除代码签名资源规则路径,并用xcodebuild工具替换xcrun:

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文件的正确工具的原因。

xcodebuild -help命令提供了有关选项plist的更多详细信息。


感谢Vladimir,我对此感到非常困惑,因为它与Xcode 7提交冲突。
凯文·

您如何完全替换xcrun?我在Jenkins Xcode插件
中看


1

Alistra 的答案对我有用,但我不想更改不是我的脚本(将来的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]

在我的情况下,我没有存档,因为我在构建应用程序后对其进行了修改,并且需要更改捆绑ID和签名证书。

我发现的解决方案是codesign在使用前给自己打电话PackageApplication,要求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


0

正如在另一个答案中指定的那样,您也可以不指定要签名的分发证书,它可以正确打包。TestFlight将需要更新其应用程序才能执行此操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.