Google-Service-Info.plist 파일 여러개 사용하기

Hanulyun
6 min readFeb 12, 2020

--

  • Xcode 11.3.1, Swift 5 기준

Multiple Google-Service-Info.plist, Multiple Firebase Environments

Firebase를 사용하다보면 Xcode에서 타겟을 여러개 생성해 사용하거나 Dev, Production 등 구분해 Google-Service-Info.plist 파일을 사용해야할 때가 있다.

AppDelegate에서 코드로 구분하기

처음 사용했던 방식은 다른 이름의 파일을 따로 프로젝트에 넣고, AppDelegate에서 코드로 구분하는 것이었다.

Google-Service-Info-Dev.plist // Dev
Google-Service-Info-Prod.plist // Release
-> Firebase 콘솔에서 다운받은 plist 파일의 이름을 변경하여 프로젝트 폴더에 넣었다.
// AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
var filePath: String = ""
#if DEBUG
filePath = Bundle.main.path(forResource: "GoogleService-Info-Dev", ofType: "plist")!
#else
filePath = Bundle.main.path(forResource: "GoogleService-Info-Dev", ofType: "plist")!
#endif
let options: FirebaseOptions? = FirebaseOptions.init(contentsOfFile: filePath)
FirebaseApp.configure(options: options!)
}

이렇게 사용하면 FCM이나 Analytics는 잘 작동했다. 그런데 앱 릴리즈 직전에 Crashlytics를 붙이려고 하니

Error: Could not get GOOGLE_APP_ID in Google Services file from build environment

라는 에러 때문에 빌드가 되지 않았다.

예전 프로젝트에서 Crashlytics를 Fabric 코드를 사용해 쓸 때는 이런 문제점이 없었는데, Firebase로 통합된 후 신규 앱을 만들면서 이슈가 발생했다.

로그를 살펴보니 Crashlytics는 GoogleService-Info.plist 라는 파일명을 참조해야만 하는 것 같았다.
사실 이 부분은 확실하지 않다. 그저 not found GoogleService-Info.plist 블라블라 라는 로그가 찍혀서 파일명이 다르면 안되는걸까 생각했고 파일명을 변경하지 않고도 여러 개의 plist 파일을 사용할 수 있는 방법을 찾아야 했다.

파일명을 다르게 쓰면서 적용하기

찾아보니 파일명을 같게 만들고 Xcode 상에서 구분해 적용할 수 있는 방법과, 파일명은 다르지만 적용할 수 있는 방법이 있다. 코드 상으로 후자가 더 간편한 것 같아서 파일명을 다르게 적용할 수 있는 방법을 공유한다.
참고 : https://stackoverflow.com/questions/57006663/could-not-get-google-app-id-in-google-services-file-from-build-environment

우선 다른 plist 파일을 원하는 프로젝트 폴더에 넣는다.

Dev와 Production 두개를 넣어보았다.

Target의 Build Phases에 'New Run Script Phase' 로 새로 생성한 후 아래와 같이 코드를 작성한다.

case "${CONFIGURATION}" in  "Debug" )cp -r "$SRCROOT/ProjectName/Resources/Firebase/GoogleService-Info-Dev.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;  "Release" )cp -r "$SRCROOT/ProjectName/Resources/Firebase/GoogleService-Info-Prod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;*)
;;
esac

이미지의 가려진 부분에 본인 ProjectName을 입력한다. ProjectName 뒤에 본인의 plist 파일이 있는 경로를 적으면 된다.

“Debug”, “Release” 이 부분은 아래 이미지의 Configurations 를 참고해 구분했고, 만약 여러개 있을 경우에는 "Debug" | "Dev" | "Debug_alpha" 이런식으로 추가해 사용할 수 있다.

이제 AppDelegate로 돌아와서 아까 작성된 코드는 모두 지우고 FirebaseApp.configure() 코드 한 줄만 남기면 끝.

Crashlytics 적용하기

그럼 이제 Crashlytics를 적용해 잘 작동하는지 확인할 차례이다.
Target의 Build Phases에 'New Run Script Phase' 로 새로 생성한 후 아래와 같이 코드를 작성한다.

그 후 비정상 종료 구현 테스트를 통해 잘 적용되었는지 확인한다.
참고 : https://firebase.google.com/docs/crashlytics/force-a-crash

개발을 하다보면 다른 업계와는 다르게 개발 분야는 빠르게 변화한다는게 실감이 난다. 6개월 전에 사용하던 방법이 지금은 안되기도 하고, Firebase와 같은 서비스도 계속 업데이트되고 발전하다보니 개발자는 거기에 맞는 방법을 새롭게 찾아야하는 일이 빈번하다. 스택오버플로가 있어서 다행이다. :)

--

--

Hanulyun
Hanulyun

Written by Hanulyun

iOS 주니어 개발자입니다. 개발하면서 막히는 부분을 해결한 후 기록으로 남깁니다. #Swift

Responses (1)