Настройте сообщение для разных платформ

Firebase Admin SDK и HTTP API FCM v1 позволяют вашим запросам к сообщениям устанавливать все поля, доступные в объекте message . Это включает в себя:

  • общий набор полей, которые должны быть интерпретированы всеми экземплярами приложения, получающими сообщение.
  • Наборы полей, специфичные для конкретной платформы, такие как AndroidConfig и WebpushConfig , интерпретируются только экземплярами приложений, работающими на указанной платформе.

Блоки, специфичные для каждой платформы, позволяют гибко настраивать сообщения для разных платформ, обеспечивая их корректную обработку при получении. Бэкенд FCM учтет все указанные параметры и адаптирует сообщение для каждой платформы.

Когда использовать общие поля

Используйте общие поля, когда:

  • Отправляйте поля на любую платформу
  • Отправляйте сообщения по темам

Все экземпляры приложений, независимо от платформы, могут интерпретировать следующие общие поля:

Когда использовать поля, специфичные для конкретной платформы?

Используйте поля, специфичные для платформы, если вам это необходимо:

  • Отправляйте поля только на определенные платформы.
  • В дополнение к общим полям, отправляйте поля, специфичные для конкретной платформы.

Если вы хотите отправлять значения только на определенные платформы, используйте поля, специфичные для каждой платформы. Например, чтобы отправить уведомление только на платформы Apple и Web, но не на Android, необходимо использовать два отдельных набора полей: один для Apple и один для Web.

При отправке сообщений с определенными параметрами доставки используйте поля, специфичные для каждой платформы. При желании вы можете указать разные значения для каждой платформы. Однако даже если вы хотите установить практически одинаковое значение на всех платформах, необходимо использовать поля, специфичные для каждой платформы. Это связано с тем, что каждая платформа может интерпретировать значение немного по-разному — например, время жизни на Android устанавливается как время истечения срока действия в секундах, а на Apple — как дата истечения срока действия.

Уведомление с вариантами доставки, специфичными для каждой платформы.

Следующий HTTP-запрос API версии 1 отправляет общий заголовок и содержимое уведомления на все платформы, а также некоторые специфичные для каждой платформы параметры. В частности, запрос выглядит следующим образом:

  • Устанавливает длительное время жизни сообщений для платформ Android и Web, при этом устанавливая низкий приоритет сообщений APNs (для платформ Apple).
  • Устанавливает соответствующие ключи для определения результата нажатия пользователем на уведомление на Android и Apple — click_action и category соответственно.
{
  "message":{
     "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
     "notification":{
       "title":"Match update",
       "body":"Arsenal goal in added time, score is now 3-0"
     },
     "android":{
       "ttl":"86400s",
       "notification"{
         "click_action":"OPEN_ACTIVITY_1"
       }
     },
     "apns": {
       "headers": {
         "apns-priority": "5",
       },
       "payload": {
         "aps": {
           "category": "NEW_MESSAGE_CATEGORY"
         }
       }
     },
     "webpush":{
       "headers":{
         "TTL":"86400"
       }
     }
   }
 }

Для получения более подробной информации см. справочную страницу HTTP v1, где описаны ключи, доступные в блоках, специфичных для платформы, в теле сообщения. Дополнительную информацию о создании запросов на отправку, содержащих тело сообщения, см. в разделе «Отправка сообщения с использованием API FCM HTTP v1» .

Уведомление с возможностью выбора цвета и значка.

В следующем примере запрос на отправку отправляет общий заголовок и содержимое уведомления на все платформы, но также отправляет некоторые специфические для платформы параметры на устройства Android.

Для Android запрос задает специальную иконку и цвет для отображения на устройствах Android. Как указано в справочнике по AndroidNotification , цвет указывается в формате #rrggbb, а изображение должно быть ресурсом иконки, доступным извне, локальным для приложения Android.

Вот пример визуального эффекта на устройстве пользователя:

Простой рисунок двух устройств, на одном из которых отображается пользовательская иконка и цвет.

Node.js

const topicName = 'industry-tech';

const message = {
  notification: {
    title: '`$FooCorp` up 1.43% on the day',
    body: 'FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  android: {
    notification: {
      icon: 'stock_ticker_update',
      color: '#7e55c3'
    }
  },
  topic: topicName,
};

getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

Java

Message message = Message.builder()
    .setNotification(Notification.builder()
        .setTitle("$GOOG up 1.43% on the day")
        .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
        .build())
    .setAndroidConfig(AndroidConfig.builder()
        .setTtl(3600 * 1000)
        .setNotification(AndroidNotification.builder()
            .setIcon("stock_ticker_update")
            .setColor("#f45342")
            .build())
        .build())
    .setApnsConfig(ApnsConfig.builder()
        .setAps(Aps.builder()
            .setBadge(42)
            .build())
        .build())
    .setTopic("industry-tech")
    .build();

Python

message = messaging.Message(
    notification=messaging.Notification(
        title='$GOOG up 1.43% on the day',
        body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
    ),
    android=messaging.AndroidConfig(
        ttl=datetime.timedelta(seconds=3600),
        priority='normal',
        notification=messaging.AndroidNotification(
            icon='stock_ticker_update',
            color='#f45342'
        ),
    ),
    apns=messaging.APNSConfig(
        payload=messaging.APNSPayload(
            aps=messaging.Aps(badge=42),
        ),
    ),
    topic='industry-tech',
)

Идти

oneHour := time.Duration(1) * time.Hour
badge := 42
message := &messaging.Message{
	Notification: &messaging.Notification{
		Title: "$GOOG up 1.43% on the day",
		Body:  "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
	},
	Android: &messaging.AndroidConfig{
		TTL: &oneHour,
		Notification: &messaging.AndroidNotification{
			Icon:  "stock_ticker_update",
			Color: "#f45342",
		},
	},
	APNS: &messaging.APNSConfig{
		Payload: &messaging.APNSPayload{
			Aps: &messaging.Aps{
				Badge: &badge,
			},
		},
	},
	Topic: "industry-tech",
}

C#

var message = new Message
{
    Notification = new Notification()
    {
        Title = "$GOOG up 1.43% on the day",
        Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
    },
    Android = new AndroidConfig()
    {
        TimeToLive = TimeSpan.FromHours(1),
        Notification = new AndroidNotification()
        {
            Icon = "stock_ticker_update",
            Color = "#f45342",
        },
    },
    Apns = new ApnsConfig()
    {
        Aps = new Aps()
        {
            Badge = 42,
        },
    },
    Topic = "industry-tech",
};

ОТДЫХ

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
     "topic":"industry-tech",
     "notification":{
       "title": "`$FooCorp` up 1.43% on the day",
       "body": "FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day."
     },
     "android":{
       "notification":{
         "icon":"stock_ticker_update",
         "color":"#7e55c3"
       }
     }
   }
 }

Для получения более подробной информации см. справочную страницу HTTP v1, где описаны ключи, доступные в блоках, специфичных для платформы, в теле сообщения.

Уведомление с пользовательским изображением

Иметь в виду:

  • Размер изображений для уведомлений ограничен 1 МБ, а в остальных случаях используются встроенные функции Android для отображения изображений .
  • Для получения и обработки изображений уведомлений в приложении Apple необходимо добавить расширение службы уведомлений . Расширение службы уведомлений позволяет вашему приложению обрабатывать изображение, передаваемое в полезной нагрузке FCM, перед отображением уведомления конечному пользователю (см. пример кода в разделе «Настройка расширения службы уведомлений »).
  • Размер изображений, загружаемых с помощью редактора уведомлений, ограничен 300 КБ.
  • На изображения, хранящиеся или предоставляемые из Cloud Storage распространяются стандартные квоты .

В запросе на отправку уведомления установите следующие параметры, чтобы принимающий клиент мог обработать изображение, доставленное в полезной нагрузке:

  • Для Android установите следующий параметр AndroidConfig :
    • notification.image содержит URL-адрес изображения.
  • Для iOS установите следующие параметры ApnsConfig :
    • fcm_options.image содержит URL-адрес изображения. Apple требует, чтобы URL-адрес изображения содержал допустимое расширение файла для корректной идентификации типа ресурса.
    • headers({ "mutable-content": 1})

Следующий запрос на отправку отправляет общий заголовок уведомления на все платформы, а также изображение. Вот пример визуального эффекта на устройстве пользователя:

Простая отрисовка изображения в уведомлении на экране.

Node.js

const topicName = 'industry-tech';

const message = {
  notification: {
    title: 'Sparky says hello!'
  },
  android: {
    notification: {
      imageUrl: 'https://foo.bar.pizza-monster.png'
    }
  },
  apns: {
    payload: {
      aps: {
        'mutable-content': 1
      }
    },
    fcm_options: {
      image: 'https://foo.bar.pizza-monster.png'
    }
  },
  webpush: {
    headers: {
      image: 'https://foo.bar.pizza-monster.png'
    }
  },
  topic: topicName,
};

getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

ОТДЫХ

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
     "topic":"industry-tech",
     "notification":{
       "title":"Sparky says hello!",
     },
     "android":{
       "notification":{
         "image":"https://foo.bar/pizza-monster.png"
       }
     },
     "apns":{
       "payload":{
         "aps":{
           "mutable-content":1
         }
       },
       "fcm_options": {
           "image":"https://foo.bar/pizza-monster.png"
       }
     },
     "webpush":{
       "headers":{
         "image":"https://foo.bar/pizza-monster.png"
       }
     }
   }
 }

Для получения более подробной информации см. справочную страницу HTTP v1, где описаны ключи, доступные в блоках, специфичных для платформы, в теле сообщения.

Уведомление с соответствующим действием по клику.

Следующий запрос на отправку отправляет общий заголовок уведомления на все платформы, а также отправляет действие, которое приложение должно выполнить в ответ на взаимодействие пользователя с уведомлением. Вот пример визуального эффекта на устройстве пользователя:

Простая схема нажатия пользователем кнопки для открытия веб-страницы.

Node.js

const topicName = 'industry-tech';

const message = {
  notification: {
    title: 'Breaking News....'
  },
  android: {
    notification: {
      clickAction: 'news_intent'
    }
  },
  apns: {
    payload: {
      aps: {
        'category': 'INVITE_CATEGORY'
      }
    }
  },
  webpush: {
    fcmOptions: {
      link: 'breakingnews.html'
    }
  },
  topic: topicName,
};

getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

ОТДЫХ

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1