AppStoreにFree版のアプリを後出しでリリースするときの小技


先日、 iPhoneアプリ「NewScroll」 のフリー版「 NewScrollFree」 をリリースさせていただきました。

Free版と通常版の違いは広告を表示するかしないかだけです。
iOSだと、アプリ内課金(In App Purchase)を利用して機能を増やしたり、広告を外したりするのがベターではあるのですが、今回のように、すでに有料でアプリを出した後に、Free版のアプリを出したくなった時にはアプリ内課金だとちょっと厄介です。

また、ほぼ同じ機能で別アプリをリリースをする時に、プロジェクトをそれぞれ分けてリソースも複数用意してしまうと、管理が面倒です。

そういった場合に便利な方法を紹介します。

ターゲットを複製

一からターゲットを作る方法もありますが、今回はターゲットを複製する方法です。

プロジェクトを選択し、複製したいターゲットを副ボタンをクリックし、「Duplicate」を選択。
「ターゲット名 copy」という名前でターゲットが作られるはずです。

Duplicate

このままの名前だとカッコ悪いので各種修正していきましょう。

作成されたターゲットをゆっくり2回クリック(ダブルクリックではない)すればターゲットの名前を変えることができます。

ターゲットごとのplistが作成されるのでその名前も変えておきましょう。
また、対応するターゲットを選んで「Build Settings」を表示して、「Info.plist File」と「Product Name」も合わせて変更しておきます。

Copy Rename

この状態でひとまず複数のアプリを作成する準備ができました。
ただ今のままでは全く同じアプリを複数作成するだけです。
中身が違うアプリを作成する方法はいろいろありますが、一番手っ取り早い(と僕は思っている)方法を今回は紹介します。

プログラムの中で使えるフラグを用意

プログラムやリソースは全く同じで、プログラム中にターゲットごとに処理を分けたいことがあります。
そういう時に便利なテクニックです。

ターゲットの「Build Settings」の中から「Other C Flags」というパラメータを探してください。
見つからないときは、リストを「All」にして、検索窓で「Other C Flags」と検索してみてください。

Other C Flags

そのパラメータに利用したい値をセットします。
セット方法は

「-D{利用したいキー名}={値}」

です。例えば、IS_FREEというキーを扱いたい場合は

「-DIS_FREE=1」

というような感じで。

Flags Set

ちなみにこのままでいきなりプログラム上でこのフラグを使うことはできるのですが、
複数ターゲットの内、キーをセットしていないターゲットでエラーが起きてしまいます。
それを回避するための小技を紹介します。

プロジェクトの中からpchファイルを探して、そこに以下のコードを記述してください。
ちなみにコード上のキーは上記の例の通りIS_FREEで書いてます。

#if !IS_FREE           //IS_FREEフラグが無ければ
#define IS_FREE NO        //ここでIS_FREEフラグを用意する
#endif

これで、フラグをセットしていないターゲットでもきちんとコンパイルができるようになります。

pch define

あとはプログラム上で定数の扱い方と同じ方法で扱えるようになります。

最初に書いたとおり、NewScrollのFree版をリリースするにあたって、上記方法で広告の出し分け等を行いました。
これならリソースは全く同じなので、アップデートも楽です。
もちろんこういうアプローチのアプリであれば、アプリ内課金でやるのがベターですが、
今回は、Free版をあとから作成したため、別アプリとしてリリースしました。
Free版でアプリ内課金してしまうと通常版とFree版の違いがなくなり、
アイコンや、アプリ名に困ってしまいますからね。
あとから変えられるといいのですが。。。

同じような境遇の場合は試してみてください。

NewScroll
NewScroll - DIGITALJET Inc.

NewScrollFree
NewScrollFree - DIGITALJET Inc.