Multiple Firebase Configuration 설정하기

Requirements

xcconfigXcode scheme 을 이용하여 하나의 Xcode 프로젝트로 각 서버환경에 따른 앱을 구성했다. (요건 별도의 포스팅을 통해 상세히 서술해보겠습니다.)

오류 로그 관리를 위해 Firebase Crashlytics 서비스를 이용하기로 결정하였고 Firebase 에서 제공하는 메뉴얼을 통해 SDK를 연동 중 GoogleService-Info.plist를 다운받았다. 서버 환경이 3종류다보니 3개의 파일을 받았다.

Try First

FirebaseOption 클래스를 보니 파일이름을 파라미터로 instance를 생성하는 인터페이스가 존재한다.

동일한 파일명의 파일 3개를 프로젝트에 포함시켜야 하니 구분을 용이하게 하기 위해 파일이름을 아래와 같이 변경하였다.

  • GoogleService-Info-Dev.plist
  • GoogleService-Info-Staging.plist
  • GoogleService-Info-Production.plist

그리고 아래와 같이 코드를 작성하였다.

let options = FirebaseOption(contentsOfFile: {name})
FirebaseApp.configure(options: options)

실행을 했더니 GoogleService-Info.plist 파일을 찾을 수 없다는 경고가 로그창에 나타난다. 😣😤😡

Firebase SDK 개발팀에 대한 불만은 이전부터 있었다. SDK가 업데이트 될 때마다 자잘한 버그들이 끊이지 않은 것 때문인데, 이 경우도 그렇다. 인터페이스는 만들어두고 왜 코드 내부에서는 이를 처리하도록 하지 않는 것인가! 반성 좀 하길.. 😡

구글링을 해서 찾아보니 이 문제 때문에 발행된 이슈들이 꽤 있었다.

Try again!

여러 글들과 실행을 통해 얻은 사실은 GoogleService-Info.plist 파일명을 그대로 사용해야 한다는 것.

우선 파일명을 그대로 유지하면서 이 파일들을 프로젝트에 포함시키기 위해서 그룹(디렉토리)로 구분하였다.

Xcode Project에 파일들을 포함시킨 결과

다음으로는 빌드 시 환경에 따른 적절한 환경파일을 가져올 수 있도록 하기 위해 Build Phase에 아래와 같은 Script를 추가하였다.

Project -> Build Phase -> New Run Script Phase

환경 구분을 위해서는 각 환경마다 부여된 Bundle Identifier를 이용하였는데 다른 규칙으로 해도 무방하다.

# Filename
FIREBASE_INFO_PLIST=GoogleService-Info.plist

# File path for dev
FIREBASE_INFO_DEVELOP=${PROJECT_DIR}/${TARGET_NAME}/Configurations/Develop/${FIREBASE_INFO_PLIST}

# File path for staging
FIREBASE_INFO_STAGING=${PROJECT_DIR}/${TARGET_NAME}/Configurations/Staging/${FIREBASE_INFO_PLIST}

# File path for production
FIREBASE_INFO_PRODUCTION=${PROJECT_DIR}/${TARGET_NAME}/Configurations/Production/${FIREBASE_INFO_PLIST}

# Copy selected GoogleService-Info.plist for builds depend on bundle identifier
if [ "${X_BUNDLE_IDENTIFIER}" == "com.aaa.bbb" ]
then
echo "Using ${FIREBASE_INFO_PRODUCTION}"
cp "${FIREBASE_INFO_PRODUCTION}" "${PLIST_DESTINATION}"
elif [ "${X_BUNDLE_IDENTIFIER}" == "com.aaa.bbb.staging" ]
then
echo "Using ${FIREBASE_INFO_STAGING}"
cp "${FIREBASE_INFO_STAGING}" "${PLIST_DESTINATION}"
else
echo "Using ${FIREBASE_INFO_DEVELOP}"
cp "${FIREBASE_INFO_DEVELOP}" "${PLIST_DESTINATION}"
fi

마지막으로 코드 레벨에서는 심플하게 아래와 같이 처리

FirebaseApp.configure()

Conclusions

Firebase SDK 개발팀 일 좀 잘하자!

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.