iOS開発でDEV環境を構築する

iOSアプリを運用していくにあたって、アプリの配布やサーバーサイドとの連携は必須となります。
その際にクライアント側でDevやStaging、Releaseなど環境を使い分けたいケースは必ず出てきます。
今回はXcode上でDev環境を作る一連の流れをまとめてみました。
複数の環境を追加したい場合もこの流れで同じことを繰り返していけば良いので、簡単です。

この記事ではConfigrationを変更することで、DEV環境を作ります。
他にもTargetsを増やす方法やxcconfigファイルを使用する方法もあるので、チェックしてみてください。

## ProjectのConfigurationのNameをDebug -> Developに変更
単純にリネームです。
3つ以上環境使い分けたいケースでは、ここで追加をしてください。


<img width="1142" alt="スクリーンショット 2020-03-30 22.19.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/a401b549-b37e-0750-70b6-106e21ac18ed.png">

## Preprocessor Marcos(Project -> Build Setting)で、DEBUG=1 -> Develop=1に変更

<img width="1142" alt="スクリーンショット 2020-03-30 22.23.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/2bf2248a-99f1-d029-8f0b-786b19206581.png">

* Preprocessor Marcosとは
    * 環境ごとに条件分岐できるようにするためのXcodeの機能
    * [SwiftでPreprocessor Macrosを使う
](https://qiita.com/haranicle/items/fd2af5087760d65932e2)


## Other Swift flagの設定

`#if DEVELOP` とかできるようにするために行う。
`-D <flag名>`の形式で設定する。
複数やる場合は、`-D <flag名> -D <flag名>`

<img width="1141" alt="スクリーンショット 2020-03-30 22.30.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/ef6c3c5f-033e-6a54-cfab-a8482ff20e22.png">

## DEV sheme作成

sheme選択画面でDEV版が選べるようになります。
↓こんな感じ。

<img width="443" alt="スクリーンショット 2020-03-30 22.43.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/479492bf-17e0-6c1a-794f-2e0a4267095e.png">


Manage schemeを選択。

該当プロジェクトを選んで、Editボタンをクリック。
<img width="766" alt="スクリーンショット 2020-03-30 22.35.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/95ae8a65-7a45-8c2e-b516-32b8de8fc4f8.png">



Duplicate schemeをクリックして、既存のshemeを複製。
<img width="888" alt="スクリーンショット 2020-03-30 22.35.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/7fddbd98-52af-5067-30ec-0091b1013445.png">

名前が`copy of <プロジェクト名>`となっていると思うので、本番と見分けがつくように名前を設定。

<img width="897" alt="スクリーンショット 2020-03-30 22.38.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/d996624a-0f39-b8ad-ddcd-619ae2fa7cff.png">

Run, Test, Profile, ArchiveのBuild configurationをチェックする。
今回はRun, ArchiveのときにDevelopを向いてるようにしました。
<img width="892" alt="スクリーンショット 2020-03-30 22.39.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/d89a0759-1612-dca9-b264-4ae45358727b.png">

Product Bundle Identifierを変更
<img width="1150" alt="スクリーンショット 2020-03-30 22.50.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/5537e64c-e239-c84f-d65d-f2d73d2b3e75.png">

以上の作業で基本的なDEV環境作成はできていて、別々のアプリとして認識することが可能となりました。
次からは見た目もわかりやすくしていく作業です。

## Product nameを変更

ここでアプリのアイコンの名前を変更することができます。
<img width="276" alt="スクリーンショット 2020-03-31 4.11.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/26b80bc0-8392-500a-04b4-961356be057a.png">

Targets -> Build Setting -> Product Nameから`$(TARGET_NAME)DEV`に変更。

<img width="1146" alt="スクリーンショット 2020-03-30 23.20.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/dbf59a99-da52-13e2-73b1-99b7f939564e.png">

## アプリのアイコンを変更
まずはDev用のAppIconを作成し、`AppIcon_dev`と命名します。
<img width="1079" alt="スクリーンショット 2020-04-04 22.26.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/421f1636-d3fa-0a53-bbd2-a44cda89d6b4.png">

Targets -> Build Settings -> Asset Catalog App Icon Set Nameを開き、Developのところを、`AppIcon_dev`とします。
<img width="1079" alt="スクリーンショット 2020-04-04 22.28.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/27a4b5c9-8d96-05ed-5c49-7c816e7d7b81.png">

アイコンが切り替わりました！
<img width="441" alt="スクリーンショット 2020-04-04 22.31.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/1084a912-f27f-8d25-039f-e15f5951a404.png">




## FirebaseのDev版作成
iOS開発において、分析や配布のためにFirebaseを使用しているケースは多々あると思います。
DEV環境を作った際にはFirebaseでもその対応をする必要があります。

まずはFirebase上で、DevとReleaseでそれぞれプロジェクトを作成します。
その際にどちらもGoogleService-info.plistファイルを保存しておきます。
<img width="1043" alt="スクリーンショット_2020-04-04_22_09_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/bc1f34ae-619a-5d3e-6a2f-af7b199cae8c.png">

こんな感じで名前を変えて、配置します。
<img width="327" alt="スクリーンショット 2020-04-04 22.12.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/a8812fa2-204c-2ee1-d75d-22572cbfc04e.png">

Targets -> Build Phase -> 左上のプラスボタンから新規でRun Scriptを作成します。
CONFIGURATIONに応じて、参照するGoogleService-Inforファイルを切り替えて、BUILT_PRODUCTS_DIRディレクトリにコピペしています。

```
if [ "${CONFIGURATION}" == "Release" ]; then
cp "${PROJECT_DIR}/${PROJECT_NAME}/GoogleService/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
else
cp "${PROJECT_DIR}/${PROJECT_NAME}/GoogleService/GoogleService-Info-Develop.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
fi
```

<img width="1086" alt="スクリーンショット 2020-04-04 22.32.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/f31913eb-998a-54ee-c07c-2de6f6127c76.png">




## ハマったところ
アプリ起動後、画面を読み込む部分でクラッシュしました。
原因はDEV環境内で、Storyboard内のUIViewControllerのModuleが本番環境を向いていることでした。
Inherit Module From Targetにチェックをつけると、Moduleを指定しなくても、よしなにやってくれるので、クラッシュする場合は該当のVCのこの箇所をチェックすると良いです。
[参考](https://stackoverflow.com/questions/38308329/swift-setvalueforundefinedkey-this-class-is-not-key-value-coding-compliant-f/49018534)
<img width="263" alt="スクリーンショット 2020-03-31 4.15.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/b03962e3-9244-549f-502e-3ce2cc2eed0b.png">

## error: Could not get GOOGLE_APP_ID in Google Services file from build environment

これはFabric初期化のタイミングでGoogleService-Info.plistが生成されていないのが原因です。
Fabric導入した際に、`"${PODS_ROOT}/Fabric/run"`をRun Scriptとして追加したと思いますが、Firebase ConfigurationのScriptはそれより前に実行されるようにしてください。
<img width="1115" alt="スクリーンショット_2020-04-05_1_13_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155459/05528757-ca55-9101-4388-77a9746ed53b.png">


## 参考リンク
https://qiita.com/Todate/items/a2e6a26731c79bd23e02#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3
https://qiita.com/KazaKago/items/aacf6eaec65b6d4244d0