[flutter] 플러터에서 오프라인 푸시 알림 처리 방법

플러터(Flutter)는 크로스 플랫폼 모바일 애플리케이션 개발을 위한 프레임워크로, 다양한 기능을 제공합니다. 알림 기능은 사용자에게 중요한 정보를 전달하고 애플리케이션의 사용자 경험을 향상시키는 데 큰 역할을 합니다. 푸시 알림은 사용자의 기기로 전송되어 애플리케이션이 배경에서 실행 중이거나 사용 중이지 않을 때에도 알림을 통해 사용자에게 정보를 전달할 수 있습니다. 이번 글에서는 플러터에서 오프라인 푸시 알림을 처리하는 방법에 대해 알아보겠습니다.

FCM (Firebase Cloud Messaging)

FCM은 Google의 Firebase 클라우드 메시징 플랫폼으로, 플러터에서 푸시 알림을 처리하기 위해 많이 사용됩니다. FCM을 사용하려면 Firebase 프로젝트를 만들고 해당 프로젝트의 설정을 통해 FCM을 활성화해야 합니다. Firebase 설정에 대한 자세한 사항은 Firebase 공식 문서를 참조하세요.

앱 설정

FCM을 설정한 후, 플러터 앱에서 상태를 감지하고 알림을 처리해야 합니다. 이를 위해 firebase_messaging 패키지를 사용할 수 있습니다. pubspec.yaml 파일에 아래의 의존성을 추가하세요:

dependencies:
  firebase_messaging: ^10.0.0

firebase_messaging 패키지를 사용하기 위해 앱에 필요한 설정을 해야 합니다. 안드로이드의 경우 AndroidManifest.xml 파일에 아래의 코드를 추가하세요:

<service android:name="io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingBackgroundService" android:exported="false" />
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" />
<!-- firebase messaging receiver -->
<receiver
  android:name="io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingReceiver"
  android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</receiver>

iOS의 경우 AppDelegate.swift 파일에 아래의 코드를 추가하세요:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    FirebaseApp.configure()
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
  
  override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    super.application(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: completionHandler)
    Messaging.messaging().appDidReceiveMessage(userInfo)
  }
}

메시지 수신

푸시 알림이 수신되었을 때 이를 처리하는 방법은 앱의 백그라운드 상태와 포그라운드 상태에 따라 다릅니다.

백그라운드 상태

백그라운드 상태에서는 firebase_messaging 패키지의 백그라운드 메시지 핸들러를 사용하여 알림을 처리할 수 있습니다. 아래의 코드를 main.dart 파일에 추가하세요:

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  print('백그라운드 알림이 도착했습니다: ${message.messageId}');
}

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

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  runApp(MyApp());
}

포그라운드 상태

포그라운드 상태에서 푸시 알림을 처리하는 방법은 앱의 UI에 종속됩니다. 푸시 알림 메시지를 표시하려면 firebase_messaging 패키지의 FirebaseMessaging.onMessage 스트림을 구독하면 됩니다.

FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  print('포그라운드 알림이 도착했습니다: ${message.messageId}');
});

또한 알림을 사용자에게 표시하고 사용자가 알림을 탭할 때 필요한 추가 동작을 수행해야 합니다. 이를 위해 firebase_messaging 패키지의 FirebaseMessaging.onMessageOpenedApp 스트림을 구독하면 됩니다.

FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
  print('사용자가 알림을 탭했습니다: ${message.messageId}');
});

요약

위의 단계를 따라하면 플러터 앱에서 오프라인 푸시 알림을 처리할 수 있습니다. Firebase를 사용하여 알림 메시지를 수신하고 백그라운드 및 포그라운드에서 알림을 처리하는 방법에 대해 설명했습니다. 푸시 알림은 앱의 사용자 경험을 향상시키고 중요한 정보를 전달하는 데에 적합한 기능입니다.

하지만 실제 앱에서는 FCM 설정과 푸시 알림 처리를 위해 추가적인 로직과 기능을 구현해야 할 수 있습니다. 따라서 이 글은 참고용으로만 사용해야 하며, 개발 환경에 맞게 필요한 작업을 수행해야 합니다.