알림 메시지 : Cloud Funtion이나 앱 서버와 같은 신뢰할 수 있는 환경에서 Admin SDK, FCM 서버 프로토콜 사용 /
notification키 설정 / Firebase Messaging 사용
데이터 메시지 : Cloud Function이나 앱 서버와 같은 신뢰할 수 있는 환경에서 Admin SDK, FCM 서버 프로토콜 사용 /
data키만 설정
알림 메시지를 보내려면 사용자에게 표시되는 부분에 대해 미리 정의된 필수 키-값 옵션 집합으로 notification 키를 설정해야한다. FCM이 클라이언트 앱을 대신해 최종 사용자 기기에 자동으로 메시지 표시.
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
}
}
알림 메시지는 앱이 백그라운드에 있을 때 알림 트레이로 전달되고, 포그라운드에 있는 경우 메시지는 콜백 함수로 처리된다.
활성 상태에 android 앱은 data bundle에 notification 키로 onMessageReceived()로 전달된다.
사용할 수 있는 사전 정의된 키의 전체 목록
사용자 지정 키-값 쌍으로 적절한 키를 설정하여 클라이언트 앱에 데이터 페이로드를 보냄. 정보는 공통 data키로 캡슐화되고 클라이언트 앱은 내용을 해석해야 한다. 클라이언트 앱이 데이터 메시지 처리를 담당.
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
Android에서 클라이언트 앱은 onMessageReceived()에서 data message를 수신하고 key/value 쌍을 처리할 수 있다. Data Payload는 Activity를 시작하는데 사용된 Intent에서 가져올 수 있다.
맞춤 키-값 쌍의 선택적 페이로드가 포함된 알림 메시지를 보낼 수 있다.
알림과 데이터 페이로드가 모두 포함된 메시지를 수신할 때 앱 동작은 앱이 백그라운드에 있는지 포그라운드에 있는지, 기본적으로 수신 시점에 활성 상태인지 여부에 따라 다르다.
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
},
"data" : {
"Nick" : "Mario",
"Room" : "PortugalVSDenmark"
}
}
}
안드 / ios 둘 중 한 곳에만 보내야 하는 경우. 보내야 할 플랫폼에 우선순위를 설정하고 보내지 않을 곳에 긴 수명을 설정
{
"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"
}
}
}
}
가장 일반적으로 사용되는 옵션 중 하나인 Collapsible Messaging(축소 가능한 메시지), Using Multiple Senders, 메시지 우선 순위 설정 및 메시지 수명 등에 대한 설명
Non-collapsible messages (축소할 수 없는 메시지)
각 개별 메시지가 장치에 배달됨을 의미한다. 모바일 애플리케이션에서 데이터를 가져오기 위해 서버에 연결하는 ping과 달리 유용한 컨텐츠를 전달한다. Message는 항상 collapsible한 Notification Message를 제외하고 기본적으로 Non-collapsible이다. 일반적 사용 사례로는 채팅 또는 중요한 메시지 이다.
축소되지 않고 저장할 수 있는 메시지수는 100개로 제한된다. 한도에 도달 시 저장된 모든 메시지가 삭제된다. 디바이스가 다시 온라인 상태가 되면 한도에 도달했음을 알리는 메시지가 수신된다. 일반적으로 앱 서버에 전체 동기화를 요청하여 상황을 적절하게 처리할 수 있다.
Collapsible messages (축소 가능한 메시지)
아직 장치에 전달되지 않은 경우 동일한 Collapse 키가 포함된 새로운 메시지로 대체 될 수 있는 메시지이다.
Android에서 Collapsible하게 메시지를 사용하려면 메시지 페이로드에 collapse_key
매개변수를 사용해야 한다. FCM 서버는 각각 다른 collapse key를 사용하여 장치당 4개의 서로 다른 Collapsible messages를 동시에 저장할 수 있다. 이 수를 초과하면 4개만 유지하며 어떤 키가 유지되는지는 보장하지 않는다.
페이로드가 없는 Topic message는 기본적으로 Collapsible하며, 알림 메시지는 항상 collapsible하면서 collapse_key
매개변수를 무시한다.
다운 스트림 메시지에 배달 우선 순위를 할당하는 두 가지 옵션이 있다. Normal
과 High Priority
Normal
을 사용한다.{
"message":{
"topic":"subscriber-updates",
"notification":{
"body" : "This week's edition is now available.",
"title" : "NewsMagazine.com",
},
"data" : {
"volume" : "3.21.15",
"contents" : "http://www.news-magazine.com/world-week/21659772"
},
"android":{
**"priority":"normal" // or high**
},
"apns":{
"headers":{
"apns-priority":"5"
}
},
"webpush": {
"headers": {
"Urgency": "high"
}
}
}
}
FCM은 일반적으로 메시지를 보낸 즉시 메시지를 전달한다. 하지만, 이것은 항상 가능한 것은 아니다. 예를 들어 안드로이드에서 기기를 끄거나 오프라인으로 설정하거나 사용할 수 없는 상태이다. FCM은 앱이 과도한 리소스를 소비하거나 배터리 수명에 부정적 영향을 미치지 않도록 의도적으로 메시지를 지연시킬 수 있다.
이 경우 FCM은 메시지를 저장한 뒤, 가능한 빨리 전달한다. 대부분의 경우 문제가 없지만 늦은 메시지가 전달되지 않는 일부 앱이 있다. 예를 들어 메시지가 수신 전화나 영상 채팅 알림인 경우 통화가 종료되기 전까지 짧은 시간 동안만 의미가 있다. 또는 메시지가 이벤트 초대인 경우 이벤트가 종료된 후 수신된 메시지는 쓸모가 없다.
안드로이드 및 웹/자바스크립트에서 메시지의 최대 수명을 지정할 수 있다. 값은 0~2,419,200초(28일) 사이의 기간이어야 하며 FCM이 메시지를 저장하고 전달을 시도하는 최대 기간에 해당한다. 이 필드가 포함되지 않으면 기본값으로 최대 4주가 설정된다.
또 다른 이점은 TTL값이 0초인 메시지를 제한하지 않는다. 즉, FCM은 지금이 아니면 절대 안되는 메시지에 대해 최선의 노력을 보장한다. time_to_live
값이 0 이면 즉시 전달할 수 없는 메시지가 삭제된다. 그러나 이런 메시지는 저장되지 않으므로 알림 메시지를 보내기 위한 최상의 대기 시간을 제공한다.
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
},
"apns":{
"headers":{
"apns-expiration":"1604750400"
}
},
"android":{
**"ttl":"4500s"**
},
"webpush":{
"headers":{
**"TTL":"4500"**
}
}
}
}
앱 서버가 FCM에 메시지를 게시하고 메시지 ID를 다시 수신한다고 해서 메시지가 이미 기기에 전달되었다는 의미는 아니다. 전달을 수락했다는 의미이다. 이후 어떻게 되는지는 여러 요인에 따라 달라진다.
최상의 시나리오는 장치가 FCM에 연결되어 있고 화면이 켜져있고 조절 제한이 없으면 메시지가 즉시 전달된다.
장치가 연결되어 있지만 잠자기 상태인 경우 장치가 잠자기 상태에서 해제될 때까지 낮은 우선 순위 메시지를 저장한다. 그리고 그게 바로 collapse_key
플래그가 역할을 하는 곳이다. 동일한 collapse key가 저장되어 있고 전달을 기다리는 메시지가 이미 있는 경우 이전 메시지가 삭제되고 새 메시지가 그 자리를 차지한다. 그러나 collapse key가 설정되지 않은 경우 새 메시지와 이전 메시지가 모두 나중에 배달되도록 저장된다.
장치가 FCM에 연결되어 있지 않으면 연결이 설정될 때까지 메시지가 저장된다. 연결이 설정되면 보류중인 모든 메시지를 장치로 전달한다. 기기가 다시 연결되지 않으면 메시지가 결국 시간 초과되고 FCM 저장소에서 삭제된다.
장치에 보낸 마지막 데이터 메시지로부터 4주 이내에 장치가 연결되면 클라이언트는 onDeletedMessages()
콜백을 수신한다.
마지막으로 FCM이 장치에 메시지를 전달하려고 시도하고 앱이 제거되면 FCM은 해당 메시지를 즉시 삭제하고 등록 토큰을 무효화 한다. 이후에 해당 장치로 메시지를 보내려고 하면 NotRegistered
오류가 발생한다.
업스트림 대상 서버의 과부하를 방지하기 위해 프로젝트당 업스트림 메시지를 분당 1,500,000개로 제한한다.
잘못된 앱 동작으로 인한 배터리 소모를 방지하기 위해 기기당 업스트림 메시지를 분당 1,000개로 제한한다.
주제 구독 추가/제거 비율은 프로젝트당 3,000QPS로 제한된다.
메시지 팬아웃은 주제 및 그룹을 대상으로 할 때, 청중 또는 사용자 세그먼트를 대상으로 할 때와 같이 여러 장치에 메시지를 보내는 프로세스이다.
메시지 팬아웃은 즉각적이지 않으므로 때때로 여러 팬아웃이 동시에 진행된다. 프로젝트당 동시 팬아웃 수를 1000개로 제한한다. 그 후 추가 팬아웃 요청을 거부하거나 이미 진행 중인 팬아웃 중 일부가 완료될 때까지 요청 팬아웃을 연기한다.
실제 달성가능한 팬아웃 비율은 동시에 팬아웃을 요청하는 프로젝트 수의 양향을 받는다. 개발 프로젝트에 대한 10,000QPS의 팬아웃 비율은 드문일이 아니지만 그 숫자는 보장되지 않으며 시스템 총 부하의 결과이다. 사용가능한 팬아웃 용량은 팬아웃 요청이 아닌 프로젝트 간에 나눠진다. 따라서 프로젝트에 두 개의 팬아웃이 진행중인 경우 각 팬아웃에는 사용 가능한 팬아웃 비율의 절반만 표시된다. 팬아웃 속도를 최대화하는 권장 방법은 하나의 활성 팬아웃만 진행하는 것이다.
구현하는 FCM 기능에 따라 Firebase 프로젝트에서 다음 자격 증명이 필요할 수 있다.