110 lines
4.2 KiB
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}");
|
|
}
|
|
}
|