개발 중 다음과 같은 코드로 Firebase를 초기화했음에도 불구하고, 초기화에 실패했다는 에러가 났다. 잘 되다가 왜...
await Firebase.initializeApp();
Performing hot restart...
Syncing files to device iPhone 15 Pro Max...
Restarted application in 692ms.
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: [core/not-initialized] Firebase has not been correctly initialized.
Usually this means you've attempted to use a Firebase service before calling `Firebase.initializeApp`.
View the documentation for more information: https://firebase.flutter.dev/docs/overview#initialization
#0 MethodChannelFirebase.initializeApp (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:120:9)
<asynchronous suspension>
#1 Firebase.initializeApp (package:firebase_core/src/firebase.dart:43:31)
<asynchronous suspension>
#2 main (package:schedule_with/main.dart:38:3)
<asynchronous suspension>
구글링 끝에, 플랫폼별로 Firebase 초기화를 명시적으로 설정해야 한다는 것을 발견했다.
기존 코드
await Firebase.initializeApp();
위 코드는 기본 초기화 방법만 사용하며, firebase_options.dart 파일을 참조하지 않기 때문에 각 플랫폼(Android, iOS, Web 등)에서 필요한 옵션이 누락될 수 있다. 결과적으로 특정 플랫폼에서 Firebase가 제대로 초기화되지 않을 가능성이 있다는 것이었다.
플러터로 개발하면서 가끔 AOS에서는 잘 실행되는데 iOS 에서 안된다거나, 그 반대의 경우를 접해왔기 때문에... 우선 특정 플랫폼 때문에 초기화 에러가 발생 하는건지, 아님 모든 플랫폼에서 발생 하는건지 확인하고 싶었다. 따라서 아래 코드를 적용해 각 플랫폼에서 앱을 실행해보았다.
수정된 코드
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
적용 후 안드로이드 에뮬레이터에서는 앱이 잘 돌아가는데, 아이폰 시뮬레이터에서는 여전히 오류가 나고 있음을 발견했다. 덕분에 문제의 원인이 iOS 관련 설정이라는 것을 알 수 있었다. 따라서 iOS 설정파일을 체크해보았다.
1. Firebase 구성 파일 체크
ios/Runner/Info.plist 에 GoogleService-Info.plist 가 제대로 포함 되어있는지?
2. ios/Podfile 체크
Podfile은 iOS 개발에서 CocoaPods라는 의존성 관리 도구를 사용하여 외부 라이브러리를 프로젝트에 추가할 때 작성하는 구성 파일이다.
아래 명령을 실행하면 모든 종속성이 올바르게 설치되었는지 확인 할 수 있다.
cd ios
pod install
그런데 파일이 존재하지 않는다는 메세지가 떴다. 이 녀석이 범인이었던 것... 다행히 해결 방법은 간단하다. CocoaPods 초기화 후 다시 설치해주면 된다.
pod init
cd ios
pod install
다시 아이폰 시뮬레이터에서 앱을 실행하니 Firebase가 정상적으로 초기화되었다.
이번 경험이 플러터의 특성을 조금 더 깊이 이해할 수 있는 계기가 되지 않았나 싶다.
크로스 플랫폼 프레임워크라는 특성상, 각 플랫폼마다 초기화나 설정 방식에 미묘한 차이가 있을 수밖에 없다는 것은 알고 있었다. (예를 들어, iOS에서는 GoogleService-Info.plist 파일이 정확히 포함되어야 하고, CocoaPods를 통해 의존성이 올바르게 설치되어야만 Firebase가 정상적으로 작동한다. 반면, Android는 google-services.json 파일을 사용하며, Gradle을 통해 종속성을 관리한다)
하지만 이를 간과했을 때 발생하는 문제를 직접 경험한 것은 처음이었다. 코드 자체에는 문제가 없더라도, 프로젝트 전반의 구조와 설정을 점검하는 것도 중요하다는 것을 깨달았다.