おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

iosアプリ開発時に実機とローカルサーバを通信させるための快適な設定方法について

iOS アプリ開発をしている時に、web上のサーバではなく、ローカルマシンのサーバと通信させたくなる状況はよくあるかと思います。僕はまず次のようなコードを書いて、さらにコンパイラ用のフラグに -D DEBUG と設定することで対応しました。

#if DEBUG
   let host = "http://localhost:3000/"
#else
   let host = "https://production.example.com/"
#endif

この Qiita の記事を参考にさせていただきました。

Swift での #ifdef DEBUG のやり方 - Qiita

これで大丈夫!…ではありません。ローカルサーバは http なので、ATS(App Transport Security) を許可する設定を追加しないと通信できません。

[iOS 9] iOS 9 で追加された App Transport Security の概要 | Developers.IO

単純に Info.plist に localhost:3000 を例外として許可する設定を追加して、しばらくは平穏に過ごせたのですが、実機で検証しようとした時に問題点に気づきました。そうです。実機からローカルマシンのサーバに接続する時には localhost ではダメなのでした。

それでは localhost をやめて、例えば willnet.local のような、mac に設定してある hostname を利用すればどうでしょうか。問題なく動きそうですね。ただ、これでは複数人数でiOS開発しようとした時に、各自のローカルマシンに立てたサーバと接続したくなるケースに対応できません。適宜ホスト名を書き換えてビルドし、コミットする時にはホスト名の変更を含めないように気をつける…そんな開発プロセスになりそうです。なるべくなら避けたいですね。

そこで次の二つのブログエントリを参考にしました。

上記のブログでやっていることを簡単にまとめると、Build Phases の Run Script 内に、Info.plist を書き換えるスクリプトを書きビルド時に実行することで、ビルドしたマシンの hostname を動的に Info.plist に設定しています。

これでURLを書き換えることなく快適に開発ができるようになりました。やりましたね。

しかしこれをiOSプロジェクトごとに毎回やるのは面倒ですね。Run Script を自動で追加できるライブラリのような仕組み*1があればそれを作りたいのですが、そのあたり詳しいかたいたら教えてください><

*1:そもそもそんなことできるんですかね…