主に備忘録

基本的には自分用の備忘録っぽいもの。

Swiftでplistを利用して環境(開発、本番等)ごとに設定値を変える

1. Custom Configurationを追加する

step1. PROJECT -> info -> Configurationsから追加

「+」->「Duplicate "Debug" Configuration」
追加前 f:id:ita3y:20151123161536p:plain
追加後 f:id:ita3y:20151123160034p:plain

2. Info.plistを編集する

step1. Configurationを追加する

Key: Configuration, Value: ${CONFIGURATION} を追加
f:id:ita3y:20151123160609p:plain

step2. 出力を確認

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Configuration取得
    let configuration = NSBundle.mainBundle().infoDictionary!["Configuration"]
    print("Current Configuration > \(configuration)")

    return true
}

こんな感じに出力されればOK

Current Configuration > Optional(Debug)

3. Schemesを変更する

step1. Edit SchemesからBuild Configurationを変更する

f:id:ita3y:20151123163641p:plain

step2. CocoaPodsを更新する(CocoaPods未使用の場合は不要)

追加したConfiguration(ここではDevelopment)のxcconfigが無いとエラーになるので更新する

$ pod update

4. Configuration.plistを追加する

step1. plistを新規作成

f:id:ita3y:20151123161922p:plain

step2. 項目を追加

f:id:ita3y:20151123162513p:plain

step3. 出力を確認

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let mainBundle = NSBundle.mainBundle()
    // Configuration取得
    let configuration = mainBundle.infoDictionary!["Configuration"]
    
    // Configurations.plist読み込み
    let path = mainBundle.pathForResource("Configurations", ofType: "plist")
    let configurations = NSDictionary(contentsOfFile: path!)

    // Load Variables for Current Configuration
    let variables = configurations?.objectForKey(configuration!) as! [String : AnyObject]

    print(variables["APIEndpoint"])

    return true
}

こんな感じに出力されればOK

Optional(http://development.example.com)

5. 使いやすくする

step1. Configurationクラスを新規作成

(省略)

step2. Configurationクラスを編集

import Foundation

final class Configuration {

    private static let sharedInstance = Configuration()
    private var configuration: String
    private var variables: [String: AnyObject]

    private init() {

        // Singletonの確認用
        print("Configuration initialization")

        let mainBundle = NSBundle.mainBundle()
        // Fetch Current Configuration
        self.configuration = (mainBundle.infoDictionary?["Configuration"]) as! String

        // Load Configurations
        guard let path = mainBundle.pathForResource("Configurations", ofType: "plist") else {
            self.variables = [:]
            return
        }
        let configurations =  NSDictionary(contentsOfFile: path)
        // Load Variables for Current Configuration
        self.variables = configurations?.objectForKey(self.configuration) as! [String : AnyObject]
    }

    class func Configuration() -> String {
        return sharedInstance.configuration
    }

    class func APIEndpoint() -> String {
        guard let endpoint = sharedInstance.variables["APIEndpoint"] else {
            return ""
        }
        return endpoint as! String
    }

    class func isLoggingEnabled() -> Bool {
        guard let enabled = sharedInstance.variables["LoggingEnabled"] else {
            return false
        }
        return enabled as! Bool
    }
}

step3. 動作確認

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    for i in 1...5 {
        print("\(i)回目: \(Configuration.APIEndpoint())")
    }

    return true
}

こんな感じに出力されればOK

Configuration initialization
1回目: http://development.example.com
2回目: http://development.example.com
3回目: http://development.example.com
4回目: http://development.example.com
5回目: http://development.example.com

6. 参考サイト

iOS Quick Tip: Managing Configurations With Ease - Envato Tuts+ Code Tutorial

The Right Way To Write a Singleton — KrakenDev