본문 바로가기
Flutter

[Flutter] Firebase FCM 사용하기 Part. 4-1 (ios)

by 개발_블로그 2025. 2. 3.
반응형

https://jangstory.tistory.com/entry/Flutter-Firebase-FCM-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-Part-1

 

[Flutter] Firebase FCM 사용하기 Part. 1

https://firebase.flutter.dev/docs/messaging/overview Firebase Cloud Messaging | FlutterFireWhat does it do?firebase.flutter.dev 공식문서를 참고하시길 바랍니다.  1. Flutter App 에서 Firebase 를 사용하기 위해서는 Firebase CLI 설

jangstory.tistory.com

 

 

 

Firebase 기본 설정은 여기서 참고해주시길 바랍니다. 

 

1. ios 는 Apple developer 에서 먼저 앱 등록을 해줘야합니다. 

 

이 분 블로그를 참고해주시길 바랍니다. 
이 블로그의 xCode Push Notifications, Background Modes도 추가, Background Modes에서 Remote notifications

체크 까지 완료해주길 바랍니다. 

https://uniqueimaginate.tistory.com/31

 

[iOS, Firebase] Firebase 이용해서 푸시 알림 받기!

Firebase를 이용해서 원격으로 푸시 알림을 받아보자! 목차 Firebase 프로젝트 생성 및 iOS 프로젝트에 SDK 적용 Apple Push Services 인증서 생성 iOS 프로젝트에 Firebase Push Notification 을 위한 세팅 테스트를

uniqueimaginate.tistory.com

 

애플 디벨로퍼 사이트.

 

https://developer.apple.com/account

 

로그인 - Apple

 

idmsa.apple.com

 

firebase 프로젝트 설정 화면



2. ios / Runner / Info.plist 확인 

위 설정이 잘 되었다면 Info.plist 에 코드가 추가 된 것을 확인할 수 있습니다. 

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>processing</string>
    <string>remote-notification</string>
</array>


3. Firebase_Api.dart 코드 수정 

import 'dart:convert';
import 'dart:io';

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_new_badger/flutter_new_badger.dart';
import 'package:shared_preferences/shared_preferences.dart';

final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

const AndroidNotificationDetails androidNotificationDetails =
AndroidNotificationDetails(
  'high_importance_channel',
  'High Importance Notifications',
  channelDescription: 'your channel description',
  importance: Importance.high,
  priority: Priority.high,
);

const iosDetails = DarwinNotificationDetails(
  badgeNumber: 0,
  sound: 'default',
  subtitle: '알림 서브타이틀',
  attachments: [],
);

class FirebaseApi {
  Future<void> initNotifications() async {
    await _firebaseMessaging.requestPermission(
        alert: true, badge: true, sound: true);

    final String? fcmToken = await _firebaseMessaging.getToken();
    print('FCM Token: $fcmToken');

    await initPushNotifications();
    await initLocalNotification();
  }

  Future<void> initLocalNotification() async {
    const AndroidInitializationSettings androidSettings =
        AndroidInitializationSettings('@mipmap/ic_launcher');

    final DarwinInitializationSettings iosSettings =
        DarwinInitializationSettings(
      requestAlertPermission: true,
      requestBadgePermission: true,
      requestSoundPermission: true,
      onDidReceiveLocalNotification:
          (int id, String? title, String? body, String? payload) {},
    );

    final InitializationSettings initializationSettings =
        InitializationSettings(
      android: androidSettings,
      iOS: iosSettings,
    );

    await flutterLocalNotificationsPlugin.initialize(
      initializationSettings,
      onDidReceiveNotificationResponse: (NotificationResponse details) {
        print('Notification clicked: $details');
      },
    );
  }

  Future<void> initPushNotifications() async {
    await FirebaseMessaging.instance
        .setForegroundNotificationPresentationOptions(
      alert: true,
      badge: true,
      sound: true,
    );

    FirebaseMessaging.instance.getInitialMessage().then(_handleMessage);
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);

    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      final Map<String, dynamic> messageMap = message.toMap();
      print('_handleForegroundMessage Message as JSON: ${jsonEncode(messageMap)}');
      _handleForegroundMessage(message);
    });
  }

  void _handleMessage(RemoteMessage? message) {
    if (message == null) return;
    final Map<String, dynamic> messageMap = message.toMap();
    print('_handleMessage Message as JSON: ${jsonEncode(messageMap)}');
  }

  Future<void> _handleForegroundMessage(RemoteMessage message) async {
    final Map<String, dynamic> messageMap = message.toMap();
    print('_handleForegroundMessage Message as JSON: ${jsonEncode(messageMap)}');

    final notification = message.notification;
    NotificationDetails notificationDetails = NotificationDetails(
        android: androidNotificationDetails, iOS: iosDetails);

    if (notification != null) {
      flutterLocalNotificationsPlugin.show(
        0,
        notification.title,
        notification.body,
        notificationDetails,
        payload: jsonEncode(message.data),
      );
    }
  }
}


위와 같이 설정을 완료 하셨으면 notification 을 보낼 수 있습니다. 

 

 

 

ios 는 별다른 설정이 없을 시 포그라운드 상태에서만 메세지가 오고 백그라운드에서는 메세지를 받을 수 없습니다. 

백그라운드에서 메세지 받기는 다음에 포스팅하겠습니다. 

반응형