Apple iPhone 3GとiPhone SDKを使ってアプリケーションを開発、公開するための情報。
更新:11/10/02 | iPhone SDKトラブルシューティング | iPhone SDK Tech
複雑な仕組み
Appleの強烈な囲い込みの弊害として、複雑なアプリケーション、開発環境の管理が産まれてしまいました。
	開発者は登録はもとより認証キーの生成、インストール、デバイスの登録、プロビジョニングファイルの展開、ビルド時の認証キー設定、これらの総合的な意識をしなければならなくなりました。こうした弊害の結果、本来の開発とは異なるポイントで問題を生じることも少なくありません。弊害をどう解決するのかをまとめてみました。
認証キーがらみのエラー
最も多いのが認証キーがらみのエラーではないでしょうか。
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メンバーは、シミュレーター上でのデバッグに限られると言うことになります。
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 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]; 
}
- iPhone全般、一般
 - iPhone OS 3.0ベータ版のレビュー
 - iPhone OS 4.0ベータ版のレビュー
 - iPhone SDKの開発環境、XCodeの基本
 - iPhoneチュートリアル
 - XCodeの便利なショートカット
 - iPhone技術情報、開発テクニック
 - iPhoneのSQLite3周りのテクニック
 - iPhone SDKのトラブルシューティング
 - iPhone SDKでGoogle Apps APIを利用する
 - iPhone SDKを使ったデバッグ手法
 
- お勧めリンク
 - ダウンロード
 - ストリーミング関連
 - Macintosh関連
 - 
          
- Macでも使えるDVDドライブ
 - Leopard詳解
 - iLife詳解
 - Macの修復方法特集
 - Apple MacBook (Pro)
 - Macで無線LAN802.11n
 - 新旧MacBookベンチマーク
 - フルHD編集Apple iMovie&Final Cut Express
 - ROXIO Toast Platinum
 - フルHD編集Apple Final Cut X
 - MacBookのHDD換装方法
 - MacとWindowsのファイル共有
 - MacでWindowsを遠隔操作
 - WinユーザーのためのMac概論
 - 無料の辞書検索ツール 英辞郎
 - 代表的なタブブラウザの比較
 - Macお勧めのフリーソフト紹介
 - 無料のOffice環境 NeoOffice
 - エミュレータ比較
 - Macで最適バックアップ
 - iGeek Indelible
 - intego PersonalBackup
 - EMC® Retrospect® for Mac
 - Mac版 ウイルス対策
 - Ruby On Rails インストール(Mac編)
 - Ruby On Rails 開発の初歩(Model)
 - Ruby On Rails 開発環境RadRails
 - Ruby On Rails DBメンテナンス
 - Excel, Wordを使ってMacで年賀状宛名印刷
 
 - Windows関連
 - 
          
- EaseUS Todo Backupで完璧バックアップ
 - DVD, Blu-rayリッピングツール AnyDVD HD
 - キャプチャーソフト hunuaaCap
 - Windows2003でリモートデスクトップ7を動かす
 - 最適なバックアップソフトは
 - robocopyによるバックアップ
 - リージョンフリー
 - リージョンフリー化を有効活用
 - マルチブート
 - Antivir®
 - eTrust Antivirus
 - AVG AntiVirus
 - C#徹底講座
 - メーラー Mailer
 - VBA徹底活用術
 - JustSystemメーラーShuriken
 - FTPソフトとコマンドライン解説
 - DOS/Vパーツリンク集
 - Oracle10gBronze試験対策
 - CDからMP3へ簡単に変換する方法
 
 - メディアなど
 - ハードウェア
 - 
          
- iPhone 3G
 - iPhone 4
 - iPod+iTunes
 - iPhone SDK
 - 色域(AdobeRGB)
 - hp mini 1000
 - 環境紹介
 - KDDI au新旧プラン研究
 - DVDをMP4にコンバート
 - 無線LAN環境802.11n
 - キャプチャボード
 - HD-LANによるネットワークストレージ構築
 - NEC LavieJ LJ500/5A
 - LavieJ HDD換装
 - LavieJ 調子の悪いHDDの復旧
 - LavieJ 無線LANモジュールの換装
 - LavieJ メモリの追加
 - LavieJ バックアップ作成と復元
 - Intel PRO/Wireless 2200BG
 - 液晶・プラズマテレビ比較
 - プリンタ(hp PSC2550)
 - 万能リモコン クロッサム
 - 婦人体温計 プチソフィア
 - 婦人体温計 マドンナ
 
 - ソフトウェア/サービス/開発SDK
 - デジタル一眼レフカメラ
 - テクニカル記事
 - 趣味関連
 - ゲーム 〜楽しいゲームの紹介や攻略法
 - RoverMNI(ローバーミニ)
 - 雑記
 - その他
 - 
          
- ネットバンキングに便利な金融機関
 - 便利なサイト翻訳機能
 - 便利ツール GMail
 - 無料電話Gizmoの嘘とほんと
 - リンク:一般ページへのリンク集
 - 相互リンク:相互リンク募集中!
 - 本ページの統計:本サイトの統計データ公開
 
 - コメント・フィードバック