flutter-freaccess-hub/lib/backend/push_notification/pushNotification.dart

110 lines
4.2 KiB
Dart

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'dart:convert';
import 'dart:io' show Platform;
class PushNotificationService {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
static const String _channelId = 'visitRequest';
static const String _channelName = 'Visitas';
static const String _channelDescription = 'Solicitação de visita';
Future<void> initialize() async {
var initializationSettingsAndroid =
const AndroidInitializationSettings('ic_launcher');
var initializationSettingsIOS = const DarwinInitializationSettings(
requestAlertPermission: true,
requestBadgePermission: true,
requestSoundPermission: true,
);
var initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsIOS,
);
await _flutterLocalNotificationsPlugin.initialize(initializationSettings);
if (Platform.isAndroid) {
var channel = const AndroidNotificationChannel(
_channelId,
_channelName,
description: _channelDescription,
importance: Importance.high,
);
await _flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
}
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
FirebaseMessaging.onMessage.listen(_handleMessage);
FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
NotificationSettings settings = await _firebaseMessaging.requestPermission(
alert: true,
badge: true,
sound: true,
);
debugPrint('User granted permission: ${settings.authorizationStatus}');
}
void _handleMessage(RemoteMessage message) {
RemoteNotification? notification = message.notification;
AndroidNotification? android = message.notification?.android;
Map<String, dynamic> data = message.data;
// Verifica se há um clickAction e se é um visit_request
String? clickAction = data['clickAction'];
if (clickAction != null && clickAction == "visit_request") {
// Implementa a lógica específica para visit_request
// Por exemplo, exibir uma notificação específica para visit_request
if (notification != null && android != null) {
var androidPlatformChannelSpecifics = const AndroidNotificationDetails(
_channelId,
_channelName,
channelDescription: "Descrição específica para visit_request",
importance: Importance.max,
priority: Priority.high,
);
var platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
);
_flutterLocalNotificationsPlugin.show(
notification.hashCode,
"Título específico para visit_request",
"Corpo específico para visit_request",
platformChannelSpecifics,
payload:
"Dados adicionais que podem ser usados ao tocar na notificação",
);
}
} else if (notification != null && android != null) {
// Trata outras notificações como normalmente
var androidPlatformChannelSpecifics = const AndroidNotificationDetails(
_channelId,
_channelName,
channelDescription: _channelDescription,
importance: Importance.max,
priority: Priority.high,
);
var platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
);
_flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
platformChannelSpecifics,
);
}
}
Future<void> _firebaseMessagingBackgroundHandler(
RemoteMessage message) async {
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
}