iOS 에서 공개되면 안되는 (git 에 등록되면 안되는) config 정보 관리하기

개요

종종 서버에서 공개되면 안되는 키 값이나 서버 주소 등을 json 파일과 같은 key-value 관리에 용이한 파일로 만든 후 .gitignore 에 추가해서 git 에 올라가지 않게 한 후 관리합니다.

iOS 상에서도 API 키 값 등, 외부에 공개되면 안되는 값을 어떻게 관리할까 싶어 이런저런 글들을 많이 찾아봤는데,
plist 파일이 key-value 파일이기 때문에 관리하기 가장 적합하다고 판단했습니다.

방법

1. .gitignore 에 config.plist 추가

아래와 같이 추가해줍니다.

### .gitignore
...
# frontend config
config.plist

2. XCode 에서 plist 파일을 '파일 추가’로 만들기

File → New → File… 로 파일 추가를 연 후 아래로 스크롤을 내려보면 Resource 탭에 Property list 라고 있습니다.

이를 선택한 후 config.plist 로 이름을 지어줍니다.

파일을 만들고 나면 기본이 Dictionary 형태로 파일이 만들어집니다. key-value 구조가 필요한 것이므로 그대로 필요한 값들을 추가합니다.

3. plist 파일을 읽어들이는 함수 만들기

plist 를 읽는 함수를 구현합니다. 저희 Memolight 팀의 경우, Utils.swift 라는 파일을 만들어 그 안에 정의해넣었습니다. 코드는 갓택오버플로우를 참고해왔습니다. 사용법은 4번을 참고해주세요.

import Foundation

func getPlist(withName name: String) -> [String: String]?
{
    if  let path = Bundle.main.path(forResource: name, ofType: "plist"),
        let xml = FileManager.default.contents(atPath: path)
    {
        return (try? PropertyListSerialization.propertyList(from: xml, options: .mutableContainersAndLeaves, format: nil)) as? [String: String]
    }

    return nil
}

4. 필요한 값을 불러와 사용하기

아래 코드와 주석을 확인해주시길 바랍니다.

// 이 코드는 Request.swift 코드의 일부를 가져온 것입니다.
// host 는 Request class 의 멤버 변수로 선언 돼있고, 아래 코드는 init() 안에 있는 코드입니다.
// config 라는 이름을 가진 plist 파일을 가져옵니다.
// optional 이기 때문에 if 로 검사해줍니다.
if let config = getPlist(withName: "config") {
    // 키 값을 dictionary 조회하듯이 조회합니다.
    // 마찬가지로 optional 이기 때문에 if 로 검사해줍니다.
    if let SERVER_ADDR = config["SERVER_ADDR"] {
        print(SERVER_ADDR)
        self.host = SERVER_ADDR
    }
    // 조회에 실패한 경우입니다.
    // 초기화는 해야하므로 앱이 크래시날만한 값을 넣습니다.
    else {
        self.host = ""
    }
}
// 위와 마찬가지로 초기화는 해야하므로 앱리 크래시날만한 값을 넣습니다.
else {
    self.host = ""
}

여담

iOS 로 팀워크를 하다보면 git 에서 수정하지 않았는데 자동으로 변경되는 파일들이 많아 충돌이 많이 일어납니다.

config.plist 를 .gitignore 에 추가하고, 그 외에 추가적으로 필요한 .gitignore 설정들은 다음 글에서 잘 설명한 것 같습니다.

http://codershigh.dscloud.biz:30004/t/git-ignore/138?u=s0metimes

혹시 다른 팀은 어떻게 하고 있는지 궁금하고, 이보다 나은 방법이 있는지 또한 궁금합니다.

좋아요 4

민감한 정보를 포함하는 프로젝트를 만들 때 유용한 방법이네요.

저 경우, 수정한 config 값은 수동으로 업데이트 해야 하는 거죠?!
그리고 빌드한 앱의 번들 안에는 plist(.xml) 형식으로 정보가 고스란히 들어가게 되구요?

컴파일되는 소스코드 형태로,
dropbox 처럼 지정된 사람이 자동으로 공유하는 폴더에 넣고
각자가 빌드시의 파일 경로를 세팅하는 방법은 어떨까요?

좋아요 2

말씀하신 것 처럼 메일과 같이 개별적으로 공유하고 수동적으로 각각 업데이트 하는 방식보다

dropbox 나 별도로 private repository 를 만들어서 공유하는 것이 팀원간 보다 편하게 공유하고
동기화 하는데 매우 유용한 것 같습니다!

좋아요 1

plist가 아닌 파일에 넣어서 컴파일에 포함시키는 건 어때요?

plist는 앱 번들을 까 보면 나오거든요.

좋아요 2

아하 번들 까면 나오는지는 몰랐습니다. 참고해서 찾아보고 적용해보겠습니다.

좋아요 1