如何修复在构建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选项与“资源规则”一起使用的用法(在Mac OS X >= 10.10中不推荐使用)!警告:--resource-rules在Mac OS X>=10.10中已被弃用!/tmp/QYFSJIvu7W/Payload /XX.app/ResourceRules.plist:无法读取资源

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

这似乎不是TestFlight的问题,因为使用xcrun或类似工具的CI环境(例如Jenkins)也会出现同样的问题。

应用程序多个月没有更新,所以我知道不应该指望有任何更新来修复这个问题。它曾经对我和我的客户非常有效,所以我不太愿意放弃它换别的。

如果有任何关于此错误是什么以及如何解决它的想法,将非常感激。


4
这似乎不是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中一切正常。 - Daniel Martín
7个回答

312

我希望知道为什么它起作用,但是这里有一个解决方法适用于我:

找到解决方法!

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

代码签名资源规则路径

然后添加:

$(SDKROOT)/ResourceRules.plist


7
谢谢!坦率地说,我不关心它为什么有效 :) 只是苹果在过去几个月的失败大串中所破坏的最新内容。无论如何,感谢您指出了解决方案。(因为在发布之前没有彻底查找错误,所以请给我一个踩) - Şafak Gezer
10
如果你是通过脚本或命令行编辑你的 xcodeproj 设置,那么 CODE_SIGN_RESOURCE_RULES_PATH 就是该变量的名称。详见:https://developer.apple.com/library/ios/recipes/xcode_help-project_editor/Articles/Getting%20Information%20on%20a%20Build%20Setting.html#//apple_ref/doc/uid/TP40010155-CH6-SW1 - roblocop
5
我的 Build Settings 中找不到“Code Signing Resource Rules Path”选项,有什么想法吗? - Georg
7
请确保您选择的是“全部(ALL)”而不是“基本(BASIC)”设置(位于“常规、功能、信息、构建设置等”下方的行)。 - A.S.
@Alistra的答案对我很有效,它可以防止执行弃用的选项。我只是用TextWrangler手动编辑了一下,结果完美无缺。 - Gian Franco Zabarino
显示剩余3条评论

61

以下是 PackageApplications 的补丁,对我有用。我去掉了 resource-rules,因为它在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});

8
这是一个用于修复PackageApplication的一行代码:perl -p -i'Orig' -e 'BEGIN{undef $/;} s/,resource-rules(.*sign}).*ResourceRules.plist"/$1/smg' "/Applications/Xcode6.1.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication"(请根据您的路径进行调整)这里有一个完整的脚本可供使用:https://bitbucket.org/WeWantToKnow/xcode_scripts/raw/4d252906062afc00f3c61e534b2c7810288bf0f1/xcode_fix_PackageApplicationResourceRules.sh使用方法:xcode_fix_PackageApplicationResourceRules.sh /Applications/Xcode6.1.1.app - coffeebreaks
这是正确的答案。构建设置答案强制使用已弃用的API。 - Jameson
我刚刚安装了 Xcode 6.4,惊喜!惊喜!这个问题仍未修复。我不得不重新应用上面的差异。 - JimClarke
以上方法适用于此问题。然后,iTunesConnect 发送了“无效的 Swift 支持”电子邮件。如此处苹果开发者论坛所述。最终我使用了bq的脚本。 - skitheo
谢谢@Alistra和@coffeebreaks!我现在已经将xcode_fix脚本放在了我的个人bin目录中。 - bmauter
显示剩余5条评论

10

我给TestFlight支持团队发了邮件,收到了如下回复:

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

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


1
对我来说,只需使用Xcode制作.ipa文件,然后通过桌面应用程序上传即可。 - livingtech
@livingtech 是的,不过我也遇到了可怕的“Xcode生成新配置文件而不是选择我想要的那个”的错误 :) 直接使用TestFlight上传非常顺利。 - helmesjo

10

自从发布Xcode 7以来,Tim Gostony的答案已经不再适用。现在,当存在资源规则时,应用商店提交过程将失败。解决方法是清除您的代码签名资源规则路径,并使用xcodebuild工具替换xcrun:

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

最简单的Options.plist文件用于导出Ad-hoc分发的ipa文件,如下所示:

<?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提交存在冲突。 - kevinl
你如何替换xcrun?我在Jenkins Xcode插件中没有看到任何相关设置 :( - Hlung

3

2

对我来说,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]
在我的情况下,我没有存档,因为我在构建应用程序后修改了它,并且需要更改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文件以进行签名。

1

另一个答案中所指定的那样,您也可以不指定分发证书进行签名,它会正确地打包。TestFlight需要更新他们的应用程序才能实现此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接