我在从 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_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);