Xcode

XcodeでDevelop/Staging/Release環境を上手に切り分ける方法

はじめに

アプリに限らずだと思いますが、開発・ステージング・本番の3環境で制作が進んでいくケースは多いと思います。

ここでは、私がXcodeでプロジェクトを作成する際に設定する内容をまとめたいと思います。

基本的な設定の流れ

初期状態

Xcodeでプロジェクトを新規作成すると、Build ConfingurationはDebugとReleaseの2種類が作られます。
build_first.png

Build Configrationの設定を好みの形に変更する

タイトルの通り、Develop/Staging/Releaseの3つで作成します。
[+]を押して「Debug」を複製する形で「Staging」を作成し、「Debug」はダブルクリックで名称を「Develop」に変更します。
build_copy.png

最終的に、このようにします。
build_finish.png

PROJECT -> Build Settingsの修正

Apple LLVM 9.0 – Preprocessing -> Preprocessor Macros
change_Preprocessor_Macros2.png

Swift compiler - Custom Flags -> Other Swift Flags
change_other_swift_flags2.png

ソース上で分岐

上記のように設定すると、ソース上から以下のように分岐で切り分けられるようになります。

class ViewController: UIViewController {

    @IBOutlet weak var testLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        #if DEVELOP
            self.testLabel.text = "開発中"
        #elseif STAGING
            self.testLabel.text = "確認してください"
        #else
            self.testLabel.text = "本番向けです"
        #endif
    }

}

設定上で分岐

個人的な好みですが、設定に関する内容はInfo.plistにまとめたいので、User Definedで定義して、呼び出す形にしてみます。

User Definedで各環境ごとの設定を作成

PROJECT -> Build Settings 上で、[+]を押して、Add User-Defined Settingを選択します。
user_defined_add.png

一番下までスクロールすると、User Definedの項目にNEW_SETTINGが増えているので、リネームして、各環境ごとの値を緑枠の中で設定します。
user_defined_hogehoge.png

Info.plistに項目を追加

ソースから呼び出す際のキーを追加し、型はStringに、Valueには$(HOGEHOGE)と設定します。
(今回は型をStringで設定しましたが、Numberなどでも出来るのかは未検証です)

info_plist.png

ソースから呼び出す

指定したキーで取得できます。

let hoge = Bundle.main.object(forInfoDictionaryKey: "kHogehoge") as! String

Schemeの設定

ビルドする際に一発で切り替えできるように、Schemeの設定を環境ごとに作ってしまいましょう。

Manage Schemes...を選択

scheme_manage.png

既存のSchemeを複製

scheme_dup.png

分かりやすくリネームしたのち、各項目(RunとかTestとか)上にあるBuild Configrationの設定を統一させて、(その他設定を変えたい所があれば適宜変更して)、Closeします。
(必要分繰り返して、全環境分作成します)
scheme_copy.png

ビルド時に切り替え

ビルド時に実行・停止ボタンの右側ですぐ切り替えられるようになりました。
scheme_finish2.png

他にも色々切り替えたい

Bundle Identifier

本番環境のBundle Identifierの後ろに付け加えて、同じ端末へ別アプリとしてインストールできるようにしてみます。

iphonex.png

環境 Bundle Identifier
本番 jp.co.hogehoge.BuildConfigurationSample
開発 jp.co.hogehoge.BuildConfigurationSample .develop
ステージング jp.co.hogehoge.BuildConfigurationSample .staging

SUFFIXを追加

User Definedの項目にBUNDLE_ID_SUFFIXを追加します。
user_defined_bundle_id_suffix.png

TARGETS -> Build Settingsの修正

Packaging -> Product Bundle Identifierの共通設定の部分を開き、現在設定されているBundle Identifierの後ろに${BUNDLE_ID_SUFFIX}を追記します。
xcode_bundle_id_suffix.png

アプリのアイコン

ホーム画面で表示されるアイコンを変更します。
(Bundle Identifierで使用したBUNDLE_ID_SUFFIXを使う前提で書かれています)
iphonex_icon.png

Assets.xcassetsに各アイコンを準備

標準だとAppIcon一つだけなので、複製してAppIcon.developAppIcon.stagingを作成し、それぞれにアイコンを設定します。
appicon_assets.png

TARGETS -> Build Settingsの修正

Asset Catalog Compiler - Options -> Asset Catalog App Icon Set Nameの共通設定の部分を開き、現在設定されているAppIconの後ろに${BUNDLE_ID_SUFFIX}を追記します。
appicon_editing.png

アプリ名

ホーム画面でアイコン下に表示されるアプリ名を変更します。
iphonex_app_name.png

PREFIXを追加

アプリ名の表示領域はかなり短い(全角7文字程度?)ので、頭に「D」やら「S」やらをつけるだけに留めています。
Bundle Identifierと同様に、User Definedの項目にPRODUCT_NAME_PREFIXを追加します。
user_defined_product_name_prefix.png

TARGETS -> Build Settingsの修正

Packaging -> Product Nameの共通設定の部分を開き、現在設定されている名前の頭に${PRODUCT_NAME_PREFIX}を追記します。
xcode_product_name.png

おわりに

GitHubに上げました。
https://github.com/Todate/BuildConfigurationSample