LoginSignup
1
3

More than 5 years have passed since last update.

XCodeでproduction/staging/developをTargetで切り替えて、APIも切り替える。

Last updated at Posted at 2017-09-20

XCodeでproduction/staging/developをTargetで切り替える

  • 別に新機能でも何でもないですが、知らない人の参考になればと思い書きました。
  • これよりもっといい方法があれば教えていただければと思います。

やりたいこと

  • ソース内にフラグを持たさずに、TargetでAPIなどを切り替える => git管理してても差分なし!!!!!!!!!

新たにTargetを作成する

  • 既存のTargetを右クリックし、Deplicateを押します。

Screen Shot 2017-09-19 at 0.47.16.png

  • {元のプロゲクト名} copy となるので、Dev{プロジェクト名}や、Stg{プロジェクト名}とします。

Plistを複製する

  • 同じくPlistも新たに作成します。複製してもいいですし、新たに作成してもいいです。

Screen Shot 2017-09-19 at 0.53.44.png

  • Bundle display name やその他の設定などをそれ用に変えると良いかもしれません。

スキームを編集する

  • ManagementSchemeを押します。

Screen Shot 2017-09-19 at 22.46.46.png

Screen Shot 2017-09-19 at 22.49.11.png

  • {プロジェクト名} copyというスキームが自動作成されていますが、−で削除します。
  • そして、再度+で追加すると、Dev{プロジェクト名}や、Stg{プロジェクト名}としてスキームを登録できます。
  • shared にもチェックを入れておきます。

Plistを関連付ける

  • 作成したTargetを選択し、build settingsから Plistを検索すると、Info.plistのPathが{プロジェクト名} copy.plist となっているので、自分で作成したplistファイルに書き換えます。

Screen Shot 2017-09-19 at 22.52.35.png

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

Screen Shot 2017-09-19 at 22.56.39.png

  • DEV=1 STAGING=1などするのがおすすめです。

APIをPlistで管理して、APIを出し分ける

  • これは完全に私の場合ですが、APIディレクトリを切ってそこにAPIのHOSTやバージョンを管理しています。
  • 新規で、Plistを作成します。

  • API.plist
    Screen Shot 2017-09-19 at 23.00.32.png

  • DevAPI.plit
    Screen Shot 2017-09-19 at 23.01.57.png

  • 今は変わってないですが、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いいねチャレンジの一環として書かせていただきました。ありがとうございました。
1
3
1

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
1
3