Swift에서 plist를 이용하여 각 환경(개발, 정식 공연 등)에 대한 설정치를 바꾸다

13626 단어 Swift

1. Custom Configuration 추가


step1. PROJECT->info->Configuration에서 추가


「+」->「Duplicate "Debug"Configuration」
추가 전

추가 후

2. Info.plist 편집


step1. Configuration 추가


Key:Configuration,Value:${CONRIGURATION}추가

step2. 출력 확인


AppDelegate.swift
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. Scheemes 수정


step1. Edit Schomes에서 Build Configuration 변경



step2. CocoaPods 업데이트(Cocoapds 미사용 시 필요없음)


추가된 Configuration (여기는 Development) 의 xcconfig가 없으면 오류가 발생하여 업데이트됩니다.
$ pod update

4. Configuration.plist 추가


step1. 새 plist



step2. 항목 추가



step3. 출력 확인


AppDelegate.swift
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. 새 AppConf 클래스


(생략)

step2. AppConf 클래스 편집


AppConf.swift
import Foundation

final class AppConf {

    private static let sharedInstance = AppConf()
    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. 동작 확인


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

    for i in 1...5 {
        print("\(i)回目: \(AppConf.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
THE RIGHT WAY TO WRITE A SINGLETON

좋은 웹페이지 즐겨찾기