【问题标题】:Certain types of FCM data messages are not delivered to iOS device某些类型的 FCM 数据消息不会传送到 iOS 设备
【发布时间】:2020-11-22 16:46:36
【问题描述】:

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

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

  • iPhone SE (2016) 运行 iOS 14 beta 1
  • iPhone 7 Plus 运行 iOS 14 beta 3

以下云功能发送通知和数据消息 - 两者都成功传送到两个设备:

// 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. 通知消息已成功发送到两台设备

  2. 但数据信息只发送到 iPhone SE(不是 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(我从数据有效载荷中删除了 instructionpictureaddress 键值 - 然后它起作用了)。

知道这里有什么问题吗?

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

【问题讨论】:

    标签: ios firebase google-cloud-functions firebase-cloud-messaging ios14


    【解决方案1】:

    Firebase 云消息传递依赖 Apple 推送通知服务 (APN) 向 iOS 应用发送消息(最大为 4KB)。在 iOS 中,notificationsdata 消息的处理方式不同,尤其是:

    • 通知消息:FCM 代表客户端应用程序自动向最终用户设备显示消息。在这种情况下,在用户点击打开应用程序的通知之前,不会在应用程序上生成回调(在这种情况下会触发 userNotificationCenter(_:didReceive:withCompletionHandler:) 回调)
    • 数据消息: 数据消息由 FCM 层转换为所谓的background notifications ("content-available" : true)。背景通知是不显示警报、播放声音或标记应用程序图标的远程通知,在这种情况下,客户端应用程序负责处理数据消息。这种通知旨在在后台唤醒您的应用程序,使其有时间从您的服务器启动下载并更新其内容。当发送“data”(“background”)通知时,回调 application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 在通知到达的时间并且不会自动触发声音或警报。但是,请注意 Apple 文档中的这一重要说明:

    系统将后台通知视为低优先级:您可以使用它们来刷新应用的内容,但系统不保证它们的交付。此外,如果总数变得过多,系统可能会限制后台通知的传递。系统允许的后台通知数量取决于当前情况,但不要尝试每小时发送超过两三个。

    所以问题可能与您手机的特定条件有关:通知消息都正确地传送到了两部手机,但 iPhone 7 Plus 操作系统可能会限制或延迟接收 em>数据个。

    【讨论】:

    • 是的,但它不起作用。最近我们的数据消息通知停止在 iOS 设备上工作,但在模拟器上工作。
    【解决方案2】:

    如果您能找到有关 FCM 消息传递的一些信息,并且如果您能找出与 iPhone 7 plus 设备相关的任何问题,请查看此博客,您必须减少有效负载。 https://firebase.googleblog.com/2019/02/life-of-a-message.html

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2021-01-26
      相关资源
      最近更新 更多