Requirements
xcconfig
과 Xcode 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가 업데이트 될 때마다 자잘한 버그들이 끊이지 않은 것 때문인데, 이 경우도 그렇다. 인터페이스는 만들어두고 왜 코드 내부에서는 이를 처리하도록 하지 않는 것인가! 반성 좀 하길.. 😡
구글링을 해서 찾아보니 이 문제 때문에 발행된 이슈들이 꽤 있었다.
- In new Firebase, how to use multiple config file in xcode?
- Use different GoogleService-Info.plist for different build schemes
Try again!
여러 글들과 실행을 통해 얻은 사실은 GoogleService-Info.plist
파일명을 그대로 사용해야 한다는 것.
우선 파일명을 그대로 유지하면서 이 파일들을 프로젝트에 포함시키기 위해서 그룹(디렉토리)로 구분하였다.
다음으로는 빌드 시 환경에 따른 적절한 환경파일을 가져올 수 있도록 하기 위해 Build Phase에 아래와 같은 Script를 추가하였다.
환경 구분을 위해서는 각 환경마다 부여된 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 개발팀 일 좀 잘하자!