Xcodeで1つのプロジェクトから無料版と有料版のiOSアプリをビルドする
iOSアプリの無料版と有料版を提供するとき等に、Xcodeの1つのプロジェクトから無料版と有料版の2つのアプリをビルドしたいケースがあります。
Xcodeで2つのプロジェクトに分けてしまうと、バグ修正や新機能追加のたびに両プロジェクトをコーディングする必要があって大変なので、広告や有無や制限値の差異程度であれば1つのプロジェクトから2つのアプリをビルドすると楽です。
ここでは1つのプロジェクトの同一ソースから2つのアプリをビルドする方法を説明します。
Xcode上での作業
ここでは、有料版が既にあって、新たに無料版を追加する場合を例にして説明します。
有料版のTargetを複製して無料版を作る
- Projectツリーを開く
- Targets > 有料版アプリを右クリックする
- Duplicateをクリックして複製する
- 無料版のTarget名が「Target名 copy」となっているので無料版の名前に修正する
- 無料版のTarget > General > Identity > Bundle Identifierを無料版のものに修正する
無料版のプロダクト名を設定する
- 無料版のTarget > Build Settings > Packaging > Product Name
- Product Nameが「Target名 copy」となっているので無料版の名前に修正する
無料版のビルド時のマクロを設定する
- 無料版のTarget > Build Settings -> Apple LLVM 5.X - Preprocessing
Preprocessor Macrosの
Debug
とRelease
両方に無料版のビルドフラグを追加するFREE_VERSION=1
コードに
#ifdef
無料版と有料版の処理を分岐させる#ifdef FREE_VERSION 無料版の処理 #elif 有料版の処理 #endif
※注意 無料版/有料版のコードを分岐させるには以下のようなパターンがあります。
- シングルトンオブジェクトを作って、一度
#ifdef
内で有料/無料フラグを設定して、それ以降はif
文で分岐する #ifdef
で関数内で処理を分岐する#ifdef
で無料版の関数と有料版の関数をわける
無料版にしか存在しない広告系の関数などは3の方法で消すのがよいです。一方で、関数中のしきい値が異なる程度なら1や2の方法で分岐するのがよいかもしれません。
#ifdef
マクロは強力で便利ですが、Xcodeのシンタックスハイライトを崩すケースや無料/有料両方のコード修正が必要になるケースやリファクタリング機能がうまく使えなくなるケースなど様々なデメリットもあるため、メンテナンスコストを考えて使うと良いと思います。- シングルトンオブジェクトを作って、一度