来自 Node.js 管理 sdk 的 Firebase 消息通知未传送(或显示)到 iOS 设备

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

我在从 Firebase 发送到 iOS 设备的通知中遇到问题。客户端应用程序是使用 flutter 制作的。
通知是使用 admin-firebase 包从 node.js 云函数发送的。 notificationPayload 是为通知字段和数据字段而形成的。用于发送消息的方法是 send,我使用从 flutter FirebaseMessaging 库读取的 FCMtoken,当每个用户进入应用程序时,我将其存储在 firestore 中。我最多允许用户使用 5 个 FCM 令牌,以防他们登录到许多设备,因此发送将到达用户登录的所有设备。

这就是我的职责:

//Attempt to send an identic message (title, body) to every token in fcmTokens
//fcmTokens is an array of objects and assume that the variable token indeed holds the valid //token for each iteration
function sendNotifications(fcmTokens, userId, payloadData, title, body, silent = false) {
  // Customize the notification payload
  try {
    Object.entries(fcmTokens).forEach(async (entry) => {
      const key = entry[0];
      const token = entry[1];
      console.log(`Key: ${key} - Token: ${token}`);

      notificationPayload = {
        token: token,
      };
      if (payloadData) {
        notificationPayload.data = payloadData;
      }

      // Add notification body if it's not a silent notification
      if (!silent) {
        notificationPayload.notification = {
          title: title,
          body: body,
          content_available: true
        };
      } else {
        console.log("Silent notification.");
      }
      const messaging = admin.messaging();
      
      await messaging.send(notificationPayload)
      .then((response) => {
        // Response is a message ID string.
        //console.log(`Notificationpayload: ${JSON.stringify(notificationPayload)}`);
        console.log('Successfully sent message:', response);
      })
      .catch(async (error) => {
        console.error('Error sending message:', error);
      });
    });
  } catch (error) {
    console.error(`Error building notification payload: ${error}`);
    return null; // Handle the error as needed
  }
}

令牌存储在键对值映射的 firestore 中,以便云函数能够获取这些值。 因此,每次云函数发送通知时,它都会首先从 firestore 读取必要的令牌。

问题是我能够在android中接收通知(无论是在前台还是后台,甚至是没有通知的静默通知),但不能在iOS中接收通知(无论是前台还是后台)。我确信 FCMtoken 已成功读取并存储在 Firestore 中,因为当我登录 iOS 设备时,我看到 firestore 文档正在更新。 奇怪的是,我从 firestore 手动选择了 FCMtoken,并使用 firebase Web 控制台上云消息部分中的测试发送消息按钮,并在 iOS 设备中成功收到了测试通知。

我需要在 iOS 应用程序本身中进行额外的配置还是需要向有效负载添加更多内容?

更新 我在 iOS 物理设备中以调试模式运行该应用程序,我看到了这一点:

[错误:flutter/runtime/dart_vm_initializer.cc(41)] 未处理 异常:无效参数:必须在以下情况下设置 iOS 设置: 针对iOS平台。 #0 FlutterLocalNotificationsPlugin.initialize (包:flutter_local_notifications/src/flutter_local_notifications_plugin.dart:151:9) #1NotificationControllerFree._configureLocalNotifications(包:resistancees/notification_controller_free.dart:48:44) #2NotificationControllerFree.initializeRemoteNotifications(包:resistancees/notification_controller_free.dart:41:11)

所以我将更新 flutter 本地通知初始化,让我们看看我是否设法得到其他东西。

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

确保您请求在 iOS 上接收通知的权限。根据您提供的日志,我假设您正在使用

flutter_local_notifications
包。检查套餐提供商的此指南,并按照其请求许可。

关于您更新中的问题,我怀疑原因是在初始化步骤中,该步骤应类似于以下代码:

final InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    iOS: initializationSettingsDarwin, # this must be added for targeting iOS
    macOS: initializationSettingsDarwin,
    linux: initializationSettingsLinux);
await flutterLocalNotificationsPlugin.initialize(initializationSettings,
    onDidReceiveNotificationResponse: onDidReceiveNotificationResponse);
© www.soinside.com 2019 - 2024. All rights reserved.