Debug / Release Configuration 분리

Meltsplit·2023년 8월 5일

Fitapat

목록 보기
2/7
post-thumbnail

Why?

ZOOC 프로젝트 중 서버 개발자 둔더라는 친구가 테스트배포를 위한 서버를 분리시켜야 한다는 제안을 했다.

분리를 하지 않았을 때의 문제점

  1. 새로운 기능을 개발하기로 기획했다.
  2. 서버가 새로운 API를 만든다. (새로운 AP에 오류가 있다고 가정하자.)
  3. 클라이언트가 테스트 할 수 있도록 서버는 새로 만든 API를 서버에 배포한다.
  4. 그 즉시 유저가 사용중인 앱에도 API 반영된다.

테스트가 되지 않은 API가 유저에게 배포된다는 문제가 있다.

따라서 서버는 아래와 같은 작업을 수행해주었다.

서버

기존 하나였던 서버를 Test ServerRelease Server로 분리한다.

두 서버의 차이점은

  • BaseURL
  • 테스트 중인 코드의 포함 여부
  • FCM Server

자, 서버가 분리를 해주었으니 이제 Xcode에서 적용을 해야한다.
적용하기전에 우리는 아래 개념을 어느정도 숙지하고 따라오길 바란다!

  • Target
  • Scheme
  • Build Configuration

iOS에서 Configuration 분리하는 법

서버가 분리됨에 따라 iOS 개발자가 해야할 작업은 무엇일까.

  1. 앱 자체의 Debug / Release용으로 분리한다. (Xcode 내장된 기능)
  2. 분리되었을 때 각각 변동될 수 있는 값을 적용시킨다.

차근차근 따라해봅시다!

1. Scheme 분리

Xcode 상단에서 Scheme를 분리하자.
자세한 방법은 직접 해보거나 구글링 하면 알 수 있다.

2. xcconfig 파일 생성 및 설정

Configuration Settings File을 눌러 파일을 추가한다.
Debug / Release 파일을 두개 만들었다.

이 후 Project > Info 에 들어가 Configuration 파일을 아까 생성한 .xcconfig 파일로 설정한다.
기존엔 None으로 되어있을 것이다.

여기까지 설정되었다면 Debug / Release에 따라 파일이 분리된 것이다.
그렇다면 이제 Debug.xcconfig / Release.xcconfig 에 따라 분리하고 싶은 정보들을 담아주겠다. (BASE_URL, Bundle Identifier등..)

3. xcconfig 파일 설정 값 입력

총 다섯가지를 적어줬다.
1. Base URL
2. Bundle Identifier
3. App Name
4. App Icon
5. Kakao Appkey

1. Base URL

  • 글의 서두에 적었던 것처럼 가장 Config 분리의 가장 큰 이유이다.
  • 서버측에서 제공해준 testURLRelease URL을 각각 파일에 적어두자.

    주의할 점
    .xcconfig 파일에서 // 는 주석처리가 된다.
    따라서 위와 같이 $() 문자를 // 사이에 삽입하여 주석처리 되는 것을 방지해야한다.

2. Bundle Identifier

  • 테스트 앱Release앱을 더 명확히 분리하기 위해선 앱을 구분하는 것이 좋다.
  • Bundle Identifier은 1:1 관계라고 생각하면 된다.
  • 한 디바이스에 두 개의 앱을 깔기 위해선 Bundle Indentifier이 서로 달라야 한다.

3. App Name

  • 아이폰 바탕화면에 표기되는 앱 이름이다.
  • 테스트앱에만 ZOOC-Dev를 붙혀줬다.

4. App Icon

  • 앱에 따라 앱 아이콘도 구분해주고 싶었다.
  • Assets.xcassets 에 iOS 앱 아이콘을 추가해주어 분기 처리해주었다.

5. Kakao Appkey

  • 앱의 Bundle Identifier이 두개로 나눠짐에 따라 카카오 어플리케이션도 추가했어야 했다. (카카오톡 소셜로그인을 사용하기 위함)
  • 기존 카카오 어플리케이션 등록되어있던 ZOOC 앱의 테스트앱 생성 기능을 활용하여 ZOOC-TEST앱을 만들었다.
  • ZOOC-TEST 앱에 디버깅용 Bundle Indentifier을 등록해주었다.

4. xcconfig 설정 값 확인


Target > Builds Settings > User Defined (가장 하단)에 확인하면
.xcconfig 파일에서 설정했던 값들이 위와 같이 자동으로 입력되어있는 것을 확인할 수 있을 것이다.

  1. Configuration 분리에 따라 설정값이 나눠진 것 체크
  2. Config.File이 아까 .xcconfig 에서 넣은 값들이 존재하는 란이다.
  3. Multiple value로 되어있는 지 체크. 기존에 User Defined에 값을 넣어놨더라면 고정된 값이 들어있을 것이다. 만약 그렇다면 고정된 값을 지워라!

5. xcconfig에 넣은 값 활용

Config 값을 Swift 에서 활용하려면?

Swift 파일에서 Config의 정보를 사용하고 싶을 수가 있다.
AppDelegate에서 카카오앱키를 사용한다거나
Moya 네트워크 통신 부분에 BaseURL을 입력하거나 등

그럴땐 아래 방법으로 구현하면 된다.

1. Info.plist에 상수값 생성

Key

  • 추후 Swift 파일에서 접근할 딕셔너리의 키값

Value

${BASE_URL} 위 xcconfig 에서 작성했던 키 값을 작성해주면 된다.

2. Config 객체 생성

enum Config {
   
    static let kakaoAppKey = Bundle.main.infoDictionary?["KAKAO_APPKEY"] as! String
    static let baseURL = Bundle.main.infoDictionary?["BASE_URL"] as! String
    
}

3. 원하는 곳에 활용

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
   
        KakaoSDK.initSDK(appKey: Config.kakaoAppKey)
        return true
    }

주의해야 할 점

Bundle 값 수정하기

우리가 xcconfig에서 한 작업은 Bundle Idenfier과 APP Name을 직접 커스텀한 설정값으로 적용시키겠단 행위이다.
따라서 프로젝트의 Info.plistTarget Signing & Capability 을 뒤져가며 Bundle NameBundle Identifier value값을 아래와 같이 변경해야한다.

Bundle Name 의 value값

  • $(PRODUCT_NAME): default 값
  • $(APP_NAME): 커스텀 값

Bundle Idenfifier 의 value 값

  • $(PRODUCT_BUNDLE_IDENTIFIER): default 값
  • $(APP_BUNDLE_ID): 커스텀 값

두 개의 GoogleService-Info.plist

테스트와 배포용으로 분리에 의해 FCM에 등록된 어플리케이션도 분리가 필요하다.
따라서 ZOOC이라는 한 프로젝트에 두개의 FCM 어플리케이션이 등록되어야 하는 것 이다.
Firebase는 어플리케이션당 하나의 GoogleService-Info.plist를 사용하므로
총 두개의 GoogleService-Info.plist 파일이 존재해야하는 것이다.
해당 문제 해결할 때 참고한 링크는 하단 참고에 첨부하겠다.

참고

iOS) 프로젝트 배포 환경별 Build Scheme 세팅(.xcconfig 사용) + key 숨기기

Building Your App Using Build Configurations and .xcconfig

빌드 환경 분리

한 프로젝트에 GoogleService-Info.plist 파일이 여러개일 때

profile
iOS Developer

0개의 댓글