构建IPA时出现Xcode 6.1错误

时间:2014-10-21 23:06:52

标签: build code-signing ipa xcode6.1

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

The error

  

错误:/ usr / bin / codesign --force   --preserved-metadata = identifier,entitlements,resource-rules --sign 854059d45eed724593debef577a562e1ba96ab55   --resource规则= / TMP / QYFSJIvu7W /有效载荷/ 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环境中也会发生同样的事情。

该应用程序几个月没有更新,所以我知道我不应该期待任何更新来解决这个问题。它过去对我和我的客户来说非常好用,所以我并不是真的热衷于放弃其他东西。

关于此错误的内容以及如何解决此问题的任何想法都将非常感激。

7 个答案:

答案 0 :(得分:312)

我希望我知道为什么它有效,但here's a fix对我有用:

  

找到修复程序!

     

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

     

Code Signing Resource Rules Path

     

并添加:

     

$(SDKROOT)/ResourceRules.plist

答案 1 :(得分:60)

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});

答案 2 :(得分:10)

我通过电子邮件发送了TestFlight支持并获得了此回复:

  

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

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

答案 3 :(得分:10)

自从Xcode 7发布以来,Tim Gostony的answer不再有效。现在,当存在资源规则时,App Store提交过程失败。解决方案是清除代码签名资源规则路径并用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文件还有其他选项可用于bitcode,app thinning等。这就是为什么我认为xcodebuild工具是导出iOS 9及更高版本的ipa文件的正确工具。

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

答案 4 :(得分:2)

在Yosemite w / XCode 6.4上,即使使用SDKROOT补丁,代码签名也会失败。下面的文章解释了如何修补XCode脚本以解决此问题。请注意,这是修补XCode,因此它是特定于版本的,但修复了问题。

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

答案 5 :(得分:1)

Alistra的answer为我工作,但我不想更改不属于我的脚本(未来的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});

我认为弗拉基米尔·格里戈罗夫的answer是最好的,如果你有一个档案使用:

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

在我的情况下,我没有存档,因为我在构建之后修改了应用程序,我需要更改Bundle 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文件。

答案 6 :(得分:0)

another answer中所述,您也可以不指定要签名的分发证书,它将正确打包。 TestFlight需要更新他们的应用程序来执行此操作。