在 ios 中关闭应用程序时不会出现 FCM 数据消息

FCM data message not coming when app is closed in ios

我已经使用 flutter_local_notification 在我的 flutter 项目中集成了 FCM。 Android 中的一切都按预期工作。但是,ios 几乎也可以工作,除非应用程序从历史记录中关闭。当应用程序从历史消息中清除时,不会触发。我在推送通知中仅使用数据消息。请看下面:

{
   "to": "/topics/global",
   "priority": "high",
   "content_available": true,
   "data": {
      "title": "Demo Title",
      "message": "Demo Message",
      "payload": "basic"
   }
}

如您所见,json 中没有 notification 对象。此配置在 Android(前景和背景)和 ios 仅前景上运行良好。但是,如果我在这个 json 中添加 notification 对象,令人惊讶的是 it works even the app is closed.

但是因为我需要手动处理通知,所以该选项不适合我的用例。所以我进一步研究并禁用了 Method Swizzling

<key>FirebaseAppDelegateProxyEnabled</key> 
<false/>

但这也无济于事。现在我有点迷路了,找不到达到预期结果的方法。我的AppDelegate.swift如下

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
   override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
    }
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

注意:ios 应用已在 TestFlight 中发布并在真实设备上进行测试

经过长时间的研究,我找不到解决此问题的绝对方法。但是,我已经针对该问题实施了解决方法。

我有 3 种发送通知的方案,它们是

1. Sending notification to specific user
2. Sending notification to all user
3. Sending notification to a topic

当用户打开应用程序时,我会检查用户使用的是哪个平台。如果它是 Android,那么我将设备令牌存储为 android,否则 ios。同时,我还将用户注册到主题 global_android 如果平台是 Androidglobal_ios 如果平台是 ios.

现在,当我从管理面板发送通知时,我将条件与上述 3 种情况相匹配。对于 android,我使用以下 json 配置来发送通知

{
  "to": "topic || token",
  "priority": "high",
  "content_available": true,
  "data": {
     "title": "Demo Title",
     "message": "Demo Message",
     "payload": "basic"
  }
}

对于ios,我使用以下配置

{
  "to": "/topics/global",
  "priority": "high",
  "content_available": true,
  "notification": {
     "title": "Demo Title",
     "body": "Demo Message"
  },
  "data":{
      "key1":"value",
      "key2":"value"
  }
}

现在,当我收到通知时,我会再次检查平台。如果它是 Android,那么我会使用 'flutter_local_notification' 插件显示自定义通知,如果它是 ios,那么我什么都不做,因为 firebase 已经显示了通知。

这不是一个绝对的解决方案,但你猜怎么着,它对我有用。