본문 바로가기
프로그래밍/Flutter-Dart

[Flutter] Firebase Cloud Messaging 사용 방법

by 채연2 2023. 3. 3.

초기 설정은 다 되어있다는 전제 하에 flutter 프로젝트 firebase 코드 설정 부분 및 예제, 이슈 등을 정리해 보려고 한다.

 

Contents

     

     

    Flutter FCM 사용 방법

    Android FCM Setting

    1. Firebase 사이트 > 등록한 프로젝트 > 프로젝트 설정 > 일반 > 하단에 내가 등록한 Android 앱 선택 > SDK 설정 및 구성 > google-services.json 다운로드 > Flutter 프로젝트\android\app 폴더에 넣기

     

    2. Flutter 프로젝트\android\app\build.gradle 안에 다음과 같이 코드 작성

    dependencies {
       ...
       implementation platform('com.google.firebase:firebase-bom:29.0.2')
       implementation 'com.google.firebase:firebase-analytics'
       implementation 'com.google.firebase:firebase-auth'
    }

     

    3. Flutter 프로젝트\android\app\src\main\AndroidManifest.xml 안에 다음과 같이 코드 작성

    <manifest>
       <application>
          <meta-data
             android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />
          <meta-data
             android:name="com.google.firebase.messaging.default_notification_icon"
             android:resource="@mipmap/ic_launcher" />
          <meta-data
             android:name="com.google.firebase.messaging.default_notification_channel_id"
             android:value="high_importance_channel" />
       </application>
    </manifest>
    • firebase_messaging_auto_init_enabled - false: FCM 자동 초기화 사용 중지
    • com.google.firebase.messaging.default_notification_icon : FCM icon 설정
    • com.google.firebase.messaging.default_notification_channel_id : FCM 알림 채널 직접 생성하여 사용하기 위함 (생략 가능)

     

    iOS FCM Setting

    1. Xcode Firebase SDK 추가 ( 입력 주소 : https://github.com/firebase/firebase-ios-sdk )

     

    2. Firebase 사이트 > 등록한 프로젝트 > 프로젝트 설정 > 일반 > 하단에 내가 등록한 iOS 앱 선택 > SDK 설정 및 구성 > GoogleService-Info.plist 다운로드 > Flutter 프로젝트\ios\Runner 폴더에 넣기

     

    3. Flutter 프로젝트\ios\Runner\Info.plist 안에 다음과 같이 코드 작성

    <plist version="1.0">
    <dict>
    	<key>FirebaseAppDelegateProxyEnabled</key>
    	<string>NO</string>
    </dict>
    </plist>

     

    4. Flutter 프로젝트\ios\Runner\AppDelegate.swift 안에 다음과 같이 코드 작성

    import Flutter
    
    @UIApplicationMain
    @objc class AppDelegate: FlutterAppDelegate {
       override func application(...) -> Bool {
          ...
          FirebaseApp.configure()
          ...
       }
    }

     

    Flutter Project FCM Setting

    1. Flutter 프로젝트\pubspec.yaml 안에 다음과 같이 코드 작성

    dependencies:
       flutter:
          sdk: flutter
    
       firebase_core: 1.21.0
       firebase_messaging: ^11.4.1
       firebase_auth: ^3.5.0
       firebase_core_platform_interface: 4.5.0

     

    2. Flutter 프로젝트\lib\main.dart 안에 다음과 같이 코드 작성

    void main() async {
       WidgetsFlutterBinding.ensureInitialized();
       await Firebase.initializeApp();
    
       runApp(MyApp());
    }

     

    Flutter FCM Basic Setting

    * FirebaseMessaging 클래스의 instance를 전역 변수로 선언

    final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;

     

    1. FirebaseMessaging 토큰 가져오기

    void getToken() async {
       await _firebaseMessaging.getToken().then((String? token) async {
          logI("$runtimeType", "FirebaseMessaging token : $token");
       });
    }

     

    2. FCM 알림 권한 설정

    void _requestPermission() async {
       try {
          await _firebaseMessaging.requestPermission(
             alert: true,
             announcement: true,
             badge: true,
             carPlay: true,
             criticalAlert: true,
             provisional: true,
             sound: true,
          );
    
          await _firebaseMessaging.setForegroundNotificationPresentationOptions(alert: true, badge: true, sound: true);
       } catch (_) { }
    }

     

    3. FCM 알림 권한 가져오기

    Future<bool> getNotificationSetting() async {
       NotificationSettings result = await _firebaseMessaging.getNotificationSettings();
    
       if (result.authorizationStatus == AuthorizationStatus.authorized || result.authorizationStatus == AuthorizationStatus.provisional) {
          return true;
       }
    
       return false;
    }

     

    4. FCM Listen 함수 구현

    void listenFirebaseMessaging() async {
       const AndroidNotificationChannel channel = AndroidNotificationChannel('high_importance_channel', 'High Importance Notifications', importance: Importance.max);
       final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    
       if (Platform.isAndroid)
          await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
    
       await flutterLocalNotificationsPlugin.initialize(
          InitializationSettings(android: AndroidInitializationSettings('@mipmap/ic_launcher'), iOS: IOSInitializationSettings()),
       );
    
       FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
          //
       });
    
       FirebaseMessaging.onMessageOpenedApp.listen((message) async {
          //
       });
    }
    • AndroidNotificationChannel ID는 Flutter 프로젝트\android\app\src\main\AndroidManifest.xml에 설정했던 com.google.firebase.messaging.default_notification_channel_id 와 동일해야 함

     

    Flutter FCM Background Setting

    1. Flutter 프로젝트\lib\main.dart 안에 다음과 같이 코드 작성

    void main() async {
       ...
       FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
       ...
    }

     

    2. Flutter 프로젝트\lib\main.dart 안에 다음과 같이 코드 작성

    @pragma('vm:entry-point') // 릴리즈 시 백그라운드 핸들러 기능이 삭제되지 않도록 해주는 코드.
    Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
       await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
       // insert your code
    }
    
    void main() async { ... }
    • Background Handler 함수는 main() 함수보다 상단에 위치해야 한다고 함

     

    Flutter FCM Background Handler

    1. shared_preferences 라이브러리 사용하여 전역 변수로 선언

    final Future<SharedPreferences> prefs = SharedPreferences.getInstance();

     

    2. FCM Background Handler 함수 안에 다음과 같이 코드 작성

    Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
      await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
      
      final SharedPreferences _prefs = await SharedPreferences.getInstance();
      await _prefs.reload();
      
      if (message.notification != null && (message.notification!.title?.isNotEmpty ?? false)) {
        _prefs.setString('BackgroundMessage', message.notification!.title);
      }
    }

     

    3. 앱 실행 시 아래와 같은 함수 호출하여 백그라운드 메세지 처리

    void backgroundNotificationCheck() async {
       final SharedPreferences _prefs = await prefs;
       await _prefs.reload();
    
       String? message = _prefs.getString('BackgroundMessage');
    }

     

    320x100

    댓글