【Xcode】開発環境を設定してみた

# はじめに

iOSのアプリ開発において`Debug`, `Release`以外に開発環境として`Staging`を設定したく、
こちらの記事を参考にやってみました

https://qiita.com/Todate/items/a2e6a26731c79bd23e02

# 環境
Xcode 14.0

# 内容

### Stagingを定義する
`Info`の`Configurations`の`+`から追加
![スクリーンショット 2022-10-11 22.16.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/01c0081a-fac4-c391-493f-08578d70eb44.png)
`Depulicate "Debug" Configuration`を選択
![スクリーンショット 2022-10-11 22.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/825e49b4-1341-ba42-1e2e-fb00a73f44f5.png)
複製したものを`Staging`に変更
![スクリーンショット 2022-10-11 22.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/0b334549-68d6-baaf-0be7-8af368f1d6ac.png)

### Build Settingを修正する
`Preprocessor Macros`の値を修正
![スクリーンショット 2022-10-11 22.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/72daeba6-af95-cc8e-8c88-2a35f02f7113.png)
`Staging`の値が複製した時の値`DEBUG=1`となっているので`STAGING=1`にする
![スクリーンショット 2022-10-11 22.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/9de9fc8a-2f00-7f23-9bdd-9378788d6307.png)

### User Definedで各環境ごとの値を設定する
`+`から`Add User-Defined Setting`を追加
![スクリーンショット 2022-10-11 22.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/5d853867-a300-a2a2-2e28-deac2f8a6fbc.png)
`NEW_SETTING`が追加されるので、適当な値を入れていく
![スクリーンショット 2022-10-11 22.29.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/e6db8fd2-4de1-5632-9f62-37599750e0d4.png)
環境ごとの値を定義
![スクリーンショット 2022-10-11 22.38.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/55f79d9e-5aa0-d5e1-75bd-4151681fc7dc.png)

#### Info.plistで定義する
`Info`タブから`Custom iOS Target Properties`を開き、`+`から新規追加
![スクリーンショット 2022-10-11 22.38.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/777ecd3b-a662-c69f-9e5c-27aef151dc7f.png)
`$(User-Definedで設定した値)`を定義し、適当な名前をつけておく
![スクリーンショット 2022-10-11 22.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/95fb3405-9481-6c66-16d7-095f2f064895.png)
　Infoタブから定義した値が消えて、`Info.plist`が作られる
![スクリーンショット 2022-10-11 22.56.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/c662447b-80e4-34e5-bd40-053f6208247d.png)
コードからは以下のような形で環境ごとの値を使える

```swift
Bundle.main.object(forInfoDictionaryKey: "appNameSetting") as! String
```

### Schemeを追加する
`Manage Schemes`から追加
![スクリーンショット 2022-10-11 23.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/eb4a0db9-27f1-4c44-4809-a16ade84c4de.png)
既存のものを`Duplicate`する
![スクリーンショット 2022-10-11 23.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/ab800a01-234c-5fd6-8f92-ba743c657042.png)
`Build Configuration`から`Staging`を選び、適当な名前と設定をしていく
![スクリーンショット 2022-10-11 23.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/718c3a6c-d249-39ef-84b1-96b22ecd82d5.png)
Schemeをクリックすると後から名前を変更することができる
![スクリーンショット 2022-10-11 23.34.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/d304bba0-027b-47ce-df2f-dcd955dee242.png)
`Shared`についてはこちらの記事を見て理解できました。

https://dev.classmethod.jp/articles/xcode-scheme-shared/

### Bundle Identifierを環境ごとに分ける
`User-Defined`に`BUNDLE_ID_SUFFIX`という名前で`.debug`と`.staging`を定義
![スクリーンショット 2022-10-12 0.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/a45baab1-519b-f8db-0669-0dd55c2c1b0c.png)
`Build Settings`で`Product Bundle Identifier`を検索
![スクリーンショット 2022-10-12 0.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/b491e427-d042-de3c-902c-a39dc18c7a52.png)
Bundle Identifierの末尾に`${BUNDLE_ID_SUFFIX}`を追加する
![スクリーンショット 2022-10-12 0.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/b0170e63-e8d0-f987-8c1d-a0ce8f288655.png)

### アプリアイコンを環境ごとに分ける

Targetの`Asset Catalog Compiler`の`Primary App Icon Set Name`を修正
![スクリーンショット 2022-10-12 0.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/43df5df6-89ff-7f82-4209-a39e984c9788.png)
AppIconの末尾に`${BUNDLE_ID_SUFFIX}`を付ける
![スクリーンショット 2022-10-12 0.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/527ef025-96d4-934b-f6d5-e4ec66124767.png)
この値と同じIconを用意すると環境ごとにアイコンが変わるようになる

### アプリ名を環境ごとに分ける
`User-Defined`に`PRODUCT_NAME_PREFIX`という名前で`Debug`と`Staging`を定義
![スクリーンショット 2022-10-12 0.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/b3eff51e-c152-4ecd-94a3-acdc426bb775.png)
Targetの`Product Name`を修正する
![スクリーンショット 2022-10-12 0.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/f0a72bcf-8f55-7069-3e77-21ba48cd5acf.png)
`${TARGET_NAME}`の前に`${PRODUCT_NAME_PREFIX}`を付ける
![スクリーンショット 2022-10-12 0.49.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/ea6fee2b-c0ba-52f3-f2fb-cd7cfdd6cfc2.png)

### おまけ：　Firebaseを環境ごとに分ける

こちらの記事を参考にやってみました

https://www.yururiwork.net/archives/974

やり方はいくつかあるようですが、個人的に1番わかりやすく感じたので、こちらの実装方法にしました

```swift
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
#if RELEASE
        let resource = "GoogleService-Info"
#elseif STAGING
        let resource = "GoogleService-Info-stg"
#else
        let resource = "GoogleService-Info-stg"
#endif
        
        if let filePath = Bundle.main.path(forResource: resource, ofType: "plist") {
            guard let options = FirebaseOptions(contentsOfFile: filePath) else {
                assert(false, "Could not load config file.")
            }
            FirebaseApp.configure(options: options)
        } else {
            FirebaseApp.configure()
        }
        return true
    }
}
```

# おわりに

参考にさせてもらった記事がとてもわかりやすく、大変助かりました

# 参考
https://qiita.com/Todate/items/a2e6a26731c79bd23e02

https://dev.classmethod.jp/articles/xcode-scheme-shared/

https://www.yururiwork.net/archives/974