某些类型的 FCM 数据消息无法传递到 iOS 设备。

4
我拥有一个发送数据和通知消息的 Cloud Functions 环境。
目前,我正在测试在 iPhone SE (2016) 和 iPhone 7 Plus 上的 FCM 消息 - 这两个设备之间的行为非常不一致,我想知道为什么。
  • iPhone SE (2016) 正在运行 iOS 14 beta 1
  • iPhone 7 Plus 正在运行 iOS 14 beta 3
以下 Cloud Function 发送通知和数据消息 - 这两个消息都成功地传递到这两个设备:
// 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);
}

但针对以下函数:

  1. The notification message successfully gets delivered to both devices

  2. But the data message only gets delivered to the iPhone SE (not the iPhone 7 Plus)

     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)
     }
    

只有当我删除一些有效负载时,才能成功地发送到iPhone 7 Plus(我从数据有效负载中删除了指令(instruction)图片(picture)地址(address)键值-然后它就起作用了)。

这里有什么问题吗?

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

2个回答

6
Firebase云消息传递使用Apple推送通知服务(APNs)向iOS应用发送消息(最大4KB)。在iOS中,通知数据消息有不同的处理方式,具体如下:
  • 通知消息:FCM自动代表客户端应用向终端用户设备显示消息。在用户点击通知打开应用之前,应用程序不会生成回调(此时会触发userNotificationCenter(_:didReceive:withCompletionHandler:)回调)。
  • 数据消息: 数据消息由FCM转换为所谓的后台通知("content-available":true)。后台通知是一种远程通知,不会显示警报、播放声音或更新应用程序图标徽章。在这种情况下,客户端应用负责处理数据消息。这种类型的通知旨在在后台唤醒您的应用程序,使其有时间从服务器启动下载并更新其内容。当发送"数据"("背景")通知时,将在通知到达时触发callback application(_:didReceiveRemoteNotification:fetchCompletionHandler:),而没有自动触发声音或警报。然而,请注意来自Apple文档的重要提示:

系统将后台通知视为低优先级:您可以使用它们来刷新应用程序的内容,但系统不保证它们的传递。此外,如果后台通知的总数过多,系统可能会限制其传递。系统允许的后台通知数量取决于当前条件,但不要试图在一小时内发送超过两到三个。

因此,问题可能与您的手机特定条件相关: 通知消息可以正确地传递到这两部手机,但是也许iPhone 7 Plus操作系统正在限制或延迟接收数据消息


是的,但它不起作用。最近我们在iOS设备上收不到数据消息通知,但在模拟器上可以正常工作。 - Oliver Dixon

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接