![見出し画像](https://assets.st-note.com/production/uploads/images/103944860/rectangle_large_type_2_ceffa2bbf1e9c34d68025975888d22f0.png?width=1200)
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ステップで導入できます。
Build SettingsでPreprocess Info.plist File (INFOPLIST_PREPROCESS) を
デバッグ時のみYESに設定する。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もご覧頂けるととても嬉しいです!
カジュアル面談はじめました