본문 바로가기

개발 코딩 정보 공유/안드로이드 자바 코틀린

안드로이드 FCM 푸시서버 구현

 

 

 

내가 뭐 어쨌다고...

 

 

 

 

 

지난 푸시 앱설정 포스트에 이어서 안드로이드 푸시 서버구현에 대해 알아봅시다.

FCM 푸시 서버 구현의 경우 몇가지 방법으로 나눠지는데요. 

admin sdk를 사용하여 보내는 방법과 원시프로토콜을 사용하여 보내는 방법 입니다.

그중에 원시프로토콜을 사용하여 푸시를 날려봅시다. 그 안에서도 이렇게 또 나눠집니다. (에고 복잡해)

 

 

 

1. FCM HTTP v1 API (신버전) 

https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko#send_messages_to_specific_devices

 

2. 기존 HTTP 프로토콜 

https://firebase.google.com/docs/cloud-messaging/http-server-ref?hl=ko

https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko#send_messages_using_the_legacy_app_server_protocols

 

 

 

*** 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있습니다.

 

 

 

3. 기존 XMPP 프로토콜

구글은 이 세가지를 혼합하여 사용할 수 있다고 하는데요. 이중에서 우리는 가장 단순한 2. 기존http 방식으로 해보겠습니다.

 

 

" 가능하면 여러 플랫폼에 메시지를 보낼 수 있는 유연한 최신 프로토콜인 FCM HTTP v1 API를 사용하는 것이 좋습니다. 기기에서 서버로 업스트림 메시지를 보낼 필요가 있는 경우에는 XMPP 프로토콜을 구현해야 합니다. "

 

*** HTTP 서버 프로토콜 구현

메시지를 보내려면 앱 서버에서 JSON 키-값 쌍으로 구성된 HTTP 헤더와 HTTP 본문을 포함하는 POST 요청을 만듭니다. 헤더 및 본문의 옵션에 관한 자세한 내용은 앱 서버 보내기 요청 작성을 참조하세요.

 

*** 기존 앱 서버 프로토콜을 사용하여 메시지 보내기

기존 프로토콜을 사용하려는 경우 이 섹션의 안내에 따라 메시지 요청을 작성하세요. HTTP를 통해 여러 플랫폼으로 전송하는 경우 v1 프로토콜을 사용하면 메시지 요청이 단순해질 수 있다는 점을 참고하시기 바랍니다.

 

*** 특정 기기에 메시지 전송

특정 기기로 메시지를 보내려면 to 키를 특정 앱 인스턴스의 등록 토큰으로 설정합니다. 등록 토큰에 대한 자세한 내용은 플랫폼별 클라이언트 설정 정보를 참조하세요.

 

 

푸시의 경우 단일기기로 보낼지 주제/구독 을 통해서 그룹화 시킬지 결정합니다.

단일기기의 경우 아래와 같이 간단하게 구현이 가능합니다.

데이터 방식은 json 입니다.

 

 

<<단일기기 전송 기준>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<HTTP POST 요청>
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
 
{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
 
 
 
<HTTP 응답>
{ "multicast_id": 108,
  "success": 1,
  "failure": 0,
  "results": [
    { "message_id": "1:08" }
  ]
}
cs

 

 

<<주제로 메시지 전송>>

 

주제로 보내는 경우 다소 생소할수 있습니다.

개념은 특정 주제에 대해 구독을 하면 그 주제를 구독한 모두는 알림을 받게 됩니다.

단일기기와 거의 비슷합니다. 데이터의 to 키를 /topics/yourTopic 등의 값으로 설정합니다

("/topics/[a-zA-Z0-9-_.~%]+")

 

여러 주제를 조합하여 보내려면 to 키 대신 condition 키를 사용합니다.

예를 들어 TopicA와 함께 TopicB 또는 TopicC를 구독한 기기로 메시지를 보내는 방법은 다음과 같습니다.

 

'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)

 

최대 5개의 주제를 포함할 수 있으며 괄호가 지원됩니다

 

 

주제 HTTP POST 요청

주제 1개로 보내는 방법은 다음과 같습니다.

 

1
2
3
4
5
6
7
8
9
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}
cs

 

 

'dogs' 또는 'cats' 주제를 구독한 기기로 보내는 방법은 다음과 같습니다.

 

 

1
2
3
4
5
6
7
8
9
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{
  "condition": "'dogs' in topics || 'cats' in topics",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
주제 HTTP 응답
//Success example:
{
  "message_id": "1023456"
}
 
//failure example:
{
  "error": "TopicsMessageRateExceeded"
}
 
cs

 

 

앱단에서 주제를 구독하려면 클라이언트 앱에서 FCM 주제 이름과 함께 Firebase 클라우드 메시징 subscribeToTopic()을 호출합니다.

 

1
FirebaseMessaging.getInstance().subscribeToTopic("news");
cs
 

단일기기 푸시 전송, 주제별 구독을 통한 푸시 전송에 대해 알아보았습니다.

각각의 장단점이 있으니 참고하시어 구현하시면 되겠습니다.

 

*** 주제별 전송의 경우 앱에서 해당 내용을 설정해야합니다.

어떤 주제로 구독할지를 결정해야겠지요.

 
 
 
참고 : 
 

https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko#send_messages_using_the_legacy_app_server_protocols

 

https://firebase.google.com/docs/cloud-messaging/android/topic-messaging?hl=ko