Firebase 在 Flutter 中未在后台接收 iOS 17 通知

问题描述 投票:0回答:1

Flutter,在 iOS 17 版本中 Firebase 通知接收存在一些问题。 打开应用程序时,可以正确接收通知。 但是,当我将应用程序置于后台或终止时,这意味着未收到通知。 但在 iOS 15.8.1 中可以正常接收通知。 iOS 17 有问题吗? 有人遇到这个问题吗

我尝试在 Appdelegate.swift 中添加这些函数,但仍然面临问题...

 func function(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Messaging.messaging().apnsToken = deviceToken
}

按照这个线程,我了解到iOS 17 beta版本存在问题。这是实际问题还是其他问题?请引导我完成... 预先感谢

ios flutter dart firebase-cloud-messaging ios17
1个回答
0
投票

在iOS中,当应用程序终止(即不在后台运行)时,它无法直接接收通知。但是,您仍然可以使用 UNUserNotificationCenterDelegate 的 userNotificationCenter(_:didReceive:withCompletionHandler:) 方法处理应用程序在后台运行时传递的通知或终止通知。

以下是当应用程序在 iOS 中终止时如何处理 Flutter 中的通知:

在 AppDelegate.swift 文件中设置 UNUserNotificationCenterDelegate:

import UIKit
import Flutter
import UserNotifications

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate, UNUserNotificationCenterDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        GeneratedPluginRegistrant.register(with: self)

        // Set UNUserNotificationCenterDelegate
        UNUserNotificationCenter.current().delegate = self

        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    // Handle notification when app is in foreground, background, or terminated
    func userNotificationCenter(
        _ center: UNUserNotificationCenter,
        didReceive response: UNNotificationResponse,
        withCompletionHandler completionHandler: @escaping () -> Void
    ) {
        // Handle notification here
        completionHandler()
    }
}

2.在main.dart文件中实现handle方法来处理应用程序在后台或终止时收到的通知:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:firebase_messaging/firebase_messaging.dart';

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initializeFlutterLocalNotificationsPlugin();

  runApp(MyApp());
}

Future<void> initializeFlutterLocalNotificationsPlugin() async {
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  final InitializationSettings initializationSettings =
      InitializationSettings(android: initializationSettingsAndroid);
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;

  @override
  void initState() {
    super.initState();
    _firebaseMessaging.requestPermission();
    _firebaseMessaging.getToken().then((token) {
      print('FCM Token: $token');
    });

    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      print("onMessage: $message");
      // Handle notification received while app is in foreground
    });

    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      print("onMessageOpenedApp: $message");
      // Handle notification tapped when app is in background or terminated
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo'),
      ),
      body: Center(
        child: Text(
          'Push Notifications',
        ),
      ),
    );
  }
}

通过此设置,您可以处理应用程序在后台运行或终止时收到的通知。当应用程序终止时,将调用 UNUserNotificationCenterDelegate 的 userNotificationCenter(_:didReceive:withCompletionHandler:) 方法,您可以相应地处理通知。

© www.soinside.com 2019 - 2024. All rights reserved.