Flutter / Cloud Messaging 通知 - 调用函数 cloud 时令牌未定义

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

当我在 flutter 类中的某个位置执行操作时,我会调用我的函数。 (当用户添加单词时,我希望与之连接的合作伙伴收到有关新单词的通知!) 当我打印partnerFcmToken时,它就在这里并且运行良好。 问题是,当我调用该函数时,它总是返回令牌未定义。

 String? partnerFcmToken = userSnap['partner_fcm_token'] as String?;

        if (partnerFcmToken != null && partnerFcmToken.isNotEmpty) {
          print("Envoie notif fait.");
          print(partnerFcmToken);

          // Call the cloud function to send the notification
          final response = await FirebaseFunctions.instance
              .httpsCallable('sendNotificationToPartnerPhoneV2')
              .call({
             'token_partner': partnerFcmToken,
            'lang1': lang1, // Include lang1 in the request
            'lang2': lang2, // Include lang2 in the request
          });

          if (response.data['success']) {
            print("Notification sent successfully!");
          } else {
            print("Failed to send notification: ${response.data['error']}");
          }
        }

这里是调用的云函数。 它返回合作伙伴 FCM 令牌无效或为空。

const functions = require("firebase-functions");
const admin = require("firebase-admin");

admin.initializeApp();

// eslint-disable-next-line max-len
exports.sendNotificationToPartnerPhoneV2 = functions.https.onCall(async (request) => {
  console.log("Starting sendNotificationToPartnerPhoneV2 function");

  // Retrieve the FCM token from the request
  const partnerFcmToken = request.token_partner;

  // Validate the FCM token
  if (typeof partnerFcmToken !== "string" || partnerFcmToken.trim() === "") {
    console.error("Invalid partner FCM token:", partnerFcmToken);
    return {success: false, error: "Partner FCM token is invalid or empty."};
  }

  // Prepare the notification message
  const message = {
    notification: {
      title: "Your partner added a new word!",
      // eslint-disable-next-line max-len
      body: `${request.lang1} / ${request.lang2}`, // Use template literals for message body
    },
    token: partnerFcmToken,
  };

  // Log the message to be sent
  console.log("Message to be sent:", JSON.stringify(message, null, 2));

  try {
    // Send the notification
    await admin.messaging().send(message);
    console.log("Notification sent successfully.");
    return {success: true};
  } catch (error) {
    console.error("Error sending notification:", error);
    return {success: false, error: error.message};
  }
});

我想我把它称为“请求”或放入函数参数中的数据,但我不知道它如何在 JS 中正常工作。

已经感谢您的帮助! MG

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

根据文档,从客户端发送的对象有效负载出现在函数中CallableRequest对象的data属性中。

请求参数包含从客户端应用程序传递的数据以及身份验证状态等附加上下文。对于将文本消息保存到实时数据库的可调用函数,例如,数据可以包含消息文本,以及 auth 中的身份验证信息。

所以你的代码将如下所示:

  const partnerFcmToken = request.data.token_partner;
© www.soinside.com 2019 - 2024. All rights reserved.