Flutter, возникли проблемы с получением уведомлений Firebase в версиях iOS 17. Пока приложение открыто, уведомления принимаются правильно. Но когда я переводю приложение в фоновый режим или закрываю его, это означает, что уведомление не получено. Но в iOS 15.8.1 уведомления принимаются правильно. Есть ли проблемы с iOS 17? Кто-нибудь сталкивается с этой проблемой?
Я пробовал добавить эти функции в Appdelegate.swift, но все равно столкнулся с проблемой...
func function(application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
}
Прочитав эту тему, я узнал, что возникла проблема с бета-версиями iOS 17. Это реальная проблема или что-то еще? Пожалуйста, проведите меня через... заранее спасибо
В iOS, когда приложение завершает работу (т. е. не работает в фоновом режиме), оно не может получать уведомления напрямую. Однако вы по-прежнему можете обрабатывать уведомления, которые были доставлены, когда приложение работало в фоновом режиме или было завершено, с помощью метода userNotificationCenter(_:didReceive:withCompletionHandler:) объекта UNUserNotificationCenterDelegate.
Вот как вы можете обрабатывать уведомления во Flutter, когда приложение закрывается в iOS:
Настройте UNUserNotificationCenterDelegate в файле AppDelegate.swift:
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.Реализуйте метод handle в файле main.dart для обработки уведомлений, полученных, когда приложение находится в фоновом режиме или завершено:
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',
),
),
);
}
}
С помощью этой настройки вы можете обрабатывать уведомления, полученные, когда приложение работает в фоновом режиме или завершено. Когда приложение завершается, будет вызван метод userNotificationCenter(_:didReceive:withCompletionHandler:) UNUserNotificationCenterDelegate, и вы сможете обработать уведомление соответствующим образом.
Использовался метод push-сообщений для преобразования даты и времени на основе часового пояса пользователя. Я исправил эту проблему, изменив метод Push-сообщения на метод Push-уведомлений. При использовании метода push-сообщений сложно отобразить уведомление, пока приложение находится в фоновом режиме или в состоянии «Уничтожено». Поэтому использование метода push-уведомлений — лучший способ уведомления. После этого я столкнулся с проблемой уведомлений в iOS. Для этого в файле info.plist измените FirebaseAppDelegateProxyEnabled = NO на FirebaseAppDelegateProxyEnabled = YES.