Danny의 iOS 컨닝페이퍼
article thumbnail

 

개발 환경에 따라 서로 다른 plist 값 읽는 방법

 

plist 생성

Debug , Production(Release) 모드에서

서로 다른 값을 받기 위해 plist 2개를 준비합니다.

 

코드

/// plist를 읽을 수 있게 초기화 시킴
class BaseENV {
    
    let dict: NSDictionary
    
    init(resourceName: String) {
        guard let filePath = Bundle.main.path(forResource: resourceName, ofType: "plist"),
              let plist = NSDictionary(contentsOfFile: filePath) else {
            fatalError("Couldn't find file '\(resourceName).plist'.")
        }
        self.dict = plist
    }
}

// API Key를 추가시킬 때마다 속성을 추가한다(변수명은 원하는대로 설정)
protocol APIKeyable {
    var SERVICE_API_KEY: String { get }
    var SERVICE_CLIENT_ID: String { get }
}

/// Debug 모드
class DebugENV: BaseENV, APIKeyable {
    
    init() {
        super.init(resourceName: "DEBUG-Keys")
    }
    
    // 키값은 plist의 dic에 추가한 속성의 이름을 정확히 써야 된다.
    // 딕셔너리에 직접 값을 넣어서 받아도 되고 또는 object 메서드를 사용해도 된다.
    var SERVICE_API_KEY: String {
        dict["SERVICE_API_KEY"] as? String ?? ""
    }
    
    var SERVICE_CLIENT_ID: String {
        dict.object(forKey: "SERVICE_CLIENT_ID") as? String ?? ""
    }
}

/// Production 모드
class ProdENV: BaseENV, APIKeyable {
    
    init() {
        super.init(resourceName: "PROD-Keys")
    }
    
    var SERVICE_API_KEY: String {
        dict.object(forKey: "SERVICE_API_KEY") as? String ?? ""
    }
    
    var SERVICE_CLIENT_ID: String {
        dict.object(forKey: "SERVICE_CLIENT_ID") as? String ?? ""
    }
}

 

앱 델리게이트에서 전역 변수 생성

앱 델리게이트 class 바깥쪽에서 전연 변수 생성.

 

첫 시작이 앱 델리게이트 파일이므로 global로 변수로 설정이 가능한 듯 싶다.

var ENV: APIKeyable {
    #if DEBUG
    return DebugENV()
    #else
    return ProdENV()
    #endif
}

 

사용

앱 델리게이트에 만들어놓은 전역 변수인 ENV으로 접근하여

호출하면 됩니다.

 

값이 제대로 출력되는지 UILabel을 통해 확인해봅시다.

apiKeyLabel.text = ENV.SERVICE_API_KEY
clientIDLabel.text = ENV.SERVICE_CLIENT_ID

 

개발 환경에 따라서 값을 다르게 받을 수 있다.

 

 

추가

enum을 사용하여 여러 API 키 취급하기

우아하게 코드 짜기

class BaseENV {
    
    enum Key: String {
        case SERVICE_API_KEY
        case SERVICE_CLIENT_ID
    }
    
    let dict: NSDictionary
    
    init(resourceName: String) {
        guard let filePath = Bundle.main.path(forResource: resourceName, ofType: "plist"),
              let plist = NSDictionary(contentsOfFile: filePath) else {
            fatalError("Couldn't find file '\(resourceName).plist'.")
        }
        self.dict = plist
    }
}

protocol APIKeyable {
    var SERVICE_API_KEY: String { get }
    var SERVICE_CLIENT_ID: String { get }
}

class DebugENV: BaseENV, APIKeyable {
    
    init() {
        super.init(resourceName: "DEBUG-Keys")
    }
    
    var SERVICE_API_KEY: String {
        dict[Key.SERVICE_API_KEY.rawValue] as? String ?? ""
    }
    
    var SERVICE_CLIENT_ID: String {
        dict.object(forKey: Key.SERVICE_CLIENT_ID.rawValue) as? String ?? ""
    }
}

class ProdENV: BaseENV, APIKeyable {
    
    init() {
        super.init(resourceName: "PROD-Keys")
    }
    
    var SERVICE_API_KEY: String {
        dict.object(forKey: Key.SERVICE_API_KEY.rawValue) as? String ?? ""
    }
    
    var SERVICE_CLIENT_ID: String {
        dict.object(forKey: Key.SERVICE_CLIENT_ID.rawValue) as? String ?? ""
    }
}

 

 

참고

 

 

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!