Apple iPhone 3GとiPhone SDKを使ってアプリケーションを開発、公開するための情報。

ホーム / Hardware / iPhone SDK

更新:11/10/02 | iPhone SDKトラブルシューティング | iPhone SDK Tech

複雑な仕組み

Xcodeの開発環境Appleの強烈な囲い込みの弊害として、複雑なアプリケーション、開発環境の管理が産まれてしまいました。
開発者は登録はもとより認証キーの生成、インストール、デバイスの登録、プロビジョニングファイルの展開、ビルド時の認証キー設定、これらの総合的な意識をしなければならなくなりました。こうした弊害の結果、本来の開発とは異なるポイントで問題を生じることも少なくありません。弊害をどう解決するのかをまとめてみました。

 

認証キーがらみのエラー

最も多いのが認証キーがらみのエラーではないでしょうか。

Checking Dependencies
Code Signing Identity 'iPhone Developer' does not match any valid, non-expired, code-signing certificate in your keychain.

これは、開発用のMacに指定された証明書が見つからないというエラーです。有料のADCメンバー契約を結ぶとiPhone Developer Program Portalから自分専用の証明書を発行し、ダウンロード・インストールできるようになります。

この証明書とプロビジョニングファイルがないと実機にはインストールできないのです。無料のADCメンバーは、シミュレーター上でのデバッグに限られると言うことになります。

Checking Dependencies
Code Signing Identity 'iPhone Developer: Taro Yamada' does not match any valid, non-expired, code-signing certificate in your keychain.

恐らく、iPhone OS ver3.0をインストールしてからだと思うのですが、正しく証明書もインストールされているにも関わらず同様のエラーが出るようになりました。

証明書を再インストールしても、常に信頼するを指定してもXCodeの証明書選択欄には一覧に何も表示されません。手書きで指定してもエラーが変わらず出ます。

結局、iPhone OS ver3.0とXCode3.1.3 Preview(iPhone OS ver3.0と一緒に配布されている)の組み合わせだと実機へのビルド、AppStore向けのビルドに失敗することが分かりました。
XCodeを3.1.2に戻したところ、正常にProvisioning Fileと対になっている証明書を認識するようになりました。しかし、今度はオーガナイザからiPhone OS ver3.0のiPhoneを認識できなくなってしまいました。
オーガナイザから認識されないと、新しくプロビジョニングファイルを登録することが出来ません。iPhone OS ver3.0をインストールしたiPhoneにプロビジョニングファイルをインストールするにはXCode3.1.3 Previewが必要となります。
インストール先を変えてXCode3.1.2と、3.1.3 Previewの両方を起動できるようにしておくのが正解ということになります。
iPhoneアプリケーションのインストールエラー
しかし、いずれにしてもビルドは出来ますがiPhone OS ver3.0がインストールされた実機にアプリケーションをインストールすることは出来ません。
このように、供給されたiPhone OSデバイスが接続されていません。とエラーになります。但し、Distributionを含めビルドは出来ますので最低限の開発作業は可能です。

何故かフラグの値が想定外の値になっているときがある

準備中。

デバッグ要のユーザーログ出力

デバッグというとVB(というよりもMS-BASIC)などのインタプリタ寄りの言語やデバッグ方法に慣れている人は、ブレークポイントやステップ実行によるデバッグをしてしまいがちですが、オブジェクト指向、マルチスレッドプログラミングなどになるとこうした手法でのデバッグでは太刀打ちできません。

また、モバイルとはいえ一昔前のパソコン並みの性能を持っていますから少し大きめのプロジェクトになると一瞬で相当量の動きをするのでいちいち目で動きを追っていては日が暮れてしまいます。

そこで、定常的にユーザーログを標準出力に表示させる方法が分かり易いのでお勧めです。幾つかの方法がありますが、私が現在用いている方法は以下のコードを(基本的に)全てのメソッドの冒頭に挿入するという方法です。

#if kShouldPrintLog
NSLog(@"@%@ : [%s]", [self class], _cmd);
#endif

これによって、当該のメソッドが実行される際には1行クラス名、メソッド名が出力されるようになります。

メリット:コピー&ペーストで良いのでログ出力の実装が楽。
デメリット:引数が出力されない。
課題:3行必要。Xcode4ではビルド時にWarningとなる(!)

これによってバックトレースが取れない不正終了などでも、ログを見ればどのクラスのどのメソッドでとどめが刺されたかを大体突き止められます。

iPhoneローカルにログメッセージを出力する

複数のメンバー、テスターなどが存在していたり、実機を持ち歩いた状態ででテストを行いたい場合、前項のログを取得できず大変不便な自体となります。

レアな障害を捉えられたのにログもバックトレースも無しでは解析のしようもありません。そこで、標準出力の代わりにiPhoneのローカルにASCIIファイルとしてログを出力し、メールなどで送信できるようにする方法を紹介します。

UIは適当に実装してもらうとして、少なくとも1つのボタン(UIBUtton)を用意します。このボタンの役割は次の通りです。

・ログファイルを削除し、古いログデータをクリアする。
・ログの出力先をローカルファイルに切り替える。

- (BOOL)deleteLogFile {

[self finishLog];
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:[self loggingPath] error:nil]; [self startLog];
return success;

}

このように、ボタンが押されるとログファイルを閉じて、削除し、ログをファイルに出力開始するという仕組みです。

- (void)finishLog {

fflush(stderr);
dup2(dup(STDERR_FILENO),
STDERR_FILENO); close(dup(STDERR_FILENO));

}

- (NSString*)loggingPath {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];

return logPath;

}

- (void)startLog {
freopen([[self loggingPath] cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);

}

非常に簡便なコードなのですが、この手の紹介を見たことがありません。
因みに、メール送信画面に引き渡す場合は次のようにすればOKです。

- (void)sendLogByMail {

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self;

[picker setSubject:[NSString stringWithFormat:@"%@ - Log", [self appName]]];
NSString *message = [NSString stringWithContentsOfFile:[self loggingPath] encoding:NSUTF8StringEncoding

error:nil];

[picker setMessageBody:message isHTML:NO];
[self.navigationController presentModalViewController:picker animated:YES]; [picker release];

}


 

 
コメント・フィードバック
ダウンロード
ストリーミング関連
Macintosh関連
Windows関連
メディアなど
 
ハードウェア
ソフトウェア/サービス/開発SDK
デジタル一眼レフカメラ
趣味関連
ゲーム 〜楽しいゲームの紹介や攻略法
RoverMNI(ローバーミニ) 
雑記
その他
Copyright (c)1998-2016 CNXGROUP All Rights Reserved.
このページの全部あるいは一部を無断で利用(コピー)することを禁じます。
>