Firebase Cloud Messaging to Android 工作,但 iOS 失败。如何为 iOS 构建有效负载?

Posted

技术标签:

【中文标题】Firebase Cloud Messaging to Android 工作,但 iOS 失败。如何为 iOS 构建有效负载?【英文标题】:Firebase Cloud Messaging to Android works but iOS fails. How to structure payload for iOS? 【发布时间】:2019-07-16 22:04:26 【问题描述】:

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

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

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

因此,我断定我的问题可能来自我编写的云函数。于是,我分享下云功能:

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;

);

我没有收到任何错误消息。功能成功完成,状态为“OK”。

我使用两台设备进行测试:一台 android 和一台 iOS。两个设备令牌都正确保存在数据库中,以供云功能检索和用于发送消息。

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

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

【问题讨论】:

【参考方案1】:

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

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

我根据最新指南更改了有效负载以包含平台特定字段(请参阅firebase docs)

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

现在它可以在两个平台上运行。

【讨论】:

以上是关于Firebase Cloud Messaging to Android 工作,但 iOS 失败。如何为 iOS 构建有效负载?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase Cloud Messaging onMessage 被触发两次

Google Cloud Messaging与Firebase

Firebase Cloud Messaging:Firebase Admin SDK 中的设备组发送支持

如何使用 Firebase Cloud Messaging 在前台显示多个通知

Firebase Cloud Messaging 无法在带有 Flutter 应用程序的 Android 上运行

如何使用 Firebase Cloud Messaging 向所有设备发送通知