web-dev-qa-db-ja.com

Codesignが1(オブジェクトifile形式が無効または不適切)バグを返しました

Xcode 4.1ビルド4B110fを使用して、iOSアプリをアップロードできるようにしています。何かに署名する許可を2回要求し、エラーなしで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回確認しました。上記の出力をシェルスクリプトに変換して、すべての証明書を手動で試すことができるようにしました。毎回同じ結果になります。

たぶん、署名されている.appファイルは本当に不適切ですか?

ちなみに、codesignにはバージョンフラグがありませんが、manページの日付は2006年6月1日です。バイナリのファイル日付は2010年11月20日です。

更新(翌日):

問題を調査すると、codesignには次の環境変数セットが必要であるというあいまいな参照がさらに見つかりました。

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

失敗したValidate実行からの出力を使用して、失敗したcodesign --forceステップとビオラの直前にこの変数をエクスポートするシェルスクリプトを作成しました!コードサインは機能します。

しかし、これはアップロード用のコードの準備にはあまり役立ちません。これを[オーガナイザー検証]ボタンで実行されるスクリプトに含める方法はありますか?

少し後で、解決策!:

理論の下では、Organizer Validate ...の実行中に実行されるすべてのコマンドを生成するスクリプトがどこかにあります。私は、grepを使用して掘り下げて見つけました。スクリプトは確かに存在し、その名前は次のとおりです。

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

これはPerlだけであり、修正は、必要な環境変数を連想配列%ENVの最初、たとえば72行目に追加することです。

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

これで問題は完全に修正されます。証明書の削除、クリーンな構築、シャットダウンの組み合わせによって修正されたと考えているWeb上の他のすべての投稿者がどこにいるのかわかりません。 Xcodeのダウンと再起動などが発生しています。この修正は迷信よりも科学を優先し、Perl5.10.0を搭載したSnowLeopard10.6.8で実行されるXcode4.1 Build 4B110fとそれに関連するPackageApplicationスクリプトで機能することを静かに主張します

40
RonC

これを未回答のリストから削除できるようにするためです。あなたが言ったように、あなたは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';
8
Jon Egeland

Xcodeの最近のバージョンでこれを取得した場合、実際に必要なのはシェル内です。

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

これは、使用しているXcodeのバージョンのcodesign_allocateを使用します。

Xcode-select -switchを実行すると、コマンドラインツールが使用するXcodeのバージョンを更新できます。

1
richardwhiuk

この回避策は長い間実施されていましたが、iOS 5.1SDKを使用してXcode4.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    

この回避策は、Xcode4.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
0
Dan J