반응형
개발 환경에 따라 서로 다른 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 ?? ""
}
}
참고
반응형