You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
5.1KB

  1. import 'dart:convert';
  2. import 'package:flutter_bloc/flutter_bloc.dart';
  3. import 'package:get/get.dart';
  4. import '../utils/pref.dart';
  5. import 'package:firebase_messaging/firebase_messaging.dart';
  6. import 'package:flutter_local_notifications/flutter_local_notifications.dart';
  7. class FirebaseNotificationService {
  8. static FirebaseMessaging messaging = FirebaseMessaging.instance;
  9. static final _pref = LocalPref();
  10. static void initService() async {
  11. var token = await messaging.getToken() ?? '';
  12. await _pref.saveString(PrefKey.push_key, token);
  13. print('pushKey: $token');
  14. //config Android channel
  15. const channel = AndroidNotificationChannel(
  16. 'high_importance_channel',
  17. 'High Importance Notifications',
  18. importance: Importance.max,
  19. );
  20. final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  21. await flutterLocalNotificationsPlugin
  22. .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
  23. ?.createNotificationChannel(channel);
  24. await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(
  25. alert: true,
  26. badge: true,
  27. sound: true,
  28. );
  29. //handle message on background android
  30. FirebaseMessaging.onBackgroundMessage(
  31. _firebaseMessagingBackgroundHandler,
  32. );
  33. //Message foreground
  34. FirebaseMessaging.onMessage.listen(
  35. (RemoteMessage message) {
  36. print('Got a message whilst in the foreground!');
  37. print('Message data: $message');
  38. // increase count unread notification
  39. // countNotificationUnRead.value = countNotificationUnRead.value + 1;
  40. var remoteNotification = message.notification;
  41. var androidNotification = message.notification?.android;
  42. var flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  43. const initializationSettingsAndroid = AndroidInitializationSettings(
  44. 'app_icon',
  45. );
  46. const initializationSettingsIOS = DarwinInitializationSettings(
  47. requestSoundPermission: false,
  48. requestBadgePermission: false,
  49. requestAlertPermission: false,
  50. onDidReceiveLocalNotification: onDidReceiveLocalNotification,
  51. );
  52. const initializationSettings = InitializationSettings(
  53. android: initializationSettingsAndroid,
  54. iOS: initializationSettingsIOS,
  55. );
  56. flutterLocalNotificationsPlugin.initialize(
  57. initializationSettings,
  58. // onDidReceiveNotificationResponse: selectNotification,
  59. onDidReceiveNotificationResponse: (NotificationResponse notificationResponse) async {
  60. await selectNotification(notificationResponse.payload);
  61. },
  62. );
  63. var androidDetails = const AndroidNotificationDetails(
  64. 'default_notification_channel_id',
  65. 'Notification',
  66. importance: Importance.max,
  67. priority: Priority.high,
  68. icon: '@mipmap/ic_stat_ic_notification',
  69. );
  70. var platformChannelSpecifics = NotificationDetails(
  71. android: androidDetails,
  72. );
  73. var dataPayload = json.encode(message.data);
  74. try {
  75. // var entityType = message.data['entity_type'];
  76. // var entityData = message.data['entity_data'];
  77. // var systemMessage = message.data['system_message'];
  78. print('normal message');
  79. flutterLocalNotificationsPlugin.show(
  80. 0,
  81. message.notification?.title,
  82. message.notification?.body,
  83. platformChannelSpecifics,
  84. payload: dataPayload,
  85. );
  86. } catch (e) {
  87. print(e);
  88. }
  89. },
  90. );
  91. @pragma('vm:entry-point')
  92. void notificationTapBackground(NotificationResponse notificationResponse) {
  93. // handle action
  94. print('message from background: $notificationResponse');
  95. }
  96. //Interaction Message from background
  97. FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
  98. print('message from background: ${message}');
  99. _handleMessage(message);
  100. });
  101. //Interaction Message from terminal
  102. var initialMessage = await FirebaseMessaging.instance.getInitialMessage();
  103. print('initialMessage: $initialMessage');
  104. if (initialMessage != null) {
  105. _handleMessage(initialMessage);
  106. }
  107. }
  108. static Future onDidReceiveLocalNotification(int? id, String? title, String? body, String? payload) async {
  109. // display a dialog with the notification details, tap ok to go to another page
  110. }
  111. static Future selectNotification(String? payload) async {
  112. try {
  113. var data = json.decode(payload ?? '');
  114. handleNavigateScreen(data);
  115. } catch (e) {
  116. print(e);
  117. }
  118. }
  119. static void _handleMessage(RemoteMessage message) {
  120. try {
  121. var data = message.data;
  122. handleNavigateScreen(data);
  123. } catch (e) {
  124. print(e);
  125. }
  126. }
  127. static void handleNavigateScreen(dynamic data) {
  128. print(data);
  129. }
  130. }
  131. Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  132. print('Handling a background message: ${message}');
  133. }