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

#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のリストは表示できます。

<img width="1275" alt="スクリーンショット 2019-03-16 15.16.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/d0b1c4fa-c0d6-e147-3a13-8760a3144966.png">

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

<img width="193" alt="スクリーンショット 2019-03-16 17.10.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/e7640deb-0878-7486-6d99-0c0ed5f37ed1.png">

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

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

<img width="668" alt="スクリーンショット 2019-03-16 17.15.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/8aac4540-f61c-7567-7f38-741343a8bef5.png">

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

<img width="769" alt="スクリーンショット 2019-03-16 17.17.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/6737fe28-30cd-4145-b1d9-b0d1a75e40d7.png">

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

##3-3. Build Configurationの追加
下記画像の赤文字の手順で、Project>Project Target>+ボタンをクリック。

<img width="821" alt="スクリーンショット 2019-03-16 16.45.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/ca7fc35a-61f3-50b0-e96d-0be950ba8124.png">

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

<img width="546" alt="スクリーンショット 2019-03-16 17.42.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/3f523b61-f65c-50f4-e695-beff9c762809.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**
を設定しておきます。

<img width="567" alt="スクリーンショット 2019-03-16 19.00.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/f41ec2d9-8477-be56-6289-a7b38048d1c9.png">


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

<img width="482" alt="スクリーンショット 2019-03-16 19.15.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/4596192d-e61d-5a5e-bfcb-6a9e9cddd8b6.png">

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

<img width="768" alt="スクリーンショット 2019-03-16 19.15.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/9d2892e2-e2fb-6c76-ff68-79f4419798ca.png">

表示すると左のタブでRunのinfoがデフォルト表示されています。
その中にBuild　ConfigurationにDebugが選択されているのでこれをStagingに変更します。
<img width="883" alt="スクリーンショット 2019-03-16 19.18.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/6da0fd3d-fbb3-6235-5699-4496384c0d81.png">

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

<img width="899" alt="スクリーンショット 2019-03-16 18.09.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/01b3109e-3bc0-b020-2f08-d581104a4212.png">

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

##3-5. マクロの記述。

```swift
 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の記述のみが活性化するようになっているのでビルドしなくともわかるので便利です。
<img width="160" alt="スクリーンショット 2019-03-16 19.05.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/11be9cea-a052-1692-926e-319d900ebcee.png">


##3-6. 実行結果
**・SchemeTest**

```swift
DEBUG Runing
```

**・SchemeTest-Staging**

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

**・SchemeTest-Release**

```swift
PRODUCTION Runing
```
#4. 最後に
これを機にもうググらないでスキーム追加できるようにしたいものです。
今回のサンプルはgithubにあります。
[https://github.com/kazy-dev/Scheme_Test](https://github.com/kazy-dev/Scheme_Test)

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