Danny의 iOS 컨닝페이퍼
article thumbnail
반응형

 

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

 

1. plist 생성

Debug , Production(Release) 모드에서

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

 

2. 코드

<swift>
/// 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 ?? "" } }

 

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

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

 

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

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

 

4. 사용

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

호출하면 됩니다.

 

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

<swift>
apiKeyLabel.text = ENV.SERVICE_API_KEY clientIDLabel.text = ENV.SERVICE_CLIENT_ID

 

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

 

 

5. 추가

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

우아하게 코드 짜기

<swift>
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 ?? "" } }

 

 

6. 참고

 

 

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

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