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');
}
}