Уведомление Firebase не приходит в фоновом режиме для iOS 17 во флаттере

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. Это реальная проблема или что-то еще? Пожалуйста, проведите меня через... заранее спасибо


523
2

Ответы:

В 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.