💥 오류 발생 배경
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
해당 경로에 설치가 되어있는데 실행이 안 되면 해당 경로를 환경 변수 path에 추가하라고 해서 시스템 환경 변수 편집 창을 열어서 path를 추가했다.
[Window 검색] - [시스템 환경 변수 편집] - [환경 변수] - [사용자 변수] -[path에 해당 경로를 추가]
이후 flutterfire 명령어를 실행해 보았더니 제대로 실행되어 firebase_options.dart 파일이 생성되었다.
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);
}
📚 참고
- https://firebase.google.com/docs/flutter/setup?platform=ios&hl=ko
- https://stackoverflow.com/questions/73445667/undefined-name-defaultfirebaseoptions-try-correcting-the-name-to-one-that-is
- https://stackoverflow.com/questions/70320263/error-the-term-flutterfire-is-not-recognized-as-the-name-of-a-cmdlet-functio
- https://linguist79.tistory.com/1482
'Flutter' 카테고리의 다른 글
[flutter] vscode에서 flutter로 개발할 때 유용한 환경 설정하기 (0) | 2024.01.16 |
---|