iOSアプリのAPIリクエストのトレースはどうするのが効率的か？


> この記事は[VASILY DEVELOPERS BLOG](http://tech.vasily.jp/entry/ios_api_request_trace)にも同じ内容で投稿しています。よろしければ他の記事も御覧ください。


普段のアプリ開発において、バックエンドチームから「○○のページで△△のデータ取得するためにリクエストしているURLってどんなの？」と聞かれることがよくあります。<br />
その都度、APIリクエストとリクエスト結果をprintで表示するフラグをONにしてアプリをビルドするということをしていたため、かなり手間がかかっていました。<br />
こういった作業を楽にするためにネットワークデバッグライブラリをいくつか比較してみました。

# ライブラリ
## ResponseDetective <br />
https://github.com/netguru/ResponseDetective <br />
NSURLSessionのリクエストやレスポンスをデバッガのログに流してくれるライブラリです。

### 特徴・利点
フルSwiftで書かれており、NSURLProtocolのメソッドに割り込んでログを落とす事ができます。<br />
また、HTML, JSON, imageなどのレスポンスのタイプによって処理を分けることができます。

### 欠点
通信のデリゲートを受け取ることはできますが、デフォルトでは何もログを落とさないため、printも自分で書きます。<br />
その結果、そこそこのコード量になってしまいますし、printを書くということは、ログを見るためにその都度ビルドが必要になってしまいます。


## Wireshark
https://www.wireshark.org/ <br />
Windows, OSXどちらでも使えるパケットキャプチャツールです。<br />
![wireshark.png](https://dl2.pushbulletusercontent.com/aXYLHA3zhZvbI0iQpZdMDx3jkKUILM3I/wireshark.png)

### 特徴・利点
Remote Virtual Interface(RVI)を使って、UUIDごとの端末の通信をキャプチャできます。<br />
あくまでパケットキャプチャツールなので、アプリにコーディングは不要。<br />
Androidにも使えますし、他社製アプリの通信もキャプチャすることができます。

### 欠点
httpsの通信はドメインを見ることはできますが、エントリーポイントやレスポンスは暗号化されたままで、見ることはできません。<br />
自分のアプリであれば、httpsの通信も[見ることができる](http://qiita.com/ywatai@github/items/baddcf6988ec1f6ac014)ようです。

## Charles
https://www.charlesproxy.com/ <br />
OSX上で動くHTTPプロキシツールです。<br />
![charles_log.png](https://dl2.pushbulletusercontent.com/TSYNG3WX9CIHSwn9u5ayUgdCTQlSGtep/charles_icon256.png)
多くのiOSエンジニアが使っているのではないでしょうか。<br />
インストール手順はこちらの[Qiitaの記事](http://qiita.com/usagimaru/items/d340e87da98e62f99b60)が参考になります。<br />
![charles_capture.png](https://dl2.pushbulletusercontent.com/xpjdjMjg6DQ44FX4vszibJQgasTALcBz/charles_capture.png)
### 特徴・利点
Wiresharkと同様、アプリに対する実装は不要です。
通信を内容を見るだけではなく、ブレークポイントを仕掛けたり、レスポンスをローカルファイルの別の値に変更したりすることができるので、APIの異常系のテストにも使えます。
またWiresharkと違って、httpsの通信の中身を見ることができます。

### 欠点
30日は無料で使えますが、それ以降はライセンスの購入が必要になります。<br />
1ライセンス最大$50ですが、豊富な機能を考えるとその価値があると思います。


## PonyDebugger
https://github.com/square/PonyDebugger

![ponydebugger_logo.png](https://github.com/square/PonyDebugger/raw/master/Documentation/Images/Logo.png)

square社製のネットワークデバッガです。<br />
![PonyDebugger](https://dl2.pushbulletusercontent.com/UYtgZRGmtQxMc9u0Tek5HKSo8nv5ycl2/PonyDebugger.png)

### 特徴・利点
iOSアプリ内部にライブラリを実装し、OSX側で立ち上げたサーバを介してGoogle ChromeのDeveloper Tool通信やView階層を見ることができます。<br />
ChromeのDeveloper Toolを使い慣れている人にはとても親しみやすく見やすいです。

### 欠点
OSX側にpythonのサーバを立ち上げるのですが、これの環境構築に手間取りました。(OSX側のサーバインストールのエラーについてのissueが何種類もありました。今回参考になった[issue](https://github.com/square/PonyDebugger/issues/174)。)<br />
2013年から運用されているObjective-Cのライブラリで、もはや積極的にメンテナンスされていません。

## netfox
https://github.com/kasketis/netfox <br />
Swiftで書かれたの通信監視ライブラリ、通信結果をアプリ上で確認することができます。<br />

![netfox.gif](https://raw.githubusercontent.com/kasketis/netfox/master/assets/overview1_5_3.gif)
GitHubのREADMEから

### 特徴・利点
セットアップは、AppDelegateに一行書くだけです。<br />
アプリをシェイクするとリクエストしたURLリストがモーダル表示されます。<br />
また、ジェスチャーが既存機能と衝突する場合は、カスタマイズすることもできます。

### 欠点
モーダル表示で確認するため、リアルタイムでURLを確認できません。<br />
AlamofireやAPIKitなど、利用しているライブラリによっては[ひと手間](https://github.com/kasketis/netfox/blob/master/Workarounds.md)かけないと通信ログを取れません。


## mitmproxy
https://github.com/mitmproxy/mitmproxy

OS X, Linux 上で動作する、CUIのHTTPプロキシです。Pythonでできています。

![mitmproxy_logo.png](https://qiita-image-store.s3.amazonaws.com/0/11454/7c016b8b-894b-4c52-3dea-fb64d442c133.png "mitmproxy_logo.png")

![スクリーンショット 2016-02-12 0.19.34.png](https://qiita-image-store.s3.amazonaws.com/0/11454/a5003f8b-3c63-add0-6d6d-2a66948be72d.png "スクリーンショット 2016-02-12 0.19.34.png")

### 特徴・利点
Charles同様SSLのリクエストの中身を確認することができます。
リクエストのインターセプトや書き換えはもちろんのこと、Pythonスクリプトで動的にレスポンスを書き換えることができます。
ターミナルからキーボード操作で扱えるのも嬉しいですが、一番嬉しいのはここまで使えて無料であることです。
また、[公式ドキュメント](http://docs.mitmproxy.org/en/stable/index.html)も充実しています。

### 欠点
なし


# まとめ
ここまでのライブラリのメリット/デメリットを簡単にまとめました。

|ライブラリ|メリット|デメリット|
|:--|:--|:--|
|[ResponseDetective](https://github.com/netguru/ResponseDetective)|カスタマイズ性が高い|アプリ実装多め|
|[Wireshark](https://www.wireshark.org/)|アプリ実装不要|https不可|
|[Charles](http://www.charlesproxy.com/)|アプリ実装不要・設定が簡単・高機能|有料|
|[PonyDebugger](https://github.com/square/PonyDebugger)|ChromeのDeveloper Toolが見やすい|古い・メンテ少ない|
|[netfox](https://github.com/kasketis/netfox)|アプリ実装は一行だけ|リアルタイムに通信を見れない|
|[mitmproxy](https://github.com/mitmproxy/mitmproxy)|アプリ実装不要・CUI・無料でSSLも確認できる|なし|

僕の場合は最終的に ~~Charlesにお金を払うことに決めました。~~ **mitmroxy** を使うことに決めました。 <br />
冒頭であったように、「○○のページで△△のデータ取得するためにリクエストしているURLってどんなの？」となった場合でも、アプリをビルドすることなく、リクエストしているURLをすぐに確認することができます。<br />
また、Xcodeとは別のツールであることで、APIリクエストとそのレスポンスがXcodeの狭いデバッグエリアを占領することがなくなり、ログがかなり見やすくなりました。

# 参考URL
- [Technical Q&A QA1176 - Getting a Packet Trace - Mac Developer Library](https://developer.apple.com/library/mac/qa/qa1176/_index.html)
- [通信系のデバッグには Charles が便利 - Qiita](http://qiita.com/usagimaru/items/d340e87da98e62f99b60)