読者です 読者をやめる 読者になる 読者になる

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

iOS Android mitmproxy

こんにちは。iOSエンジニアの庄司です。

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

f:id:vasilyjp:20160212005131p:plain

ライブラリ

ResponseDetective

https://github.com/netguru/ResponseDetective

NSURLSessionのリクエストやレスポンスをデバッガのログに流してくれるライブラリです。

特徴・利点

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

欠点

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

Wireshark

https://www.wireshark.org/

Windows, OSXどちらでも使えるパケットキャプチャツールです。
f:id:vasilyjp:20160209170543p:plain

特徴・利点

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

欠点

httpsの通信はドメインを見ることはできますが、エントリーポイントやレスポンスは暗号化されたままで、見ることはできません。
自分のアプリであれば、httpsの通信も見ることができるようです。

Charles

https://www.charlesproxy.com/

OSX上で動くHTTPプロキシツールです。
f:id:vasilyjp:20160209170623p:plain 多くのiOSエンジニアが使っているのではないでしょうか。
インストール手順はこちらのQiitaの記事が参考になります。
f:id:vasilyjp:20160209170640p:plain

特徴・利点

Wiresharkと同様、アプリに対する実装は不要です。 通信を内容を見るだけではなく、ブレークポイントを仕掛けたり、レスポンスをローカルファイルの別の値に変更したりすることができるので、APIの異常系のテストにも使えます。 またWiresharkと違って、httpsの通信の中身を見ることができます。

欠点

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

PonyDebugger

https://github.com/square/PonyDebugger

f:id:vasilyjp:20160209170707p:plain

square社製のネットワークデバッガです。

f:id:vasilyjp:20160209170729p:plain

特徴・利点

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

欠点

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

netfox

https://github.com/kasketis/netfox

Swiftで書かれたの通信監視ライブラリ、通信結果をアプリ上で確認することができます。

netfox.gif
GitHubのREADMEから

特徴・利点

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

欠点

モーダル表示で確認するため、リアルタイムでURLを確認できません。
AlamofireやAPIKitなど、利用しているライブラリによってはひと手間かけないと通信ログを取れません。

mitmproxy 【2016/02/12 追記】

https://github.com/mitmproxy/mitmproxy

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

f:id:vasilyjp:20160212005124p:plain

f:id:vasilyjp:20160212005131p:plain

特徴・利点

Charles同様SSLのリクエストの中身を確認することができます。
リクエストのインターセプトや書き換えはもちろんのこと、Pythonスクリプトで動的にレスポンスを書き換えることができます。
ターミナルからキーボード操作で扱えるのも嬉しいですが、一番嬉しいのはここまで使えて無料であることです。
また、公式ドキュメントも充実しています。

欠点

ちょっと触って見る限り、Wireshark, Charles でできることはだいたいできる上に無料なので、欠点は見当たりません。

まとめ

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

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

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

最後に

VASILYでは、一緒にiQONのアプリを開発してくれる仲間を募集しています。少しでもご興味のある方は是非こちらからご応募よろしくお願いいたします。

参考URL