Dostosowywanie wiadomości na różnych platformach

Firebase Admin SDK i FCM v1 HTTP API umożliwiają ustawienie w żądaniach wiadomości wszystkich pól dostępnych w obiekcie message. Obejmuje to:

  • wspólny zestaw pól, które mają być interpretowane przez wszystkie instancje aplikacji odbierające wiadomość.
  • zestawy pól specyficzne dla platformy, takie jak AndroidConfig i WebpushConfig, interpretowane tylko przez instancje aplikacji działające na określonej platformie.

Bloki dla konkretnych platform umożliwiają dostosowywanie wiadomości do różnych platform, aby zapewnić ich prawidłową obsługę po odebraniu. Backend FCM uwzględni wszystkie określone parametry i dostosuje wiadomość do każdej platformy.

Kiedy używać wspólnych pól

Używaj wspólnych pól, gdy:

  • Wysyłanie pól na dowolną platformę
  • Wysyłanie wiadomości do tematów

Wszystkie instancje aplikacji, niezależnie od platformy, mogą interpretować te wspólne pola:

Kiedy używać pól związanych z platformą

Używaj pól związanych z platformą, gdy chcesz:

  • Wysyłanie pól tylko do określonych platform
  • wysyłać pola specyficzne dla platformy oprócz pól wspólnych,

Jeśli chcesz wysyłać wartości tylko do określonych platform, użyj pól związanych z platformą. Jeśli na przykład chcesz wysłać powiadomienie tylko na platformy Apple i Web, ale nie na Androida, musisz użyć 2 osobnych zestawów pól – jednego dla Apple i jednego dla Web.

Jeśli wysyłasz wiadomości z określonymi opcjami dostawy, użyj pól właściwych dla danej platformy, aby je ustawić. Jeśli chcesz, możesz określić różne wartości dla poszczególnych platform. Jednak nawet jeśli chcesz ustawić zasadniczo tę samą wartość na różnych platformach, musisz użyć pól właściwych dla danej platformy. Dzieje się tak, ponieważ każda platforma może interpretować tę wartość nieco inaczej – na przykład na Androidzie czas życia jest ustawiany jako czas ważności w sekundach, a na urządzeniach Apple jako data ważności.

Wiadomość z powiadomieniem z opcjami dostawy na konkretną platformę

Poniższe żądanie wysłania interfejsu HTTP v1 API wysyła wspólny tytuł i treść powiadomienia na wszystkie platformy, ale wysyła też pewne zastąpienia dotyczące konkretnych platform. W szczególności żądanie:

  • ustawia długi czas życia dla platform Android i sieciowych, a jednocześnie ustawia niski priorytet wiadomości APNs (platformy Apple).
  • ustawia odpowiednie klucze, aby określić wynik kliknięcia powiadomienia przez użytkownika na urządzeniach z Androidem i Apple – odpowiednio click_action i 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"
       }
     }
   }
 }

Więcej informacji o kluczach dostępnych w blokach dotyczących konkretnych platform w treści wiadomości znajdziesz na stronie z dokumentacją HTTP v1. Więcej informacji o tworzeniu żądań wysyłania zawierających treść wiadomości znajdziesz w artykule Wysyłanie wiadomości za pomocą interfejsu FCM HTTP v1 API.

Powiadomienie z opcjami koloru i ikony

W poniższym przykładzie żądanie wysłania wysyła wspólny tytuł i treść powiadomienia na wszystkie platformy, ale wysyła też pewne zastąpienia dotyczące konkretnych platform na urządzenia z Androidem.

W przypadku Androida żądanie ustawia specjalną ikonę i kolor do wyświetlania na urządzeniach z Androidem. Jak wspomniano w dokumentacji AndroidNotification, kolor jest określany w formacie #rrggbb, a obraz musi być zasobem ikony rysowalnej lokalnym dla aplikacji na Androida.

Oto przykład efektu wizualnego na urządzeniu użytkownika:

Prosty rysunek przedstawiający 2 urządzenia, z których jedno wyświetla ikonę niestandardową i kolor

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")
            .setTitle("$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',
)

Go

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",
};

REST

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

Więcej informacji o kluczach dostępnych w blokach dotyczących konkretnych platform w treści wiadomości znajdziesz na stronie z dokumentacją HTTP v1.

Powiadomienie z niestandardowym obrazem

Keep in mind:

  • Rozmiar obrazów w powiadomieniach jest ograniczony do 1 MB, a poza tym obowiązują ograniczenia wynikające z wbudowanej w Androida obsługi obrazów.
  • Aby móc odbierać i obsługiwać obrazy powiadomień w aplikacji Apple, musisz dodać rozszerzenie usługi powiadomień. Rozszerzenie usługi powiadomień umożliwia aplikacji obsługę obrazu dostarczonego w ładunku FCM przed wyświetleniem powiadomienia użytkownikowi. Przykładowy kod znajdziesz w sekcji Konfigurowanie rozszerzenia usługi powiadomień.
  • Obrazy przesyłane za pomocą kreatora powiadomień mogą mieć maksymalnie 300 KB.
  • Obrazy przechowywane lub udostępniane z Cloud Storage podlegają standardowym limitom.

W żądaniu wysłania powiadomienia ustaw te opcje, aby umożliwić klientowi odbierającemu obsługę obrazu dostarczonego w ładunku:

  • W przypadku Androida ustaw tę opcję AndroidConfig:
    • notification.image zawierający adres URL obrazu
  • W przypadku iOS ustaw te opcje ApnsConfig:
    • fcm_options.image zawierający adres URL obrazu. Apple wymaga, aby adres URL obrazu zawierał prawidłowe rozszerzenie pliku, co pozwoli prawidłowo zidentyfikować typ zasobu.
    • headers({ "mutable-content": 1})

Poniższe żądanie wysyła wspólny tytuł powiadomienia na wszystkie platformy, ale wysyła też obraz. Oto przykład efektu wizualnego na urządzeniu użytkownika:

Prosty rysunek obrazu w powiadomieniu na wyświetlaczu

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

REST

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

Więcej informacji o kluczach dostępnych w blokach dotyczących konkretnych platform w treści wiadomości znajdziesz na stronie z dokumentacją HTTP v1.

Powiadomienie z powiązanym działaniem po kliknięciu

Poniższe żądanie wysyła wspólny tytuł powiadomienia na wszystkie platformy, ale wysyła też działanie, które aplikacja ma wykonać w odpowiedzi na interakcję użytkownika z powiadomieniem. Oto przykład efektu wizualnego na urządzeniu użytkownika:

Prosty rysunek przedstawiający użytkownika, który klika, aby otworzyć stronę internetową

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

REST

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