본문 바로가기

Flutter

[Flutter] Failed to load FirebaseOptions from resource & The term 'flutterfire' is not recognized as the name of a cmdlet, function, script file, or operable program

728x90

💥 오류 발생 배경

FCM을 사용하기 위해서 디바이스를 식별할 수 있는 device token(FCM token)을 발급받아 백엔드로 보내야했다. 그래서 firebase console에서 project를 생성하고 flutter 프로젝트에서 패키지를 설치한 뒤 firebase app을 initialize했더니 다음과 같은 에러가 났다.

 firebase_core: ^2.26.0
 firebase_messaging: ^14.7.18
await Firebase.initializeApp();
Exception has occurred.
PlatformException (PlatformException(java.lang.Exception: Failed to load FirebaseOptions from resource. Check that you have defined values.xml correctly., Exception, Cause: null, Stacktrace: java.lang.Exception: Failed to load FirebaseOptions from resource. Check that you have defined values.xml correctly.
	at io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin.lambda$optionsFromResource$4$io-flutter-plugins-firebase-core-FlutterFirebaseCorePlugin(FlutterFirebaseCorePlugin.java:207)
	at io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin$$ExternalSyntheticLambda2.run(Unknown Source:4)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
	at java.lang.Thread.run(Thread.java:923)
, null))

🔍 오류 발생 원인

오류를 찾아보니 initializeApp을 할 때 FirebaseOptions을 기본으로 전달해줘야 하는 것 같다. FirebaseOptions을 전달해 주려면 flutter 프로젝트에 firebase를 추가한 뒤 flutterfire configure 명령어를 쳤을 때 생성해주는 firebase_options.dart을 이용하면 된다. 결국 내 프로젝트에 firebase 설정을 안해줘서 오류가 발생한 것이었다. (이 멍청아...)

🛠️ 오류 해결

내 flutter 프로젝트에 firebase를 추가하기 위해 firebase 공식 문서를 읽으면서 진행했다. 

1. Firebase CLI 설치

npm install -g firebase-tools

2. Google 계정으로 Firebase에 로그인

firebase login

3. FlutterFire CLI를 설치

dart pub global activate flutterfire_cli

4. Firebase를 사용하도록 앱 구성

flutterfire configure

 

4번을 진행하자 다음과 같은 오류가 발생했다.

5. 오류 해결: The term 'flutterfire' is not recognized as the name of a cmdlet, function, script file, or operable program

flutterfire : 'flutterfire' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로
그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올  
바른지 검증한 다음 다시 시도하십시오.(The term 'flutterfire' is not recognized as the name of a cmdlet, function, script file, or operable program)

 

우선 flutterfire 명령어를 사용할 수 있게 제대로 설치되었는지 아래 경로에 들어가서 확인해 보았다.

C:\Users\[사용자명]\AppData\Local\Pub\Cache\bin

flutterfire.bat 파일이 확인되었다.

 

해당 경로에 설치가 되어있는데 실행이 안 되면 해당 경로를 환경 변수 path에 추가하라고 해서 시스템 환경 변수 편집 창을 열어서 path를 추가했다.

[Window 검색] - [시스템 환경 변수 편집] - [환경 변수] - [사용자 변수] -[path에 해당 경로를 추가]

마지막에 추가되어 있는 모습

이후 flutterfire 명령어를 실행해 보았더니 제대로 실행되어 firebase_options.dart 파일이 생성되었다.

lib 폴더 아래에 생긴다.

6. device token 생성하기

이후에는 firebase_core pub 패키지 공식 사이트에서 example을 참고해서 option을 사용해 initializeApp을 해주었더니 initializeApp가 제대로 실행되어 아래 코드로 token을 받을 수 있었다.

Future<void> initializeDefault() async {
  FirebaseApp app = await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  debugPrint('Initialized default app $app');
}
  void _requestPermission() async {
    FirebaseMessaging messaging = FirebaseMessaging.instance;
    NotificationSettings settings = await messaging.requestPermission(
      alert: true,
      badge: true,
      sound: true,
    );

    if (settings.authorizationStatus == AuthorizationStatus.authorized) {
      debugPrint('User granted permission');
    } else if (settings.authorizationStatus ==
        AuthorizationStatus.provisional) {
      debugPrint('User granted provisional permission');
    } else {
      debugPrint('no');
    }
  }

  void _getToken() async {
    String? fcmToken = await FirebaseMessaging.instance.getToken();
    debugPrint(fcmToken);
  }

📚 참고

반응형