Codesign返回1(对象ifile格式无效或不适合)错误

时间:2011-09-15 04:25:18

标签: ios xcode codesign

我正在使用Xcode 4.1 build 4B110f尝试让我的iOS应用程序准备好上传。它通过了Product | Archive步骤,没有任何错误,要求两次获得签名的权限。但是,当我尝试从管理器验证存档时,它会失败:

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

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

我还检查了3次验证是否正在使用“生产”证书,生成存档的代码签名步骤也是如此。我甚至将上面的输出变成了一个schell脚本,所以我可以手动尝试所有证书:每次都有相同的结果。

签名的.app文件真的不合适吗?

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

更新(第二天):

研究问题进一步发现了一个模糊的参考文献,称代码签名需要以下环境变量集:

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

使用失败的Validate运行的输出,我创建了一个shell脚本,它在失败的codesign --force步骤和中提琴之前导出了这个var!协同设计有效。

但这并不能帮助我准备上传代码。有没有办法将其包含在由管理器验证按钮运行的脚本中?

还有一点点,解决方案! :

根据理论,有一个脚本可以生成在管理器验证...运行期间运行的所有命令,我用grep和find进行了一些挖掘。该脚本确实存在,它的名字是:

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

它只是Perl,修复方法是在开始时将所需的环境变量添加到关联数组%ENV中,比如第72行:

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

这完全解决了这个问题。 我不知道网络上所有其他海报的哪些人认为他们通过删除证书,构建清理,关闭和重新启动的组合来修复它Xcode等等来自。我只是默默地断言这个修复偏爱科学而不是迷信,并且在Xcode 4.1 Build 4B110f及其相关的PackageApplication脚本下运行,在Snow Leopard 10.6.8下使用Perl 5.10.0运行

3 个答案:

答案 0 :(得分:8)

这样就可以取消未答复的清单。如您所说,您需要将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';

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

我已经将此解决方法用了很长时间,但在使用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构建的二进制文件,似乎没有必要使用此解决方法。为了解决这个问题,我更新了我的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