Некоторые типы сообщений с данными FCM не доставляются на устройство iOS. - PullRequest
1 голос
/ 02 августа 2020

У меня есть среда Cloud Functions , которая отправляет данные и уведомления.

В настоящий момент я тестирую сообщения FCM на iPhone SE (2016) и iPhone 7 Plus - и поведение двух устройств очень несовместимо, и я хотел бы знать, почему.

  • 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 (Я удалил ключевые значения instruction, picture и address из полезных данных - и тогда это сработало).

Есть идеи, в чем проблема?

Редактировать: Нет никаких проблем с моими Android устройствами.

Ответы [ 2 ]

1 голос
/ 11 августа 2020

Firebase Cloud Messaging использует службу уведомлений Apple Pu sh (APN) для отправки сообщений (размером до 4 КБ) в приложение iOS. В iOS, уведомлениях и данных сообщения обрабатываются по-разному, в частности:

  • Уведомление : FCM автоматически отображает сообщение на устройства конечного пользователя от имени клиентского приложения. В этом случае в приложении не создается обратный вызов, пока пользователь не коснется уведомления, открывающего приложение (в этом случае userNotificationCenter (_: didReceive: withCompletionHandler:) запускается обратный вызов)
  • Сообщение данных : сообщения данных преобразуются уровнем FCM в так называемые фоновые уведомления ("content-available": true). Фоновое уведомление - это удаленное уведомление, которое не отображает предупреждение, не воспроизводит звук или не обозначает значок вашего приложения. В этом случае клиентское приложение отвечает за обработку сообщений с данными. Этот вид уведомлений предназначен для того, чтобы ваше приложение разбудилось в фоновом режиме, давая ему время для начала загрузки с вашего сервера и обновления его содержимого. Когда отправляется уведомление « данные » (« фон »), в момент уведомления запускается приложение обратного вызова (_: didReceiveRemoteNotification: fetchCompletionHandler:) поступает, и автоматически не срабатывает ни звук, ни сигнал. Однако примите во внимание это важное примечание из документации Apple:

Система считает фоновые уведомления низким приоритетом: вы можете использовать их для обновления sh содержимого вашего приложения, но система не гарантирует их доставку. Кроме того, система может ограничивать доставку фоновых уведомлений, если общее количество становится чрезмерным. Количество фоновых уведомлений, разрешенных системой, зависит от текущих условий, но не пытайтесь отправлять более двух или трех в час.

Таким образом, проблема может быть связана с конкретными условиями вашего телефоны: уведомления сообщения правильно доставляются на оба телефона, но, возможно, ОС iPhone 7 Plus ограничивает или задерживает прием данных .

0 голосов
/ 06 августа 2020

Посетите этот блог, если вы можете найти некоторую информацию об обмене сообщениями FCM, и если вы можете выяснить, какая проблема связана с устройством iPhone 7 plus, на котором вам пришлось уменьшить полезную нагрузку. https://firebase.googleblog.com/2019/02/life-of-a-message.html

...