iPhoneアプリをHTTPデバッグする方法

PC上でWeb開発する場合のHTTPデバッグ方法としては色々とあります。
例えば、FirefoxFirebugIEFiddler等のブラウザプラグインを利用する方法、横取り丸等でHTTPプロキシとしての利用方法があるのですが、iPhoneアプリではネイティブで直に動作するため、おそらくプロキシでのデバッグが一番確実かと思います。

今回は、Mac用のHTTPデバッガツール Charlesというアプリを利用したデバッグを紹介します。
http://www.charlesproxy.com/


デバッグ概要
MacにCharlesをHTTPプロキシとして起動させておき、iPhoneWiFi設定でHTTPプロキシをCharlesのポート(default:8888)を指定させます。iPhoneからの全ての通信は全てMacのCharlesを経由することになるので、Charles側でハンドリングした通信ログを出力します。

  • 概念図

iPhone <=> Charles (Mac:8888) <=> 接続先のサーバ



Macのローカルホスト名の設定
ルータがDHCPを使用している場合はMacのIPが変わると厄介なので、ローカルホスト名を指定します。




Charles設定
Charlesを起動し、設定アイコン>「Proxy Settings」を選択します。

port8888が既に使用されている場合は変更します。



iPhoneの設定
iPhoneの設定>「Wi-Fi」>ネットワークの詳細>HTTPプロキシ欄 でサーバとポートを指定します。
認証はオフで構いません。
サーバ名は先ほど指定したローカルホスト名、ポートはCharlesで設定したポート番号を入力します。


トレースの開始
この方法ではiPhoneのすべての通信をハンドリングしてしまうため、バックグラウンドで実行されているアプリをすべて終了させます。その後、対象のアプリを起動してiPhoneの通信ログをトレースしていきます。
SSL(port443)でなければ、全てのRequestとResponseの生データを確認することができます。


こんな感じにトレース表示されます。ステキ。

Charlesのログを止めたい場合は「Stop Record」ボタンを押します。

尚、プロキシとして動作するのはCharlesが起動している間だけなので、デバッグが終わったらiPhoneの設定をHTTPプロキシをオフに戻さないと当然ですが全く通信ができなくなります。




(番外編)Macと同じセグメントに参加できない場合の方法
iPhoneからMacにアクセスするためにはWi-Fiルータ等で同じセグメントに参加している必要がありますが、
iPhoneからWi-Fiに参加できない場合でもMacEthernet経由でのインターネット共有を利用すれば同様のことが行えます。

  • 概念図

iPhone <=(Macインターネット共有)=> Mac(8888) <=(Ethernet)=> サーバ


※ただし、この方法ではそのMacが参加しているネットワークをWi-Fiで簡易的に開いてしまうため
社内ネットワークだったり機密情報を持つネットワークの場合は十分注意してください。
機密情報を持つネットワークの場合はセキュリティ上に間違いなくNGだと思います。


Macのインターネット共有設定
インターネット共有の設定で「共有する接続経路」を「Ethernetアダプタ」、「相手のコンピュータが使用するポート」を「Wi-Fi」に設定します。

続いて、「Wi-Fiオプション」を押して、ネットワークの構築を行い、「インターネット共有」にチェックします。



iPhoneよりMacのインターネット共有に接続
iPhoneの設定>「Wi-Fi」よりインターネット共有で構築したネットワークを選択します。

続いてネットワークの詳細を選択し、同一セグメントの場合と同様にHTTPプロキシ欄のサーバとポートを指定すればCharlesでキャプチャが行えます。


概念さえ理解すれば、HTTPデバッグやインターネット共有は色々と応用が効くので一度経験しておくと何かの役に立つかもしれません。