Flutter Android FCM

이동언·2025년 3월 21일

Flutter에서 FCM을 사용하기 위해선 ios는 과금이 필요하므로 Android기준으로 실행해봄 (백그라운드 / 포어그라운드 둘다 사용가능)

1. Firebase 프로젝트 만들기

1-1. 프로젝트 생성

1-2. 안드로이드 선택

1-3. 패키지 이름 등록

해당 패키지는 Flutter 내부 android/app/build.gradle에 있는 namespace이름을 사용하면됨.

2. Flutter 코드 작성

2-1. yml 필요 라이브러리 추가

  firebase_core: ^3.12.1
  firebase_messaging: ^15.2.4
  flutter_local_notifications: ^19.0.0

2-2. google-services.json 파일 추가

2-3. app/build.gradle

plugin에 해당 내용추가

id 'com.google.gms.google-services' // Firebase 설정

compileOptions에 세번째 줄 추가

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
        coreLibraryDesugaringEnabled true // ✅ Java 8+ 기능 지원 활성화
    }

dependencies 자체를 추가해주자 (포어그라운드에서 되려면)


dependencies {
    implementation "androidx.core:core-ktx:1.10.1"

    // ✅ coreLibraryDesugaring 추가 (필수)
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
}

2-4. andriod/build.gradle 추가

해당 코드 추가

classpath 'com.google.gms:google-services:4.4.0' 

2-5. firebase_api.dart 추가

백그라운드 사용가능

import 'package:firebase_messaging/firebase_messaging.dart';

class FirebaseApi {
  //create an instance of Firebase Msg
  final _firebaseMessaging = FirebaseMessaging.instance;

  //function to init notification
  Future<void> initNotifications() async {
    //request permission from user (will prompt user)
    await _firebaseMessaging.requestPermission(
      badge: true,
      alert: true,
      sound: true
    );

    //fetch the FCM token for this device
    final FCMToken = await _firebaseMessaging.getToken();

    //print the token (normally you would send this to your server)
    print('Token: $FCMToken');
  }
}

백그라운드 / 포어그라운드 사용가능

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

class FirebaseApi {
  // Firebase Messaging 인스턴스 생성
  final _firebaseMessaging = FirebaseMessaging.instance;

  // Flutter Local Notifications 인스턴스 생성
  final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
  FlutterLocalNotificationsPlugin();

  // 알림 초기화
  Future<void> initNotifications() async {
    // 사용자에게 알림 권한 요청
    await _firebaseMessaging.requestPermission(
      badge: true,
      alert: true,
      sound: true,
    );

    // FCM 토큰 가져오기 (서버로 보내야 함)
    final fcmToken = await _firebaseMessaging.getToken();
    print('📌 FCM Token: $fcmToken');

    // 로컬 알림 설정
    const AndroidInitializationSettings androidInitializationSettings =
    AndroidInitializationSettings('@mipmap/ic_launcher');

    final InitializationSettings initializationSettings =
    InitializationSettings(android: androidInitializationSettings);

    await _flutterLocalNotificationsPlugin.initialize(initializationSettings);

    // 포그라운드에서 FCM 알림 처리
    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      print("📩 포그라운드 알림 수신: ${message.notification?.title} - ${message.notification?.body}");
      _showNotification(message);
    });
  }

  // 푸시 알림 표시 함수
  void _showNotification(RemoteMessage message) async {
    const AndroidNotificationDetails androidPlatformChannelSpecifics =
    AndroidNotificationDetails(
      'high_importance_channel', // 채널 ID
      'High Importance Notifications', // 채널 이름
      channelDescription: 'This channel is used for important notifications.',
      importance: Importance.max,
      priority: Priority.high,
    );

    const NotificationDetails platformChannelSpecifics =
    NotificationDetails(android: androidPlatformChannelSpecifics);

    await _flutterLocalNotificationsPlugin.show(
      0, // 알림 ID
      message.notification?.title, // 알림 제목
      message.notification?.body, // 알림 내용
      platformChannelSpecifics,
    );
  }
}

2-5. main.dart

main.dart에서는 해당 두개코드로 fcm을 초기화 하는 코드만 있으면됨

  await Firebase.initializeApp();
  await FirebaseApi().initNotifications();

2-6. androidmanifestfile

코드추가

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="USE_FULL_SCREEN_INTENT"/>

코드추가

 <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="high_importance_channel" />

3. Test

3-1. test 해보기

fcm이 초기화 될때 print에서 나오는 token값을 복사해놓고

firebase에 있는 messaging을 선택

캠페인 만들기

firebase 알림메시지 선택

알림내용 작성후

아까 복사해뒀던 토큰값을 넣어주고 테스트

4. test 확인

4-1. 포어그라운드

4-2. 백그라운드

5. 참고 블로그

https://gwpaeng.tistory.com/509

0개의 댓글