Help us understand the problem. What is going on with this article?

いまさら聞けない、ビルドターゲットの分け方

More than 5 years have passed since last update.

ビルドターゲットを使い分けると「有料版/無料版」「デバッグとリリースで違うBundleIdentifierを使いたい」等、コードはほとんど同じでちょっとだけ違うビルドをしたいものを、一つのプロジェクトにまとめておくことができます。

LCD Clockの有料版と無料版もこの方法で作り分けています。(ステマ)

icon-40@2x.png

【LCD Clock】
https://itunes.apple.com/jp/app/lcd-clock/id295737235?mt=8
【LCD Clock Lite】
https://itunes.apple.com/jp/app/lcd-clock-lite-clock-calendar/id567652828?mt=8

ここではビルドターゲットを分ける具体的な手順を説明します。

ビルドターゲットを分ける方法


  1. 元になるターゲットを選択して右クリック→Duplicate。
    スクリーンショット 2015-02-05 1.19.13.png

  2. iPad用に変換するか聞かれます。今回は「Duplicate Only」で。
    スクリーンショット 2015-02-05 1.19.38.png

  3. MyProjectがコピーされて新しいターゲットができました。
    スクリーンショット 2015-02-05 1.22.06.png

これで当初のビルドターゲットを分けるというところまではできました。

この時点でビルド設定とInfo.plistも分かれているので、ターゲットに応じたBundleIdentifierなどを使い分けることができます。

ですがここまででは「違うビルドの設定ができた」というだけで、コードで分岐させることはまだできません。コードで分岐が書けるようになるにはもう一手間必要です。

正確には、別々な設定をしたInfo.plistの値などをつかって分岐させることはできますが、普通の状況だとターゲットで異なる処理を動的に(実行時に)分岐させる必要は無く、はじめからどちらかだけで良い場合がほとんどです。

そこで、下記のビルド設定で定義する値を使いプリプロセスの段階で分岐させます。
プリプロセスはコンパイルの前に行われ対象外の部分は無いのと同じです。ですので実行時に分岐判定などが行われることもなくターゲットが増えたからと言って実行時の処理が増えることもありません。

ターゲットに応じて分岐する方法


ターゲットを選択してBuildSettings、PreprocessorMacrosを開きます。
今回は、それぞれに「MYTARGET_A」「MYTARGET_B」という定義を追加しました。

スクリーンショット 2015-02-05 1.39.40.png
スクリーンショット 2015-02-05 1.39.49.png

これで準備は完了です。

ターゲットを選択してビルドすれば、それぞれに応じた定義が有効になります。
  スクリーンショット 2015-02-05 1.44.12.png

あとは下記の用に、必要な箇所で分岐させます。

#ifdef MYTARGET_A
    NSLog(@"MYTARGET_A");
#endif

#ifdef MYTARGET_B
    NSLog(@"MYTARGET_B");
#endif

ちなみにターゲットが2つしかなければelseを使って

#ifdef MYTARGET_A
    NSLog(@"MYTARGET_A");
#else
    NSLog(@"MYTARGET_B");
#endif

のようにも書けます。


ちなみにLCD Clockでは、有料版には

  スクリーンショット 2015-02-05 2.27.05.png

このようにウィジェット(TodayExtension)が2つ含まれていますが、無料版にはウィジェットは含まれていません。
ビルドターゲットでこのような使い分けも可能です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした