40

Xcode 4.1 ビルド 4B110f を使用して、iOS アプリをアップロードできるようにしようとしています。Product|Archive ステップをエラーなしで通過し、何かに署名する許可を 2 回求めます。しかし、オーガナイザーからアーカイブの検証を試みると、失敗します:

### 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 ファイルは本当に不適切なのでしょうか?

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

更新(翌日):

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

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

失敗した Validate の実行からの出力を使用して、失敗した codesign --force ステップと viola! の直前にこの 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のシャットダウンと再起動などを組み合わせて修正したと考えているWeb上の他のすべてのポスターがどこから来たのかわかりません。この修正は迷信よりも科学に有利であり、Xcode 4.1 Build 4B110f とそれに関連する PackageApplication スクリプトの下で機能し、Snow Leopard 10.6.8 と Perl 5.10.0 で動作することを静かに主張します。

4

3 に答える 3

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';
于 2011-12-04T03:56:11.960 に答える
1

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

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

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

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

于 2013-09-02T14:56:07.213 に答える
0

この回避策は長い間実施されていましたが、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
于 2012-04-05T18:34:49.893 に答える