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

つい忘れて調べるXcodeの設定〜スキーム追加編〜

More than 1 year has passed since last update.

1.はじめに

仕事でBuild Target、Schemeの追加をする時、毎回忘れてググって調べるという悪循環を繰り返します。このスパイラルから抜け出る為に自分用の簡易的なHowToを備忘録兼ねて残します。
他にも類似記事はありますが、参考になればと思います。
各設定の詳細については、知識不足であったり、補足が足らないところもあればコメントお願いいたします。

2.環境

Xcode10.1

3.Build Target、Build Scheme、 BuildConfigurationとは?

まず、いつもこの辺りがうやむやになってしまっているので一度整理します。

・Build Targetとは?
新規プロジェクトを追加した際は自動で1つ作られています。1つのビルド情報についてのかたまりのようなもの。
こいつを複数、例えばdebug、release,staging用と作れば、BuildSettingやInfo.plist、Capabilitesの中身を環境ごとに設定を変えられたりする。

・Build Schemeとは?
スキームは、どのターゲットをビルドするか指定した設定のコレクションのこと。どのビルド構成を使用するか、およびターゲットで指定されたプロダクトが起動されるときに使用するための実行環境のことです。

Build Configurationとは?
BuildSettingなどでパスや処理を分岐させたい場合に設定する値。
新規プロジェクトではdebug、releaseの2つが既にある。

まとめると
・Build Target
 環境ごとのビルド情報をまとめたもの
・Build Scheme
Build Targetに指定したものをビルドする実行環境
・Build Configuration
BuildSettingなどでパスや処理を分岐させたい場合に設定する値。

例)
Developer):「Debugでビルドしよう。スキームをHogeProjectDebugに変えてと、ビルドポチッ!」
Xcode):「はい、ビルドするかー。えっとまずスキームどれだ?」
「...HogeProjectDebugか、次にビルド実行するのにまずスキームに紐づいているターゲットの設定みてと。」
「あとは、スキームのbuild configurationはなんだっけ?、debugが指定されているか」
「じゃあソースコードにあるマクロはdebug用ので実行っと。よしビルド!|」
みたいな感じ。

ちなみにターゲット1つでDebug、Release、Stagingに分けたいという場合は、ターゲットは追加しないで、スキームとbuildConfiguration、Active Compilation Conditionsの設定だけです。
今回はスキームごとにターゲットを追加していますが、基本的にスキーム分の数ターゲットを追加することはしない方が良いです。またターゲットを追加するとinfo.plistもその分生成されます。
(増えたplistの設定やファイル名が初回に追加したターゲット名のままになっている件は、触れません笑)
その分、設定が増え、バグの温床になりかねません。
ターゲットを増やしてBuildSettingやinfo.plistの設定を変更する必要がある場合にのみ行うのが良いと思います。

3.手順

では、まず流れとして下記の手順で行います。

  1. ビルドターゲットの追加
  2. ビルドスキームの追加
  3. Build Configurationの追加
  4. Active Compilation Conditionsの追加
  5. マクロの記述
  6. 実行結果確認

3-1. ビルドターゲットの追加

画像の矢印のところがProjectSetting>taget一覧です。ない場合は、隠れているので矢印をクリックで表示させましょう。ProjectSettingのどのタブにいてもBuildTargetのリストは表示できます。

スクリーンショット 2019-03-16 15.16.08.png

次に、既存の1つのターゲットを右クリック>deplicateを選択すると新たにコピーが作成されます。
上の画像はコピーしたあとの画像なのでリストの下にSchemeTest copyが作成されているのがわかります。
作成できたら名前をSchemeTest-Stagingにしておきます。
同様にRelease環境も作っておきたいので、同じようにしてコピーしたターゲットの名前をSchemeTest-Releaseにします。
下記の画像のようになります。

スクリーンショット 2019-03-16 17.10.52.png

3-2. ビルドスキームの追加

次にスキームの追加ですが、過去のXcodeがどうだったか忘れましたが、Xcode10の場合は、ターゲットを追加すると自動で同じ名前のスキームが自動追加されます。
実際にスキームを見てみましょう。

XcodeのトップバーのRun実行停止ボタンの右にターゲット選択ボタンがあるのでクリックするとターゲットの一覧が表示されます。
先ほど名前を変更しましたが、スキームの方は変更されていませんね。

スクリーンショット 2019-03-16 17.15.10.png

それでは、Manage Schemes...を選択してスキーム管理画面を表示させましょう。
copy、copy2の2つをそれぞれターゲットと同じ、SchemeTest-Staging、SchemeTest-Releaseにリネームします。

スクリーンショット 2019-03-16 17.17.28.png

ちなみに先ほど、ターゲットを追加でスキームが追加されたのはこの画面の右上にあるAutoCreate Schemeが有効になっていたからです。便利ですね。
あとはBuild Configurationを追加してみましょう。

3-3. Build Configurationの追加

下記画像の赤文字の手順で、Project>Project Target>+ボタンをクリック。

スクリーンショット 2019-03-16 16.45.25.png

するとDeplicate Debug ConfigurationDeplicate Release Configurationとダイアログが表示されるので、Debugを選択。
Debug copyとしてBuildConfigurationが追加されました。
ここではStaging環境として追加したいので、名前をStagingに変えておきます。
同じようにReleaseも追加しましょう。

スクリーンショット 2019-03-16 17.42.26.png

次にBuildSettingにあるActive Compilation Conditionsを設定します。

3-4. Active Compilation Conditionsの設定

これはXcode8からの機能で、Xcode 7まではPreprocessor MacrosとOther Swift Flagsを設定することでマクロの記述を可能にしていましたが、それが簡単になりました。
それぞれ
DebugにはDEBUG
ReleaseにはPRODUCTION
StagingにはDEBUG STAGING
を設定しておきます。

スクリーンショット 2019-03-16 19.00.52.png

最後にスキームの設定に戻って上記で設定したBuildConfigurationをスキームに設定します。
ちなみにSchemeの設定画面へはXcodeのスキーム選択ボタン以外にもXcodeのステータスバーのProduct>Scheme>Manage Schemes...からも開けます。

スクリーンショット 2019-03-16 19.15.16.png

Manage Schemes画面を開いたら、SchemeTest-Stagingを選択し、Editボタンをクリック。
(SchemeTestターゲットはもともとdebugが設定済みなのでそのままで大丈夫です。)

スクリーンショット 2019-03-16 19.15.59.png

表示すると左のタブでRunのinfoがデフォルト表示されています。
その中にBuild ConfigurationにDebugが選択されているのでこれをStagingに変更します。
スクリーンショット 2019-03-16 19.18.08.png

左タブのその他、Test、Profile、Analyze、Archiveも変えておいた方がいいですが、今回は割愛します。
次に同じようにReleaseスキームにもReleaseのBuildConfigurationを適用させたいので、左上のスキームをSchemeTeset-Releaseに変更させ、同様に変更してCloseします。

スクリーンショット 2019-03-16 18.09.04.png

あとは、試しにViewControllerでマクロの分岐処理とログを仕込んで実行してみます。

3-5. マクロの記述。

 override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        #if PRODUCTION
        print("PRODUCTION Runing")
        #endif

        #if DEBUG
        print("DEBUG Runing")
        #endif

        #if STAGING
        print("STAGING Runing")
        #endif
    }

スキームを変えると自動でマクロの条件がtrueの記述のみが活性化するようになっているのでビルドしなくともわかるので便利です。
スクリーンショット 2019-03-16 19.05.07.png

3-6. 実行結果

・SchemeTest

DEBUG Runing

・SchemeTest-Staging

DEBUG Runing
STAGING Runing

今回はSTAGINGはDEBUGも含めたので、DEBUG、STAGING両方に入ります。

・SchemeTest-Release

PRODUCTION Runing

4. 最後に

これを機にもうググらないでスキーム追加できるようにしたいものです。
今回のサンプルはgithubにあります。
https://github.com/kazy-dev/Scheme_Test

ご静聴ありがとうございました。

kazy_dev
iOSアプリエンジニアをしています。 Flutterも再開しました。 Docker勉強中。趣味はドラム。 ブログ始めました。 https://kazyblog.com/
https://kazyblog.com/
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