setupFirebaseMessaging function

Future<void> setupFirebaseMessaging()

Implementation

Future<void> setupFirebaseMessaging() async {
  try {
    final messaging = FirebaseMessaging.instance;

    // Request permissions for iOS
    if (Platform.isIOS || Platform.isMacOS) {
      NotificationSettings settings = await messaging.requestPermission(
        alert: true,
        badge: true,
        sound: true,
        provisional: false,
      );
    }

    // Get FCM token
    final token = await messaging.getToken();
    debugPrint('FCM Token: $token');

    // Token refresh
    messaging.onTokenRefresh.listen((newToken) {
      debugPrint('FCM Token refreshed: $newToken');
    });

    // Init flutter_local_notifications
    const AndroidInitializationSettings initializationSettingsAndroid =
        AndroidInitializationSettings('@mipmap/ic_launcher');

    const InitializationSettings initializationSettings =
        InitializationSettings(android: initializationSettingsAndroid);

    await flutterLocalNotificationsPlugin.initialize(
      initializationSettings,
      onDidReceiveNotificationResponse:
          (NotificationResponse notificationResponse) async {
        final String? payload = notificationResponse.payload;
        if (payload != null) {
          debugPrint('Notification tapped with payload: $payload');
          try {
            final messageData = jsonDecode(payload);
            final String? memoId = messageData['memo_id'];
            if (memoId != null) {
              final dummyMessage = RemoteMessage(data: {'memo_id': memoId});
              _handleMessage(dummyMessage);
            } else {
              debugPrint('Memo ID not found in notification payload data.');
            }
          } catch (e) {
            debugPrint('Error parsing notification payload: $e');
          }
        }
      },
    );

    // Foreground notification handler
    FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
      debugPrint('Message received in foreground: ${message.toString()}');

      RemoteNotification? notification = message.notification;
      AndroidNotification? android = message.notification?.android;

      if (notification != null && android != null) {
        await flutterLocalNotificationsPlugin.show(
          notification.hashCode,
          notification.title,
          notification.body,
          const NotificationDetails(
            android: AndroidNotificationDetails(
              'high_importance_channel',
              'High Importance Notifications',
              importance: Importance.max,
              priority: Priority.high,
              icon: '@mipmap/ic_launcher',
            ),
          ),
          payload: jsonEncode(message.data),
        );
      }
    });

    // Background handler
    debugPrint('Setting up background message handler.');
    FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

    // Terminated state notification
    debugPrint('Checking for initial message...');
    final initialMessage = await messaging.getInitialMessage();
    if (initialMessage != null) {
      debugPrint('Initial message received: ${initialMessage.toString()}');
      _handleMessage(initialMessage);
    }

    // When app is resumed via tapping notification
    debugPrint('Setting up onMessageOpenedApp listener.');
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  } catch (e) {
    debugPrint('FCM setup error: $e');
  }
}