[Android] FCM Push 정리

moKo·2022년 11월 23일
1

Android

목록 보기
13/13
post-thumbnail

공식문서

메시지 유형

  1. 알림 메시지, 때로는 “표시 메시지”로 간주. FCM SDK에서 자동으로 처리
  2. 클라이언트 앱에서 처리하는 데이터 메시지

전송 방법

  1. 알림 메시지 : Cloud Funtion이나 앱 서버와 같은 신뢰할 수 있는 환경에서 Admin SDK, FCM 서버 프로토콜 사용 /

    notification키 설정 / Firebase Messaging 사용

  2. 데이터 메시지 : 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에서 가져올 수 있다.

선택적 데이터 페이로드가 있는 알림 메시지

맞춤 키-값 쌍의 선택적 페이로드가 포함된 알림 메시지를 보낼 수 있다.
알림과 데이터 페이로드가 모두 포함된 메시지를 수신할 때 앱 동작은 앱이 백그라운드에 있는지 포그라운드에 있는지, 기본적으로 수신 시점에 활성 상태인지 여부에 따라 다르다.

  • 백그라운드에 있을 때 : 앱은 notification tray에서 notification payload를 수신하고, 사용자가 notification을 탭할 때만 data payload를 처리한다.
  • 포그라운드에 있을 때 : 앱은 두 페이로드를 모두 사용할 수 있는 번들을 받는다.
{
  "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 매개변수를 무시한다.

💡 어플리케이션에서 Non-Collapsible Message를 사용할 필요가 없는 경우 Collapsible 메시지는 성능 측면에서 더 나은 선택이다. 만약 사용하는 경우 주어진 시간에 등록 토큰 당 최대 4개의 다른 Collapse key만 FCM에서 허용한다.

메시지 우선 순위 설정

다운 스트림 메시지에 배달 우선 순위를 할당하는 두 가지 옵션이 있다. NormalHigh Priority

  • High Priority : FCM은 장치가 잠자기 모드에 있더라도, 우선 순위가 높은 메시지를 즉시 전달하려고 시도한다. 시간에 민감한 사용자가 볼 수 있는 콘텐츠를 위한 것이다.
  • Normal : 앱이 포그라운드에 있을 때 즉시 전달된다. 백그라운드 앱의 경우 전송이 지연될 수 있다. 새 이메일 알림, UI 동기화 유지 또는 백그라운드에서 앱 데이터 동기화와 같이 시간에 덜 민감한 메시지의 경우 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 오류가 발생한다.

조절 및 크기 조정

  • Collapsible한 메시지 조절 개발자가 앱에 동일한 메시지를 너무 자주 반복하는 경우 사용자의 배터리에 미치는 영향을 줄이기 위해 메시지를 지연/조절한다. Collapse한 메시지는 기기당 앱당 20개의 메시지 버스트로 제한되며, 3분마다 1개의 메시지가 다시 채워진다.
  • XMPP 서버 조절 FCM XMPP 서버에 연결할 수 있는 속도는 프로젝트당 분당 400개로 제한된다. 이것은 메시지 전달에는 문제가 되지 않지만 시스템의 안정성을 보장하는데 중요하다. 각 프로젝트에 대해 FCM은 2500개의 병렬 연결을 허용한다.
  • 단일 장치에 대한 최대 메시지 속도 Android의 경우 단일 장치에 최대 240개의 메시지/분 및 5000개의 메시지를 보낼 수 있다. 이 높은 임계값은 사용자가 채팅을 통해 빠르게 상호 작용하는 경우와 같이 단기적인 트래픽 버스트를 허용하기 위한 것이다. 이 제한은 논리를 보낼 때 오류가 장치의 배터리를 실수로 소모하는 것을 방지합니다. 💡 최대 속도 근처에서 정기적으로 메시지를 보내면 사용자의 리소스를 낭비하기 되며 앱이 악의적인 것으로 표시될 수 있다.

업스트림 메시지 제한

업스트림 대상 서버의 과부하를 방지하기 위해 프로젝트당 업스트림 메시지를 분당 1,500,000개로 제한한다.

잘못된 앱 동작으로 인한 배터리 소모를 방지하기 위해 기기당 업스트림 메시지를 분당 1,000개로 제한한다.

Topic Message(주제 메시지) 제한

주제 구독 추가/제거 비율은 프로젝트당 3,000QPS로 제한된다.

팬아웃 조절

메시지 팬아웃은 주제 및 그룹을 대상으로 할 때, 청중 또는 사용자 세그먼트를 대상으로 할 때와 같이 여러 장치에 메시지를 보내는 프로세스이다.

메시지 팬아웃은 즉각적이지 않으므로 때때로 여러 팬아웃이 동시에 진행된다. 프로젝트당 동시 팬아웃 수를 1000개로 제한한다. 그 후 추가 팬아웃 요청을 거부하거나 이미 진행 중인 팬아웃 중 일부가 완료될 때까지 요청 팬아웃을 연기한다.

실제 달성가능한 팬아웃 비율은 동시에 팬아웃을 요청하는 프로젝트 수의 양향을 받는다. 개발 프로젝트에 대한 10,000QPS의 팬아웃 비율은 드문일이 아니지만 그 숫자는 보장되지 않으며 시스템 총 부하의 결과이다. 사용가능한 팬아웃 용량은 팬아웃 요청이 아닌 프로젝트 간에 나눠진다. 따라서 프로젝트에 두 개의 팬아웃이 진행중인 경우 각 팬아웃에는 사용 가능한 팬아웃 비율의 절반만 표시된다. 팬아웃 속도를 최대화하는 권장 방법은 하나의 활성 팬아웃만 진행하는 것이다.

Credentials

구현하는 FCM 기능에 따라 Firebase 프로젝트에서 다음 자격 증명이 필요할 수 있다.

profile
🔥 Feelings fade, results remain

0개의 댓글