代码签名返回1(对象ifile格式无效或不合适)错误

我正在使用Xcode 4.1 build 4B110f试图让我的iOS应用程序准备上传。 它通过产品|存档步骤没有错误,要求两次签署许可。 但是,当我从组织者尝试validation存档时,它失败:

### Codesigning '/Users/uqrchern/Library/MobileDevice/Provisioning Profiles/70D2381D-3733-4F5D-88B2-4729572C2864.mobileprovision' with 'iPhone Distribution: Ron Chernich' + /usr/bin/codesign --force --preserve-metadata --sign iPhone Distribution: Ron Chernich --resource-rules=/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app/ResourceRules.plist --entitlements /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/entitlements_plistrZ1Vwko6 /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app Program /usr/bin/codesign returned 1 : [/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app: replacing existing signature /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app: object file format invalid or unsuitable ] error: codesign failed with error 1 

我已经看过所有类似的问题和解决scheme(其中一些没有任何意义,或适用于真正的旧版本的工具)。 没有丝毫的差别。

我也检查了3次,validation是使用“生产”证书,就像产生档案的编码步骤一样。 我甚至把上面的输出变成了一个schell脚本,所以我可以手动尝试所有的证书:每次都是一样的结果。

也许被签名的.app文件真的不合适?

顺便提一句,codesign没有版本标志,但手册页date为2006年6月1日。该二进制文件的date为2010年11月20日。

更新(第二天):

进一步研究这个问题后,发现一个晦涩难懂的说法,认为编码需要下面的环境variables集合:

 CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate 

使用失败的Validate运行的输出,我创build了一个shell脚本,在失败的codeign –force步骤和viola之前导出这个var! 编码工作。

但是这并不能帮助我准备上传的代码。 有没有办法将这个包含到组织者validationbutton所运行的脚本中?

一点点,解决scheme!

根据这个理论,有一个脚本可以在一个Organizer Validate …运行期间生成所有的命令,我使用grep进行了一些挖掘并且find了。 脚本确实存在,它的名字是:

 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication 

这只是Perl,修复就是在开始时将所需的环境variablesvar添加到关联数组%ENV中,如72行所示:

 $ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate'; 

这完全解决了这个问题。 我不知道在networking上的所有其他海报谁认为他们通过删除证书,build立清洁,closures和重新启动Xcode等等的组合来解决它的海报。 我只是悄悄地声称,这个修复有利于科学而不是迷信,在Xcode 4.1 Build 4B110f及其相关的PackageApplication脚本下工作,在Snow Leopard 10.6.8和Perl 5.10.0下运行

只是为了使这个可以从没有答复的列表中删除。 就像你说的,你需要将CODESIGN_ALLOCATE添加到$ENV数组中:

 $ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate'; 

如果大家在这里一致的话,我想这个问题终于可以结束了。

当使用更新版本的Xcode时,默认位置是:

 $ENV{CODESIGN_ALLOCATE} = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate'; 

如果你在最近版本的Xcode上得到这个,你真正想要的是在shell中:

 export CODESIGN_ALLOCATE=`xcode-select -print-path`/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate 

它将使用您正在使用的Xcode版本中的codesign_allocate。

您可以通过运行xcode-select -switch来更新命令行工具使用的Xcode版本

我有这个解决方法很长一段时间,但升级到iOS 5.1 SDK的Xcode 4.3后,我的签名脚本(它调用codesign )停止工作, cannot find code object on disk错误:

 output/Enterprise/Payload/MyProduct.app/MyProduct: replacing invalid existing signature output/Enterprise/Payload/MyProduct.app/MyProduct: cannot find code object on disk Code signing failed, not creating .ipa file 

看来这个解决方法对于使用Xcode 4.3构build的二进制文件来说是不必要的。 为了解决这个问题,我更新了我的bash脚本,在导出之前检查它是否存在:

  # Only export the environment variable if the location exists, # otherwise it breaks the signing process! if [ -f "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate" ] then echo Export environment variable for codesign_allocate location export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate fi