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中,当应用程序终止(即不在后台运行)时,它无法直接接收通知。但是,您仍然可以使用 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:) 方法,您可以相应地处理通知。