Xcode
229
どのような問題がありますか?

この記事は最終更新日から3年以上が経過しています。

投稿日

更新日

Organization

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

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

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

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
Todate
30歳からIT関係に転職、とあるシステム会社でiOS/Androidアプリのエンジニアとして4年働き、フリーランスも3年弱経験し、その後ヘプタゴンへジョイン。
heptagon
東北を拠点としてクラウドのインテグレーションサービスを行っています。

コメント

リンクをコピー
このコメントを報告

とてもわかりやすく解説していただきありがとうございます!

0
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
229
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー