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

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

More than 1 year has passed since last update.

はじめに

アプリに限らずだと思いますが、開発・ステージング・本番の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

外部サービスの設定ファイル

FirebaseのGoogleService-Info.plistや、AWSのawsconfiguration.jsonなど、外部サービスを使う際に設置を求められる設定ファイルを管理する方法です。

AWSのawsconfiguration.jsonを例に説明します。

とりあえずの保存場所に置いておく

リネームするかフォルダで分けるかは好みですが、環境別の設定ファイルを用意します。

├── {PROJECT_NAME}
│   ├── AWS
│   │   └── configuration
│   │       ├── awsconfiguration-debug.json
│   │       └── awsconfiguration-release.json

Build Phaseで実行されるスクリプトを書く

TARGETS > Build Phasesで、Script Phaseを用意します。

hoge.png

shellを書く黒い欄に、以下のコードを記述します。
(保存場所やファイル名は適宜変更してください)

if [ "${CONFIGURATION}" == "Release" ]; then
cp "${PROJECT_DIR}/${PROJECT_NAME}/AWS/configuration/awsconfiguration-release.json" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/awsconfiguration.json"
echo "Production awsconfiguration copied."
else
cp "${PROJECT_DIR}/${PROJECT_NAME}/AWS/configuration/awsconfiguration-debug.json" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/awsconfiguration.json"
echo "Development awsconfiguration copied."
fi

あとは、schemeを切り替えてビルドすると、環境別の設定ファイルが本来のファイル名であるべき場所にコピーされます。

おわりに

GitHubに上げました。(設定ファイルの切り替え例は含まれません)
https://github.com/Todate/BuildConfigurationSample

Todate
30歳からIT関係に転職、とあるシステム会社でiOS/Androidアプリのエンジニアとして4年働き、フリーランスも3年弱経験し、その後ヘプタゴンへジョイン。
heptagon
東北を拠点としてクラウドのインテグレーションサービスを行っています。
https://heptagon.co.jp/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした