Фоновое push-уведомление Flutter не работает для iOS

#firebase #flutter #push-notification #firebase-cloud-messaging

#firebase #flutter #push-уведомление #firebase-облако-обмен сообщениями

Вопрос:

Я просмотрел все другие вопросы и ответы, но не смог решить свою проблему, даже если попробовал все.

Я могу получать уведомления, когда приложение находится на переднем плане для IOS и Android. Но если я нахожусь в фоновом режиме для IOS, мне нужно войти в приложение, чтобы увидеть уведомление.

Код для инициализации main.dart

   @override
  void initState() {
    super.initState();
    _firebaseMessaging = FirebaseMessaging();
    _firebaseMessaging.requestNotificationPermissions(
        IosNotificationSettings(sound: true, badge: true, alert: true));
    print("requested");
    _firebaseMessaging.getToken().then((String token) {
      assert(token != null);
      print("token");
      print(token);
    });
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
        //showNotification(message);
      },
      onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler,
      onLaunch: (Map<String, dynamic> message) async {
        // this will never called, but it's ok
        print("onLaunch: $message");
      },
      onResume: (Map<String, dynamic> message) async {
        // this will never called, but it's ok
        print("onResume: $message");
      },
    );

    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {
      print("Settings registered: $settings");
    });
    var androidInitialize = AndroidInitializationSettings('app_icon');
    var iosInitialize = IOSInitializationSettings();
    var initializationSettings =
        InitializationSettings(androidInitialize, iosInitialize);
    //flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: notificationSelected);
  }
  

У меня есть эти ключи, связанные с уведомлениями в моем info.plist.

 <key>FirebaseAppDelegateProxyEnabled</key>
<string>NO</string>
<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>processing</string>
    <string>remote-notification</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
  

Мой файл AppDelagete.swift

 import UIKit
import Flutter
import Firebase

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    if FirebaseApp.app() == nil { FirebaseApp.configure()}
    // if #available(iOS 10.0, *) {
    //   UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    // }
    // Messaging.messaging().apnsToken = deviceToken
    // super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
 
    if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
      UNUserNotificationCenter.current().delegate = self

      let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
      UNUserNotificationCenter.current().requestAuthorization(
        options: authOptions,
        completionHandler: {_, _ in })
    } else {
      let settings: UIUserNotificationSettings =
      UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
      application.registerUserNotificationSettings(settings)
    }

    application.registerForRemoteNotifications()
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
  

Я попытался с помощью этого кода отправить уведомление

 DATA='{"notification": {"body": "Body","title": "Title Title"}, "priority": "high", "data": {"click_action": "FLUTTER_NOTIFICATION_CLICK", "id": "1", "status": "done", "priority":"high"}, "to": "<TOKEN>"}'
curl https://fcm.googleapis.com/fcm/send -H "Content-Type:application/json" -X POST -d "$DATA" -H "Authorization: key=<SERVERKEY>"
  

Большое вам спасибо…

Комментарии:

1. Есть некоторые обсуждения разработчиков, в настоящее время это не поддерживается на устройствах iOS. Однако этот комментарий; github.com/FirebaseExtended/flutterfire/issues/… указывает, что поддержка будет добавлена в будущих версиях. Возможно, я ошибаюсь.

2. Я посмотрел здесь medium.com/@jun.chenying /. … В этом примере нет проблем с фоновым уведомлением IOS. Я делал то же самое, но мой код не работает. Я просмотрел другие вопросы и ответил также, некоторые из них решены. Но я не мог решить, даже если я делал то же самое. Спасибо за ваш ответ, возможно, фоновое уведомление IOS официально не поддерживается в текущей версии, как вы видите. Я должен сдаться и дождаться новой версии 🙂

3. Эта проблема все еще открыта. Пожалуйста, проверьте следующее. github.com/firebase/flutterfire/issues/6290

Ответ №1:

Вам необходимо включить функцию «фоновый режим» в настройках, чтобы приложение Flutter получало сообщения в фоновом режиме на iOS. Следуйте этому руководству для получения более подробной информации.