O'Reilly Japan Blog

iOS開発でのスキーマとビルド設定の活用

お待たせいたしました。久しぶりにRetty株式会社さんからご寄稿をいただきました。今回は、iOS開発での環境を切り変えるために便利な「スキーマとビルド設定」について、ご自身の体験を交えてご紹介いただいております。

ごあいさつ

はじめまして、Retty株式会社の櫻井と申します。今回からiOSの開発で得たノウハウなどをブログ記事に書かせていただくこととなりました。今後、読者の皆さんのご意見なども取り入れつつ、何か役に立つような記事を書いていきたいと思っていますので、よろしくお願いします。

記事の内容としては、弊社で開発しているRettyというグルメサービスの開発の実例を通じて、教科書にはあまり載っていないTIPS、落とし穴等を紹介したいと思います。対象読者として複数人のチームでiOSアプリ開発をされている方を想定しています。

はじめに

背景と問題点

サービスとして提供し続けるWebアプリケーションを作るとき、本番環境と開発環境を別々に作っておき、一般ユーザーからのアクセスは本番環境へ接続されるようにし、開発メンバーが開発するをときには開発環境にアクセスするようにするというのは一般的な手法です。

この手法は、WebアプリケーションだけでなくiOSアプリ開発においてもそのまま適用されており、iOSアプリ開発において本番環境と開発環境を用意している会社さんも多くあるでしょう(以下、iOSアプリという表記はアプリと省略します)。

私がRettyで仕事を始めたとき、本番環境が1つと開発環境が2つ、計3つのサーバ環境がありました。その当時、アプリをどの環境に対して接続するかは、ソースコード内の定数値を毎回書き換えて指定していたため、以下のような問題が起きていました。

  • 本番環境と開発環境の切り替えが煩雑になっていた
  • アプリの表示名が同じものになってしまっており、端末に入っているアプリが本番環境に接続されているのか開発環境に接続されているのかがひと目でわからなかった
  • 間違って開発環境の設定のままアプリのリリース申請をしそうになってしまった

このような問題はXcodeのスキーマとビルド設定によって解決することができます。

その他に、設定ファイルをsedなどのコマンドで該当行の内容を一括置換できるようなスクリプトを作成する手法が考えられますが、この手法は以下の点からあまり有用でないと考えます。

  • 現在のプロジェクト状態がどの環境に接続するものなのかは設定ファイルの状態を確認しないとわからない
  • XCodeのみで作業を完結できない(いちいちターミナルからコマンドを叩かないといけない)

スキーマとビルド設定とは?

ビルド設定とは?

「ビルド設定」とは、文字通りビルドを行うときの各種設定のセットです。ビルド設定ごとに使用するinfo.plistの選択やプリプロセッサマクロの設定やプロビジョニングプロファイルの設定、その他の細かい設定を保存しておくことができます。

ビルド設定はXcodeのプロジェクトの編集画面で確認できます(図1)。

プロジェクトの編集画面

図1: プロジェクトの編集画面

スキーマとは?

スキーマとはXcodeの実行・テスト・プロファイル・アーカイブを行うときに、どのビルド設定を選択するかをあらかじめ設定しておくためのものです(図2)。

実行・テスト・プロファイル・アーカイブにそれぞれ別々のビルド設定を持たせることもできますし、全て同じビルド設定を持たせることもできます。

スキーマ管理画面

図2: スキーマ管理画面

空のプロジェクトを作ったとき

空のプロジェクトを作成すると、ビルド設定の初期状態としてReleaseとDebugが用意されます(図3)。ReleaseはAppStoreに申請するとき用の標準ビルド設定、Debug は開発用の標準ビルド設定です。スキーマの初期状態では、アプリ名と同じスキーマが1つ自動的に作成されます。(図4)

また、スキーマに対する各アクションの初期設定は表1のようになっています。

表1: スキーマに対する各アクションの初期設定

スキーマ初期設定
実行Debug
テストDebug
プロファイルRelease
アナライズDebug
アーカイブRelease

次項以降ではこの空のプロジェクトにスキーマとビルド設定を追加する手順を具体的に紹介していきます。

空プロジェクトのビルド設定

図3: 空プロジェクトのビルド設定

空プロジェクトのスキーマ設定

図4: 空プロジェクトのスキーマ設定

スキーマとビルド設定の導入前後で変わったこと(Rettyの場合)

Rettyの場合、今回ご紹介する内容を適用する前後で、以下のような変化がありました。

BEFORE

  • 環境を切り替えるたびに 7,8箇所ほど手作業で書き換える必要があった
  • 接続環境が異なっても同じ名前のアプリで一見どちらのアプリか見分けがつかなかった
  • Gitでバージョン管理する際、開発環境に設定したコードをうっかりコミットしないように気を遣っていた
  • アプリ申請時にうっかり開発環境で申請しそうになった(もちろんあわててDeveloper Rejectしました)

AFTER

  • コードの書き換えることなく、複数の接続環境を切り替えてビルドできるようになった
  • 接続環境ごとに個別のアプリとしてインストールできるようになった
  • Githubに不要な変更が入る心配がなくなった
  • 手作業による設定戻し忘れを防止できて、申請時のミスを防止できるようになった

一番大きかったのは環境のスイッチングが数クリックで済むようになったことと、アーカイブ時のビルド設定をいちいち気にしなくてもよくなったことです。

スキーマとビルド設定の導入

ビルド設定の作成

新規ビルド設定の追加

まずは新規にビルド設定を追加する必要があります。ビルド設定はXcodeのプロジェクトの編集画面で確認できます。

図5のようにプロジェクトの編集画面から「+」ボタンを押すと、どのビルド設定を複製して新規作成するかが聞かれるのでベースにしたいビルド設定を選ぶとビルド設定が複製されます。

ビルド設定の追加

図5: ビルド設定の追加

新規追加されたビルド設定はダブルクリックすると図6のようにリネームできるので、好きな名前に変更します。

ビルド設定のリネーム

図6: ビルド設定のリネーム

ビルド設定によるinfo.plistの切り替え:

ビルド設定ではどのinfo.plistを使ってビルドするかを指定できます。これにより環境ごとにアプリ名を変えたり、Bundle identifierを変えて別アプリとして端末に入れておくことが可能になります。それ以外にもカスタムURLスキーマなどを変えることもできます。

具体的な手順は以下のとおりです。

  1. プロジェクトの編集画面でTargetsでアプリを選択し、「Build Setting」タブを開く
  2. 検索窓で info.plist と入力する
  3. Info.plist という設定項目を開く
  4. 新規作成したConfiguramtionの内容を別のファイル名に変更する(図7)
  5. 既存のInfo.plistを複製して先ほど指定した名前に変更する
  6. 複製したInfo.plistに対し、環境によって変えたい設定部分を編集する(図8)。今回の例では別アプリとしてアプリをインストールできるようにBuild ConfigurationとBundledisplaynameを変更します
Info.plistファイル設定の変更

図7: Info.plistファイル設定の変更

Info.plist ファイルの複製と編集

図8: Info.plist ファイルの複製と編集

プリプロセッサマクロの設定と分岐

ビルド設定ごとにプリプロセッサマクロを設定できます。これにより、ソースコード内でもプリプロセッサマクロの有り・無しで動作を分岐させたり、定数値の切り替えたりすることができます。

具体的な手順は以下のとおりです。

  1. プロジェクトの編集画面でTargetsでアプリを選択し、「Build Setting」タブを開く
  2. 検索窓でpreprocessor macroと入力する
  3. Preprocessor Macrosという設定項目を開く
  4. 新規作成したビルド設定に追加したいマクロをセットする(図9)
  5. コード内では #ifdef DEVELOPMENT_ENV といった形で分岐を記述する(図10)

この時点ではスキーマ作成および設定前なのでまだ本番側の分岐で実行されます

Preprocessor Macrosの設定

図9: Preprocessor Macrosの設定

マクロによるコード分岐

図10: マクロによるコード分岐

スキーマの作成

対象の環境ごとにスキーマを作成して、状況に応じたビルド設定を指定します。この設定が終わるとスキーマの切り替えにより、先程作成したビルド設定に応じて接続環境やアプリ設定を切り替えてビルドできるようになります。

具体的な手順は以下のとおりです。

  1. スキーマ選択メニューを開き、「Manage Schemes」をクリックする
  2. ギアマークのボタンを押して、既存のスキーマを複製する
  3. 新しくできたスキーマの名前を変更する(図11)
  4. 編集したいスキーマを選択して、Editボタンを押す
  5. 実行と、テスト、プロファイル、アナライズのビルド設定を全て、開発用のビルド設定に変更する(図12)
  6. OKボタンを押す
スキーマの複製

図11: スキーマの複製

スキーマのビルド設定の変更

図12: スキーマのビルド設定の変更

スキーマをGithubなどでチーム共有したいときには、スキーマ管理画面でSharedのチェックをつけると、hogehoge.xcscheme というファイルが生成されます(図13)。

このファイルをリポジトリに含めておくことで、チームメンバー間でスキーマを共有できるようになります。

スキーマを共有

図13: スキーマを共有

実行

それではいよいよ実行する時がきました。新たに追加したスキーマに切り替えて開発環境用の接続設定になることを確認します。「プリプロセッサマクロの設定と分岐」の節では、図10のように実行したときはまだ新規に追加したビルド設定ではなかったので本番環境用のデバッグ出力が出ていましたが、今回は図14のように開発環境用の出力がされました。

iOSシミュレータを確認すると、アプリも先ほどの本番環境のものとは別に Empty-dev というアプリができあがっています(図15)。

マクロコードによる分岐(開発環境)

図14: マクロコードによる分岐(開発環境)

個別アプリとしてインストール成功

図15: 個別アプリとしてインストール成功

まとめ

いかがでしたでしょうか?今回の記事の内容は、サービスとして提供し続けるiOSアプリを作っている開発者の方には普段の煩雑な手順を大きく削減できる内容になっていると思います。ぜひ、この手法の導入を検討していただければと思います。

次回は、TestFlightの導入とJenkinsとの組み合わせによる複数環境のアプリ自動配布についてご紹介したいと思います。

執筆者紹介
櫻井 洋一郎
ソーシャルグルメサイト「Retty」のiOSアプリ開発・Web開発を担当。iOS開発は2010年からはじめ、2011年には開発担当をしたiPadアプリがAppStoreのiPad有料アプリ総合ランキングNo.1を獲得。2013年からRettyにジョインしiOS アプリをメインで担当している。
Rettyは、信頼できる人からお店探しができる実名口コミNo.1のグルメサービス。Facebookアカウントがあれば無料で利用が可能でPC、iPhone、Android に対応。