XCodeでproduction/staging/developをTargetで切り替える
- 別に新機能でも何でもないですが、知らない人の参考になればと思い書きました。
- これよりもっといい方法があれば教えていただければと思います。
やりたいこと
- ソース内にフラグを持たさずに、TargetでAPIなどを切り替える => git管理してても差分なし!!!!!!!!!
新たにTargetを作成する
- 既存のTargetを右クリックし、Deplicateを押します。

-
{元のプロゲクト名} copy
となるので、Dev{プロジェクト名}や、Stg{プロジェクト名}とします。
Plistを複製する
- 同じくPlistも新たに作成します。複製してもいいですし、新たに作成してもいいです。

-
Bundle display name
やその他の設定などをそれ用に変えると良いかもしれません。
スキームを編集する
- ManagementSchemeを押します。


- {プロジェクト名} copyというスキームが自動作成されていますが、−で削除します。
- そして、再度+で追加すると、Dev{プロジェクト名}や、Stg{プロジェクト名}としてスキームを登録できます。
- shared にもチェックを入れておきます。
Plistを関連付ける
- 作成したTargetを選択し、build settingsから Plistを検索すると、Info.plistのPathが{プロジェクト名} copy.plist となっているので、自分で作成したplistファイルに書き換えます。

- また、マクロ用の変数を追加してもいいと思います。

- DEV=1 STAGING=1などするのがおすすめです。
APIをPlistで管理して、APIを出し分ける
-
これは完全に私の場合ですが、APIディレクトリを切ってそこにAPIのHOSTやバージョンを管理しています。
-
新規で、Plistを作成します。
-
API.plist

- DevAPI.plit

- 今は変わってないですが、APIバージョンのv2とか、dev用のHOSTとか書いておきます
ConfigでAPI.plistを読む
Config/Config.swift
struct Config {
static let host = Config.plist(property: "host")
static let version = Config.plist(property: "version")
static let mode = Config.plist(property: "api")
static let socket = Config.plist(property: "socket")
static let bundleID = Bundle.main.bundleIdentifier ?? Config.host
#if DEMO
static let plistPath = "DemoApi"
#elseif DEV
static let plistPath = "DevApi"
#else
static let plistPath = "Api"
#endif
static let realmAccessToken: String = MonaKeys().realmAccessToken() ?? ""
static func plist(property: String) -> String {
let pat = Config.plistPath
guard let path = Bundle.main.path(forResource: pat, ofType: "plist") else { return "" }
var dict = NSDictionary(contentsOfFile: path) as? [String: Any]
if let string = dict?.removeValue(forKey: property) as? String {
return string
}
return ""
}
}
- 結局のところはここで出し分けているので、APIをPlistにする意味はあまりないんですねどね。
まとめ
- 重要なのはTargetを切り替えて、そこでマクロを使って書き換えることができます。
- フラグなどで切り替えてもいいですが、ソースコードの改変が生じるのでそこをなくせます。
- また、読み込みたいソースなども切り替えられるので規模が大きくなると便利かと思います。
- 以上、swift関連の記事はまさかりが多く飛んできそうで怖いですが、1000いいねチャレンジの一環として書かせていただきました。ありがとうございました。