某些类型的FCM数据消息不会传递到iOS设备

某些类型的FCM数据消息不会传递到iOS设备,ios,firebase,google-cloud-functions,firebase-cloud-messaging,ios14,Ios,Firebase,Google Cloud Functions,Firebase Cloud Messaging,Ios14,我有一个发送数据和通知消息的环境 目前,我正在iPhone SE(2016)和iPhone 7 Plus上测试FCM消息,这两款设备之间的行为非常不一致,我想知道原因 iPhone SE(2016)正在运行iOS 14 beta 1 iPhone7Plus正在运行iOS14Beta3 以下云功能发送通知和数据消息-这两个消息都成功传递到两个设备: // These options are global for all my fcm messages const options = { pri

我有一个发送数据和通知消息的环境

目前,我正在iPhone SE(2016)和iPhone 7 Plus上测试FCM消息,这两款设备之间的行为非常不一致,我想知道原因

  • iPhone SE(2016)正在运行iOS 14 beta 1
  • iPhone7Plus正在运行iOS14Beta3
以下云功能发送通知和数据消息-这两个消息都成功传递到两个设备:

// These options are global for all my fcm messages
const options = { priority: "high", timeToLive: 30000, content_available: true }

function sendProfile() { 
    ...
    const fcmToken = ********
    const notif = {
        notification: {
            title: "test title",
            body: "test body"
        }
    }
    admin.messaging().sendToDevice(fcmToken, notif, options);
    const dataMsg = {
        data: {
            id: id,
            type: "match",
            uid: uid,
            name: name,
            age: age.toString(),
            bio: bio,
            img1: String(img1),
            img2: String(img2),
            img3: String(img3),
            pronoun: pronoun,
            error: String(bot)
        }
    }
    return admin.messaging().sendToDevice(fcmToken, dataMsg, options);
}
但是,对于以下功能:

  • 通知消息已成功传递到两个设备

  • 但数据信息只会发送到iPhone SE(而不是iPhone 7 Plus)

  • 只有当我删除部分有效负载时,它才会成功地发送到iPhone 7 Plus(我从数据有效负载中删除了
    指令
    图片
    地址
    键值,然后它才起作用)

    你知道这里有什么问题吗


    编辑:我的Android设备没有问题。

    如果你能找到有关FCM消息的一些信息,如果你能找出与iPhone 7 plus设备有关的任何问题,你必须减少有效负载,请查看本博客。

    Firebase云消息依靠苹果推送通知服务(APNs)向iOS应用程序发送消息(最大4KB)。在iOS中,通知和数据消息的处理方式不同,特别是:

    • 通知消息:FCM代表客户端应用程序自动向最终用户设备显示消息。在这种情况下,在用户点击打开应用程序的通知之前,不会在应用程序上生成任何回调(在这种情况下,会触发userNotificationCenter(u:didReceive:withCompletionHandler:)回调)
    • 数据消息: 数据消息由FCM层在所谓的(“内容可用”:true)中转换。后台通知是一种远程通知,它不会显示警报、播放声音或标记应用程序的图标,在这种情况下,客户端应用程序负责处理数据消息。这种通知的目的是在后台唤醒你的应用程序,让它有时间从你的服务器开始下载并更新其内容。发送“数据”(“后台”)通知时,在通知到达时会触发回调应用程序(“didReceiveMemotentification:fetchCompletionHandler:”),并且不会自动触发声音或警报。但是,请考虑苹果文档中的这一重要注意事项:
    系统将后台通知视为低优先级:您可以使用它们刷新应用程序的内容,但系统不保证它们的传递。此外,如果总数过多,系统可能会限制后台通知的传递。系统允许的后台通知数量取决于当前情况,但不要尝试每小时发送超过两到三次


    因此,问题可能与您手机的特殊情况有关:通知消息正确地发送到两部手机,但可能是iPhone 7 Plus操作系统正在限制或延迟数据的接收。

    是的,但它不起作用。数据消息通知最近停止在iOS设备上工作,但在模拟器上工作。
     function sendPlace(fcmToken, placeSnapshot, matchName){
         let docId = placeSnapshot.id;
         let place = placeSnapshot.data();
         console.log("sendPlacee: ", place.name, " to: ", fcmToken);
         const dataMsg = {
             data: {
                 type: "place",
                 name: place.name,
                 latitude: place.l.latitude.toString(),
                 longitude: place.l.longitude.toString(),
                 instruction: String(place.instruction),
                 placeId: docId,
                 picture: String(place.picture1),
                 matchName: matchName,
                 address: place.address
             }
         }
         const notif = {
             notification: {
                 title: "test place function",
                 body: "test the body message"
             }
         }
         admin.messaging().sendToDevice(fcmToken, notif, options)
         return admin.messaging().sendToDevice(fcmToken, dataMsg, options)
     }