Firebase Cloud Messaging : 푸쉬 알림

송민경's avatar
Aug 29, 2024
Firebase Cloud Messaging : 푸쉬 알림

1. FCM(Firebase Cloud Messaging)

  • Google의 Firebase 플랫폼에서 제공하는 푸시 알림 서비스
  • 모바일 앱, 웹 앱, 또는 서버 간에 메시지를 전달할 수 있게 해주는 서비스
  • 개발자는 특정 기기나 사용자 그룹에게 실시간으로 알림을 보낼 수 있음
 

2. 기능

  • 푸시 알림
    • 개발자는 모바일 또는 웹 앱 사용자에게 푸시 알림을 보낼 수 있음
    • 이 알림은 사용자가 앱을 실행하지 않고도 받을 수 있음
  • 주제 기반 메시징
    • 사용자는 특정 주제를 구독하고, 개발자는 구독한 모든 사용자에게 메시지를 보낼 수 있음
  • 타겟팅
    • 특정 사용자 그룹, 특정 기기, 앱 인스턴스에 대해 타겟팅된 메시지를 보낼 수 있음
    • 클라우드-클라우드 및 클라이언트-클라우드 메시징
  • 서버와 클라이언트 간에 실시간 메시징을 지원
    • 서버에서 클라이언트로 메시지를 보내거나 클라이언트 간에 메시지를 주고받을 수 있음
 

3. 라이브러리 추가하기

  • firebase를 위한 라이브러리
firebase_messaging: ^15.1.0 firebase_analytics: ^11.3.0 // 푸쉬 알림을 받을 때 필요함
  • 추가 라이브러리
webview_flutter: ^4.9.0 get: ^4.6.6
 

4. 연결 파일 구현하기

import 'package:firebase_messaging/firebase_messaging.dart'; class FirebaseApi { // Firebase Messaging 인스턴스 생성 final _firebaseMessaging = FirebaseMessaging.instance; // 알림 초기화 함수 Future<void> initNotifications() async { // 사용자에게 알림 권한 요청 (배지, 알림, 소리 옵션 설정) await _firebaseMessaging.requestPermission( badge: true, // 배지 표시 허용 alert: true, // 알림 표시 허용 sound: true, // 알림 소리 허용 ); // 이 기기의 FCM 토큰을 가져옴 final FCMToken = await _firebaseMessaging.getToken(); // FCM 토큰을 출력 (보통 서버로 전송하는 경우) print('Token: $FCMToken'); // 알림 핸들러 설정 FirebaseMessaging.onMessage.listen((RemoteMessage message) { print('Message received: ${message.notification?.body}'); }); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { print('Message clicked: ${message.notification?.body}'); }); } }
 

5. main.dart 파일에 추가하기

  • 임시로 공공 웹사이트의 URL을 사용
  • 초기화 설정
  • web view를 이용
import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'firebase_api.dart'; import 'firebase_options.dart'; final homeUrl = Uri.parse("https://www.example.com"); // 웹뷰에 로드할 URL 설정 void main() async { WidgetsFlutterBinding.ensureInitialized(); // Flutter의 위젯 시스템 초기화 await Firebase.initializeApp( // Firebase 초기화 (비동기 함수) options: DefaultFirebaseOptions.currentPlatform, // 현재 플랫폼에 맞는 Firebase 설정 적용 ); // Firebase 알림 초기화 (필요한 경우) await FirebaseApi().initNotifications(); runApp(const MyApp()); // MyApp 실행 } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return GetMaterialApp( title: 'Flutter Demo', // 앱의 제목 설정 theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), // 앱의 테마 색상 설정 useMaterial3: true, // Material 3 사용 설정 ), home: const HomePage(), // 앱의 홈 화면으로 HomePage 위젯 설정 ); } } class HomePage extends StatefulWidget { const HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); // 상태(State) 클래스 생성 } class _HomePageState extends State<HomePage> { late final WebViewController controller; // WebView 컨트롤러 선언 @override void initState() { super.initState(); controller = WebViewController() // WebView 컨트롤러 초기화 ..setJavaScriptMode(JavaScriptMode.unrestricted) // 자바스크립트 허용 모드 설정 ..addJavaScriptChannel( 'Toaster', // 'Toaster'라는 이름의 JavaScript 채널 추가 onMessageReceived: (JavaScriptMessage msg) async { // WebView의 자바스크립트에서 보낸 메시지를 처리하는 콜백 함수 }, ) ..loadRequest(homeUrl); // 설정된 URL 로드 } @override Widget build(BuildContext context) { return Scaffold( body: WebViewWidget(controller: controller), // WebView를 표시할 위젯 ); } }
notion image
notion image
 

5. Token 값 확인하기

notion image
 
Share article
RSSPowered by inblog