見出し画像

Now in REALITY Tech #68 AtlantisでProxymanを使う!

REALITYのiOSエンジニアのあおやまです。
先日、REALITYにAtlantisを導入しました!
Atlantisを導入すると、証明書やプロキシを設定せずに、Proxymanでパケットキャプチャできます。
今週の「Now in REALITY Tech」では、Atlantisを導入する上で工夫した「デバッグ時のみAtlantisに必要なInfo.plistを追加する」と「リリースビルドではAtlantisをimportできないようにする」の2点を紹介します。

AtlantisでProxymanを使う

自分はパケットキャプチャとして、Proxymanを利用しています。

UIがとてもカッコよく、サポートが手厚く、手に馴染む素敵なツールです。

しかし、パケットキャプチャするためには、(しょうがないのですが)証明書をインストールしたり、設定アプリからProxyを手動で構成したりする必要があり、手間がかかります。
特にProxyの設定は手間がかかる上に、オフにし忘れるとTwitterなどのSNSを使う場合にSSLエラーとなり、とても不便です。

そこで、Atlantisの出番です。

AtlantisはProxymanが配布しているframeworkで、このframeworkを利用すると、証明書やプロキシを設定せずともProxymanでパケットキャプチャできます。
具体的には、URLSessionをmethod swizzlingしてキャプチャした結果を、bonjourで見つけたProxymanに送ってくれるようです。

Atlantisの導入

Atlantisを導入する上で、2点工夫しました。
1点目はデバッグ時のみ必要なInfo.plistを追加することです。
2点目はリリースビルドではAtlantisをimportできないようにすることです。
それぞれ具体的な方法を紹介します。

デバッグ時のみ必要Info.plistを追加する

Atlantisがbonjourを使うために、Info.plistに下記の項目を追加する必要があります。

<key>NSLocalNetworkUsageDescription</key>
<string>Atlantis would use Bonjour Service to discover Proxyman app from your local network.</string>
<key>NSBonjourServices</key>
<array>
    <string>_Proxyman._tcp</string>
</array>

これらは、リリースビルドでは不要なため、デバッグ時のみInfo.plistに追加したいです。

実現するために、Preprocess Info.plist Fileの仕組みを利用しました。
Preprocess Info.plist Fileを使うことで、ビルド時にInfo.plistを編集できます。
次の2ステップで導入できます。

  1. Build SettingsでPreprocess Info.plist File (INFOPLIST_PREPROCESS) を
    デバッグ時のみYESに設定する。

  2. Build PhasesでCopy Bundle Resourcesの前にRun Scriptを追加し、plutilを使って、デバッグ時のみ必要な項目を追加するスクリプトを書く。

if [ "${CONFIGURATION}" != "Debug"]; then
  exit 0
fi

plutil="/usr/bin/plutil"
infoPlistFileDestination="${TEMP_DIR}/Preprocessed-Info.plist"

$plutil -insert 'NSLocalNetworkUsageDescription' -xml '<string>Atlantis would use Bonjour Service to discover Proxyman app from your local network.</string>' $infoPlistFileDestination
$plutil -insert 'NSBonjourServices' -xml '<array><string>_Proxyman._tcp</string></array>' $infoPlistFileDestination

とてもシンプルに実現できました!

別案で、INFOPLIST_PREPROCESSOR_DEFINITIONSを設定してInfo.plist内で #if DEBUGするアイディアもあったのですが、XcodeでInfo.plistを開けなくなるため、スクリプトで追加する手法を選択しました。

リリースビルドではAtlantisをimportできないようにする

Atlantisはリリース時には利用しないため、リリースビルドではimport Atlantisしたくありません。

#if DEBUG
import Atlantis
#endif

マクロで括るだけでは、不意にimportしてしまう可能性があります。

そこで、リリースビルド時のExcluded Source File Names (EXCLUDED_SOURCE_FILE_NAMES) に「Atlantis*」を追加して、importしたくでも、できないようにしました。
これを設定することで、万が一「#if DEBUG」を忘れた場合でも、コンパイルエラーとなり気付く事できます。

Atlantis導入の注意点

Atlantisを導入してみて気付いたのですが、AtlantisではMap LocalとBreak Pointが利用できません。
あくまでもAtlantisは補助ツール的な立ち位置らしいです。
issue → https://github.com/ProxymanApp/atlantis/issues/62
AtlantisとProxy設定をうまく組み合わせて使うと効果的なのかなと思っています。

まとめ

REALITYにAtlantisを導入する上で工夫したポイントを紹介しました。

もし、REALITYのiOSエンジニアのお仕事に興味を持って頂けたら、こちらのnoteもご覧頂けるととても嬉しいです!

カジュアル面談はじめました