当前位置: 首页 > 知识库问答 >
问题:

Firebase云消息传送到Android工作,但iOS失败。如何构建iOS的有效载荷?

孙辰阳
2023-03-14

我可以在iOS和Android上从Firebase控制台向我的应用程序发送测试通知。因此,我的应用程序设置正确,可以在两个平台上接收推送通知。但是,当我使用云函数发送通知时。仅接收Android设备上的通知。iOS设备上未显示任何通知。我怀疑这可能与我在云函数中创建有效负载的方式有关。也许我错过了iOS的一些东西。如果你能给我一些建议,那就太好了。

我检查了iOS设备的deviceToken是否正确,是否正确。

我使用Firebase控制台向iOS设备的同一设备发送了一条测试消息,通知已经发送。

因此,我得出结论,我的问题可能来自我编写的云函数。因此,我在下面分享云功能:

exports.notifToApp = functions.database.
ref(`/memInfo/{memId}/notifChoice/`).onWrite((snap, context) => {

//send only if exists and new notification OR if doesn't exist
if ((snap.before.exists() && (snap.after.val() !==  snap.before.val())) || !snap.before.exists()) {

//get notification body
const notificationTitle = snap.after.val().memName;
const notificationText = snap.after.val().notifText;

//get and loop over notification subscribers
return admin.database().ref(`/notifics/${context.params.memId}/notifSubs/`).once("value", subs => {
    if (subs.exists()) { 
    return subs.forEach(sub => {

//payload for notification
    const payload = {
        "notification":{
            "title": notificationTitle,
            "body": notificationText,
            "sound": "default",
            "click-action": "FCM_PLUGIN_ACTIVITY",
            "priority": "high"
        }
    }


//deliver notification
return admin.messaging().sendToDevice(sub.val().deviceToken, payload).catch(e => {console.log(e);});

    });
} else { //end: if returned any value
    return 0;
} 
});// end: get and loop over notification subscribers
} else { //end: send only if exists and new notification OR if doesn't exist
    return 0;
}
});

我没有得到任何错误消息。函数成功完成,状态为“确定”

我测试使用两个设备:一个Android和一个iOS。这两个设备令牌都正确地保存在数据库中,以便云函数检索和用于发送消息。

我在运行我的应用程序的Android设备上看到通知。我希望通知显示在运行相同应用程序的iOS设备上。

从Firebase控制台发送的测试消息通知在两个设备上都正确显示。

共有1个答案

匡晟
2023-03-14

我意识到sendToDevice()使用了旧版本的有效负载。我在函数中使用send()来使用较新的版本。(见答案:stackoverflow)

admin.messaging().send(payload).catch(e => console.log(e));

根据最新的指导原则,我更改了有效负载以包括平台特定的字段(参见firebase文档)

const payload = {
"token": sub.val().deviceToken,
"notification":{"title": notificationTitle,"body": notificationText},
"android": {"notification": {"sound": "default"}},
"apns": {"payload": {"aps": {"sound": "default"}}}
};

现在它可以在两个平台上工作。

 类似资料:
  • 当我为android构建我的Ionic应用程序时,它会出现错误。当我为iOS做同样的事情时,但没有问题插件列表附在下面 **插件列表** com-badrit-base 64 0.2.0”Base64”cordova-clipboard 1.3.0”剪贴板”cordova-plugin-add-swift-support 2.0.2”AddSwiftSupport”cordov-plugin-ba

  • FCM服务未向我的iOS应用程序发送消息。 > App CAN成功接收APNs令牌和实例ID令牌 App CAN使用推送通知实用程序利用. p8令牌在后台成功接收来自APN的推送 #2中使用的相同APNs密钥上传到Firebase控制台 应用程序无法接收Firebase控制台中Notification Composer发送的消息,也无法使用CURL请求接收消息。 应用程序在通过FCM发送时不显示任

  • 在Firebase Cloud Messaging(FCM)中是否有方法查看成功发送和失败推送通知/消息的数量?我知道我可以只使用Firebase通知,但我必须使用它们的控制台发送推送通知,这对于我的用例来说是不实际的。 谷歌在此页面上解释了如何访问andoid的统计数据。但iOS也有办法吗?

  • 我最近将我的iOS应用从一个开发人员帐户转移到另一个开发人员帐户,现在我无法从Firebase云消息发送推送通知到我的应用。我尝试了以下方法: null 很明显,FCM代币已经更新,问题在于我在苹果方面遗漏了/忘记了做什么,以允许FCM与APN对话,但我无法找出我做错了什么。有什么想法吗?

  • 在定义消息有效负载时的Firebase云消息文档中: 通过使用数据和/或通知键创建对象,可以指定一种或两种消息类型。 文档给出了组合消息的示例: 另请参阅后台应用程序中处理通知消息的文档: 这包括同时包含通知和数据有效负载的消息(以及从通知控制台发送的所有消息)。在这些情况下,通知会发送到设备的系统托盘,数据有效负载会在启动器活动的目的之外发送。 我用这个有效载荷发送通知: 但是始终为空: 我做错

  • 我通过一个‘管理应用程序’发送数据到FCM服务器,并希望其他‘非管理应用程序’能够接收推送通知,每当‘管理应用程序’发送数据到FCM服务器。 类似{“click_action”:“com.example.application.androidapp.main_activity”}或{“click_action”:“main_activity”}就可以了?