2010年6月22日火曜日

iPhoneのCode Signingエラーを何とかする

三森です。今日はさっき遭遇したiPhone開発のトラブル・シューティングについて書きます。
他の人にもらったiPhoneのプロジェクトファイルを自分の実機にインストールするとき

Code Signing Identity 'Erica Sadun' does not match any valid, non-expired, code-signing certificate in your keychain.

のようなエラーが出ることがあります。ちなみに上のエラーは、iPhoneハックの女王エリカ様のサンプルコードをコンパイルしようとした時のものです。
このエラー対策をググると、XCodeのメニューでコード署名IDを自分のものに直せばいいのだという情報を見つけました。しかし自分の場合はそこを変えただけではうまくいかなかったので、直接プロジェクトファイルを見てみました。
プロジェクトファイルは拡張子.xcodeprojですが、これは実はディレクトリーになっていて、その中のproject.pbxprojというファイルにビルド設定などが含まれているようです。右クリックして「パッケージの中身を表示」で以下のように開けます。



project.pbxprojはテキストエディットなどで見ます。すると以下のような行があります。


"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Erica Sadun";

このCODE_SIGN_IDENTITYというところがエラーの原因でした。自分の実機に入れるときはここを

"CODE_SIGN_IDENTITY" = "iPhone Developer";

に変更すれば動くようになります。本来はメニューから変えられるはずなのでXCodeのバグかもしれません。

ところで、エリカ様のサンプル・プロジェクトは実に沢山あるので、いちいち直していくのは面倒です。なのでバッチを書きました。別にエリカ様のサンプルでなくても使えます。

USAGE:

$ sh modify_code_sign.sh <ディレクトリー>

として使うと、<ディレクトリー>以下全てのproject.pbxprojファイルのCODE_SIGN_IDENTITYを書き換えます。元ファイルに上書きするので一応使用前にバックアップしてください。もし壊れても責任は負えません:-)

以下、ソースです。

#!/bin/sh
#This file is modify_code_sign.sh

SPACE_ESCAPE="\*SPACE\*" #ファイル名の一時変更(for対策)
REPLACE=CODE_SIGN_IDENTITY
FILES=$(find $1 -name project.pbxproj | sed "s/ /$SPACE_ESCAPE/g")
for FILE in $FILES; do
FILE=$(echo "$FILE" | sed "s/$SPACE_ESCAPE/ /g")
echo $FILE
CONTENT=$(cat "$FILE" | awk 'BEGIN {c=1} /'$REPLACE'/ {if (c==1){c=0; print "CODE_SIGN_IDENTITY = \"iPhone Developer\";";}} !/'$REPLACE'/ {print $0}')
echo "$CONTENT" > ${FILE}
done

1 件のコメント:

  1. ؛spɹɐƃǝɹ ʇsǝq

    ˙ǝʇısqǝʍ ɹno oʇ oƃ uɐɔ noʎ 'ʇuoɟ ǝnbıun puıɟ oʇ pǝǝu noʎ ɟı
    'ʎɐʍ ǝɥʇ ʎq

    ˙ƃoןq ǝɔıu ɐ ǝʌɐɥ noʎ
    ¡ƃuıʇǝǝɹƃ ɯɹɐʍ ¿noʎ ǝɹɐ ʍoɥ ¡oןןǝɥ

    返信削除