FCM 푸시 우선순위가 Android와 iOS에서 매핑되는 방식
푸시를 활용하는 기법 중에 우선순위가 낮은 푸시를 쓰는 방법이 있다.
- 우선순위가 높으면 화면 잠금 상태에서도 화면이 켜지며 바로 수신된다.
- 우선순위가 낮으면 사용자가 화면 잠금을 해제할 때 수신 처리된다.
푸시가 여러 개 쌓이면, 높은 우선순위로 즉시 수신된 메시지는 바로 확인하지 않을 경우 나중에 온 메시지에 밀려 보이지 않을 수 있다. 낮은 우선순위 푸시는 잠금을 해제할 때 비로소 수신 처리되므로, 이전에 보낸 푸시라도 방금 받은 것처럼 상단에 노출할 수 있다.
운영하던 모바일 게임은 푸시 플랫폼으로 Firebase Cloud Messaging(FCM)을 쓰고 있었고, 콘솔의 푸시 옵션에 “매우 낮음”부터 “매우 높음”까지 5단계 우선순위가 있었다. 이 값이 각 OS에서 실제로 어떻게 동작하는지 확인했다.
Android
섹션 제목: “Android”콘솔의 5단계 옵션이 FCM 파라미터를 그대로 감싼 것인지는 확인하지 못했다. FCM HTTP v1 API의 알림 표시 우선순위(notification_priority)는 PRIORITY_MIN부터 PRIORITY_MAX까지 5단계이고, Android 알림 가이드의 우선순위 단계에 대응한다.
- 알림 설정 가이드: https://material.io/design/platform-guidance/android-notifications.html#settings
- 알림 채널 중요도: https://developer.android.com/training/notify-user/channels?hl=ko#importance
iOS
섹션 제목: “iOS”FCM 문서는 iOS 메시지 우선순위를 5(보통)로 설정하라고 안내한다.
반면 Apple 개발자 문서에서 apns-priority 10은 즉시 전송, 5는 기기의 전원 상태를 고려해 전송하는 값이다. 백그라운드 업데이트만 담은 푸시(content-available)에는 5를 써야 한다.
FCM API 레퍼런스를 보면 두 문서가 어긋나는 이유가 나온다. FCM 문서가 말하는 5는 데이터 전용 메시지의 규칙이고, 알림 메시지는 따로 지정하지 않으면 10으로 나간다.
- HTTP v1 API:
apns-priority를 지정하지 않으면 백엔드가 기본값 10을 넣는다. 데이터 필드만 담아 iOS로 보내는 메시지에는 5만 허용된다. - 레거시 API·Admin SDK:
normal과high가 APNs 5와 10에 대응하고, 알림 메시지의 기본값은high, 데이터 메시지의 기본값은normal이다. - https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages
- https://firebase.google.com/docs/reference/admin/node/firebase-admin.messaging.messagingoptions
콘솔에서 보내는 푸시는 알림 메시지다. 그래서 iOS에서는 별도로 지정하지 않는 한 apns-priority 10으로 즉시 전송된다.
Android의 알림 표시 우선순위는 Android 7.1(API 25) 이하에서만 메시지 값으로 정해진다. Android 8.0(API 26) 이상에서는 메시지의 우선순위를 무시하고, 앱이 만든 알림 채널의 중요도를 따른다. 잠금 화면에서 화면을 켜고 바로 보여 줄지도 채널 중요도가 정한다.