87
68

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iOSアプリ開発における環境切り替え(Debug⇔Release)方法まとめ

Last updated at Posted at 2019-02-01

iOSに限らず、アプリ開発においてAPIのURLやアクセスキーといった環境変数を開発用ビルドとリリース用ビルドで切り替えられるようにしておくことは重要です。
XCodeでこれを実現する方法にはいくつかの選択肢があると思います。

本記事では、今のところ私がシンプルで良いと思っているやり方をご紹介したいと思います。

環境変数を切り替える

ここでは開発用ビルドとリリース用ビルドでAPIのURLを切り替えることを例とします。

Configuration

XCodeではアプリのビルド設定はConfigurationと呼ばれており、デフォルトではDebugReleaseの2つが作成されています。

image.png

基本的にアプリの開発中はDebugを使用します。
XCodeメニューからProduct > Scheme > Edit Scheme...を開くと、ビルド設定としてDebugが指定されていることがわかります。

image.png

環境変数の設定

ここで紹介する環境変数の切り替え方法では、登場人物は以下の3つです。

  • ターゲットのBuild Settings
  • Info.plist
  • Configuration構造体

環境変数(ここではAPIのURL)を参照する流れはこんな感じです。

APIクライアント -> Configuration構造体 -> Info.plist -> ターゲットのBuild Settingsに定義された環境変数

ターゲットのBuild Settings

まず、ターゲットのBuild Settingsに環境変数を定義します。
以下のように、ターゲットを選択してBuild Settingsタブ開き、Add User-Defined Settingをクリックします。

image.png

すると、Build Settingsの一番下のUser-Defined欄に項目が追加されるので、名前をSE_API_URLに変更します。
そして、ビルド設定ごとに値を入力できるようになっているので、Debugには開発用APIのURL、Releaseには本番用APIのURLを入力します。

image.png

他の環境変数と名前がかぶらないようにプレフィックスをつけると良いようです。ここではSwitchEnvというプロジェクト名の頭文字を取ってからSEというプレフィックスをつけました。

Info.plist

次に、Info.plistから先程定義したSE_API_URLを参照します。

以下のようにAppConfigというDictionary型の項目を追加します。
そしてその中にApiUrlという項目を追加し、値として$(SE_API_URL)を入力します。
$()でBuild Settingsに定義された環境変数を参照することができます。

image.png

今回は環境変数を一つだけ定義しますが、今後変数が増えていくことを見越して整理しやすいようにするためにAppConfigという入れ物を作っています。

Configuration構造体

環境変数をソースコードから参照するために、Configurationという名前の構造体を作成します(名前が紛らわしいですが)。
この構造体はシングルトンとして実装し、他のコードはこのシングルトンインスタンス経由で環境変数を参照します。

import Foundation

struct Configuration {
    static let shared = Configuration()

    private let config: [AnyHashable: Any] = {
        let path = Bundle.main.path(forResource: "Info", ofType: "plist")!
        let plist = NSDictionary(contentsOfFile: path) as! [AnyHashable: Any]
        return plist["AppConfig"] as! [AnyHashable: Any]
    }()

    let apiUrl: String

    private init() {
        apiUrl = config["ApiUrl"] as! String
    }
}

APIクライアントは以下のようにURLを参照します。

let url = URL(string: Configuration.shared.apiUrl)!

アプリ名、バンドルIDの切り替え

ビルド設定ごとに別々のアプリとしてインストールできるようにしておくと便利です。
ここではそのやり方について紹介します。

image.png

iOSではバンドルIDでアプリを一意に識別するので、開発用ビルドとリリース用ビルドでバンドルIDを分ければ別々のアプリとしてインストールできることになります。

まず、ターゲットのBuild SettingsでProduct Bundle Identifierという項目を探します。
そして、Debugの方の値の最後に-debugというサフィックスを追加します。
これでDebugReleaseでバンドルIDが変わります。

image.png

アプリの表示名も別々になるようにしましょう。
ターゲットのBuild SettingsにSE_BUNDLE_DISPLAY_NAMEという環境変数を追加します。
そしてDebugReleaseで別々の名前を入力します。

image.png

次に、Info.plistにBundle display nameという項目を追加し、$(SE_BUNDLE_DISPLAY_NAME)という値を入力します。
これでアプリの表示名がビルド設定ごとに変わります。

image.png

Firebaseプロジェクトの切り替え

環境変数の切り替えという点で共通するので、以前書いた記事のリンクを載せておきます。

開発版とリリース版でFirebaseのGoogleService-Info.plistを切り替える

アプリアイコンの切り替え

アプリアイコンの切り替え方法は以下の記事で知りました。
ビルド設定の切り替えについても以下の記事の方が幅広く紹介されてますね。

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

参考記事

87
68
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
87
68

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?