Flutter firebase 消息:iOS 手机没有捕获消息

问题描述 投票:0回答:3

我正在尝试在我的应用程序上使用 flutter firebase 消息传递。我在 pubspec.yaml 文件上安装了这些库:

dependencies:
    ...
    firebase_core: ^0.5.1
    firebase_messaging: ^8.0.0-dev.9

在 Android 中我没有任何问题,但在 Ios 中即使我的应用程序位于前台,我也没有收到任何消息。事实上

FirebaseMessaging.onMessage
FirebaseMessaging.onBackgroundMessage
根本没有触发。

Future initialise() async {
    //Firebase.initializeApp() I initialized on main method first
    FirebaseMessaging _fcm = FirebaseMessaging.instance;

    _fcm.requestPermission(alert: true, badge: true, sound: true);
    if (Platform.isAndroid) {
      _token = await _fcm.getToken();
      print("------> token is: $_token");
      } else if (Platform.isIOS) {
        _token = await _fcm.getAPNSToken(); // token received from firebase
        print("------> token is: $_token");

    }

    FirebaseMessaging.onMessage.listen((remoteMessage) async {
      print('[onMessage] message: ${remoteMessage.data}');
      var msg = PushMsgModel().wrapOriginMessage(remoteMessage);
      _showOverlyNotify(msg);
    });

    FirebaseMessaging.onBackgroundMessage(onBackgroundMessage);
  }
  • 对于IOS配置我添加了

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

    Info.plist

  • 我创建了 APNs 证书,并将其添加到 ios firebase 项目设置中

  • 我注册了一个应用程序标识符

  • 我生成了一个配置文件并添加到 xcode 中的

    Provisioning Profile

  • 在 Xcode 中,我在 Project Navigator 中选择了 Runner。在

  • 功能选项卡我打开了推送通知和后台模式, 并在后台模式下启用后台获取和远程通知。

  • 我还复制了 GoogleService-Info.plist 文件,在 ios/Runner.xcworkspace 与 Xcode。

enter image description here

AppDelegate.swift 包括:

import UIKit
import Flutter

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

但是当我从 firebase 控制台推送消息时,我无法在 android studio 控制台上收到任何消息? 我的错误是什么?有人可以帮助我吗?

当应用程序可以获取令牌时,说明我的配置是正确的?

我正在iPhone7plus(移动)使用软件版本14.4进行测试

flutter firebase-cloud-messaging flutter-ios
3个回答
1
投票

我在使用

FirebaseMessaging.onBackgroundMessage
的真实设备上使用 IOS 15.2 时也遇到了同样的问题,而 Android 则没有任何问题。我花了几天时间测试不同的建议,三次检查我的配置,更新依赖项,测试自定义 APN 负载。没有任何效果。

就我而言,我意识到每次在测试之间执行

flutter run
,在调试模式下运行的应用程序都会采用新的
UUID
,因为应用程序会重新安装,因此,应用程序无法映射之前的通知当应用程序有新的 UUID 并且后台处理程序从未触发时到达。

当我在

真实设备
上以发布模式flutter run --release测试它时,确保UUID保持不变(
iosDeviceInfo.identifierForVendor
)最终我得到了预期的结果。


0
投票

更新 iOS 前台通知呈现选项,以允许在 runApp() 之前显示抬头通知。

await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: false,
    badge: false,
    sound: false,
  );

0
投票

我遇到了类似的问题,我花了两天时间才找出原因并解决它。

如果您正在使用:

if #available(iOS 10.0, *) {
    UNUserNotificationCenter.current().delegate = self
}

这意味着通知将通过

AppDelegate
的委托方法直接发送到
UNUserNotificationCenter
,而不是发送到
FirebaseMessaging.onMessage.listen

为了解决这个问题,我使用了以下方法:

  • AppDelegate.swift
    中,保留
    UNUserNotificationCenter
    的委托设置,当通知到达时,您可以使用
    MethodChannel
    将数据传递给Flutter。
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    if let aps = userInfo["aps"] as? [String: AnyObject] {
        let alert = aps["alert"] as? [String: AnyObject]
        let title = alert?["title"] as? String ?? ""
        let body = alert?["body"] as? String ?? ""

        // Send the notification data to Flutter via MethodChannel
        let methodChannel = FlutterMethodChannel(name: "com.example.app/notifications", binaryMessenger: (window?.rootViewController as! FlutterViewController).binaryMessenger)
        methodChannel.invokeMethod("onMessage", arguments: ["title": title, "body": body])
    }

    // Present the notification
    completionHandler([.alert, .badge, .sound])
}
  • 在您的 Flutter 应用程序中,创建一个
    MethodChannel
    来监听来自 iOS 原生代码的事件并在 Flutter 中处理它们:
static const platform = MethodChannel('com.example.app/notifications');
platform.setMethodCallHandler((call) async {
  if (call.method == "onMessage") {
    String title = call.arguments["title"];
    String body = call.arguments["body"];
    print("Received message: $title - $body");

    // Handle the notification data
  }
});

这应该可以解决问题,并允许您通过

MethodChannel
处理 Flutter 中的通知。

© www.soinside.com 2019 - 2024. All rights reserved.