【问题标题】:How save firebase push notification device local when app closed in flutter?当应用程序在 flutter 中关闭时,如何在本地保存 firebase 推送通知设备?
【发布时间】:2023-01-20 00:16:50
【问题描述】:

我使用 Hive_flutter 和 flutter_local_notifications:^13.0.0。而且我没有任何关于在应用程序关闭时保存通知设备本地的想法。 你能帮助我吗?谢谢你的关注

【问题讨论】:

    标签: flutter


    【解决方案1】:

    我不明白主要问题。您只想在应用程序关闭或在后台时显示通知?或者你真的需要将它们保存到本地数据库?无论如何,尝试使用这个类

    import 'dart:async';
    
    import 'package:firebase_core/firebase_core.dart';
    import 'package:firebase_messaging/firebase_messaging.dart';
    import 'package:flutter_local_notifications/flutter_local_notifications.dart';
    
    class PushNotificationService {
      static FirebaseMessaging messaging = FirebaseMessaging.instance;
      static final FlutterLocalNotificationsPlugin notificationPlugin =
          FlutterLocalNotificationsPlugin();
      static const AndroidNotificationChannel channel = AndroidNotificationChannel(
        'high_importance_channel', // id
        'High Importance Notifications', // title
        description:
            'This channel is used for important notifications.', // description
        importance: Importance.high,
      );
      static String? idPush;
      static StreamController<RemoteMessage> _messageStream =
          StreamController.broadcast();
      static Stream<RemoteMessage> get messagesStream => _messageStream.stream;
    
      static Future _backgroundHandler(RemoteMessage message) async {
        _messageStream.add(message);
        // implement your actions here
      }
    
      static Future _onMessageHandler(RemoteMessage message) async {
        _messageStream.add(message);
        // implement your actions here, if you want to use flutter_local_notifications, use the display() method.
      }
    
      static Future _onMessageOpenApp(RemoteMessage message) async {
        _messageStream.add(message);
        // implement your actions here
      }
    
      // iniciar firebase i notificacions locals
      static Future initializeApp() async {
        //Push notifications
        await Firebase.initializeApp();
        idPush = await FirebaseMessaging.instance.getToken();
        print('idPush: $idPush');
        //Handler
        FirebaseMessaging.onBackgroundMessage(_backgroundHandler);
        FirebaseMessaging.onMessage.listen(_onMessageHandler);
        FirebaseMessaging.onMessageOpenedApp.listen(_onMessageOpenApp);
    
        //local notifications initialization
        const InitializationSettings initializationSettings =
            InitializationSettings(
          iOS: DarwinInitializationSettings(),
          android: AndroidInitializationSettings("@mipmap/ic_notification"),
        );
        notificationPlugin.initialize(initializationSettings);
      }
    
      // mètode per obrir una notificació local (només amb l'app oberta)
      static void display(RemoteMessage message) async {
        try {
          await notificationPlugin.show(
            message.notification!.hashCode,
            message.notification!.title,
            message.notification!.body,
            NotificationDetails(
              android: AndroidNotificationDetails(
                channel.id,
                channel.name,
                channelDescription: channel.description,
                color: Colors.blue,
                icon: '@mipmap/ic_notification',
              ),
              iOS: const DarwinNotificationDetails(
                  presentAlert: true, presentBadge: true, presentSound: true),
            ),
          );
        } on Exception catch (e) {
          print(e);
        }
      }
    
      // demanar permisos
      Future<void> requestPermission() async {
        NotificationSettings settings = await messaging.requestPermission(
          alert: true,
          announcement: false,
          badge: true,
          carPlay: false,
          criticalAlert: false,
          provisional: false,
          sound: true,
        );
    
        if (settings.authorizationStatus == AuthorizationStatus.authorized) {
          print('User granted permission');
        } else if (settings.authorizationStatus ==
            AuthorizationStatus.provisional) {
          print('User granted provisional permission');
        } else {
          print('User declined or has not accepted permission');
        }
      }
    
      static closeStreams() {
        _messageStream.close();
      }
    }
    

    当应用程序关闭或在后台时,此类将显示通知。如果您需要在应用程序打开时显示它们,您可以通过显示方法。如果你想将它们保存到配置单元中,只需在处理程序上实现该部分即可。 最后在你的 main 中初始化类:

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await PushNotificationService.initializeApp();
      runApp(const MyApp());
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2011-06-23
      • 2013-08-16
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多