FCM 메시지 수신하는 방법은 다음 링크를 참고하세요.

 

이 글에서는 FCM 메시지를 전송하는 방법 설명과 푸시 서버 아키텍처를 제안합니다.

  • FCM 전송하기
  • 푸시 서버 아키텍처 제안

 

FCM 전송하기

FCM 전송은 v1 HTTP 프로토콜(Admin SDK 이용)과 기존 앱 서버 프로토콜 방식을 제공합니다.

 

이 글에서는 기존 앱 서버 프로토콜을 이용해 FCM 전송하도록 진행합니다.

 

 

FCM 전송 API

 

위 링크의 문서에는 다음과 같은 요청으로 FCM을 전송합니다.

 

주요 항목은 다음과 같습니다.

 URI

 https://fcm.googleapis.com/fcm/send

 HTTP Method

 POST

 Header

 Authorization: key={프로젝트 서버 키}

 Content-Type=application/json

 Body 

 전송 데이터 JSON 포맷(Firebase 문서)

 {

   "to": "{디바이스 Firebase 토큰}", 

   "priority": "high",

   "notification": {

     "title": "{알림센터 제목}", 

     "body": "{알림센터 내용}"

   }, 

   "data":{

     // 사용자 정의 데이터

   }

 }

 

프로젝트 서버 키는 구글 Firebase 콘솔 의 프로젝트 설정 > 클라우드 메시징 화면에서 확인할 수 있습니다.

 

 

디바이스 Firebase 토큰은 안드로이드 앱에서 푸시 서비스와 연결 후 취득한 값입니다.

 

FCM 전송 구현

 위 내용을 구현한 화면은 다음과 같습니다.

 

구현된 코드는 다음과 같습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure TForm1.Button1Click(Sender: TObject);
var
  JsonBody: TJSONObject;
begin
  RESTClient1.BaseURL := 'https://fcm.googleapis.com/fcm/send';
  RESTClient1.ContentType := 'application/json';
 
  RESTRequest1.Method := rmPOST;
 
  RESTRequest1.Params.AddItem('Authorization', 'key=' + edtServerKey.Text, pkHTTPHEADER, [poDoNotEncode]);
 
  RESTRequest1.ClearBody;
  JsonBody := GetFcmJsonData(edtToken.Text, edtTitle.Text, edtMessage.Text, edtData.Text);
  RESTRequest1.Body.Add(JsonBody);
  JsonBody.Free;
  RESTRequest1.Execute;
 
  Label1.Text := RESTResponse1.StatusCode.ToString + ' ' + RESTResponse1.StatusText;
  Memo1.Lines.Text := RESTResponse1.Content;
end;
 
function TForm1.GetFcmJsonData(AClientToken, ATitle, AMessage,
  AData: string): TJSONObject;
var
  Noti, Data: TJSONObject;
begin
  Result := TJsonObject.Create
    .AddPair('to', AClientToken)
    .AddPair('priority', 'high');
  Result.AddPair('notification',
    TJsonObject.Create
      .AddPair('title', ATitle)
      .AddPair('body', AMessage));
  Result.AddPair('data',
    TJSONObject.Create
      .AddPair('title', ATitle)
      .AddPair('body', AMessage)
      .AddPair('custompayload', AData));
end;

 

 

GetFcmJsonData 메소드에서 만드는 전송 데이터(JSON)의 "notification" 항목은 알림센터에 표시되는 내용입니다.

"data" 항목은 커스텀하게 구조 및 내용을 지정해 전달하면 그대로 전달됩니다. data의 title, body를 중복해 입력한 이유는 아래에서 다시 설명합니다.

 

위 구현은 윈도우 클라이언트로 진행했습니다. 하지만, 다른 플랫폼과 다른 프로젝트(RAD 서버, 데이터스냅 등)에서도 동일한 방식으로 구현가능합니다.

 

전송 결과

 

전송 시 위와 같이 전송 결과를 수신합니다.

 

현재는 전송대상을 특정 대상 하나로 지정했지만, 전송 데이터의 registration_idx  속성에 전송대상을 배열로 지정해 복수의 대상에게 전송할수도 있습니다. 자세한 전송 프로토콜은 아래 문서를 참고하시기 바랍니다.

 

FCM 클라이언트 수신

구현한 내용으로 FCM 전송 시 구글 FCM 서비스를 통해 기기로 메시지가 전달됩니다.

앱이 활성화 되어 있으면 OnReceiveNotification 이벤트를 통해 전달된 메시지를 수신할 수 있습니다.

앱이 활성화 되어 있지않다면, PushService.StartupNotifications 속성을 통해 메시지를 수신할 수 있습니다.

 

여기서 한가지 문제는 앞의 두가지 상태에서 수신된 데이터에 약간의 차이가 있다는 것입니다.
그 차이는 gcm.notification.title과 gcm.notification.body 정보의 유무입니다.

 앱이 활성화된 상태의 수신 데이터

 앱이 활성화되지 않은 상태의 수신 데이터

 

 

위의 수신데이터의 "title"과 "body"항목은 제가 전송시 일부로 추가한 내용입니다. 해당 항목이 없다면 비활성화 상태의 수신데이터에서는 제목과 내용은 알수 없을 것입니다.(사실 몰라도 될 수 있습니다.^^)

 

전송부에서 추가한 항목은 "title", "body", "custompayload"입니다. 전송 시 "data" 속성 하위에 추가한 정보들이 메시지에 함께 전달되는 것을 확인할 수 있습니다. 자식객체를 추가해 계층으로 데이터를 구성할 수도 있습니다.

 

이 매커니즘을 활용해 필요한 데이터 형식으로 메시지를 전송하도록 합니다.

 

 

FCM 전송 아키텍처 제안

앞에서 구현한 전송 프로그램은 디바이스 Firebase 토큰을 입력받아 진행합니다. 하지만 실제 서비스에서는 토큰을 수집하는 매커니즘이 필요합니다.

 

보통, 서버를 하나 두고 디바이스에서 취득한 토큰을 서버를 통해 저장 및 관리 후 저장된 토큰을 이용해 메시지를 전송해야 할 것입니다.

 

위 과정을 생각하다보니, 간단한 푸시 메시지 서버 제작도 가능할 것 같아 그려본 아키텍처를 소개합니다.

 

 

푸시 서버 아키텍처 구성

 

 

구성요소

  • 안드로이드 앱 : FMX 기반 앱, 푸시 서버에 따라 iOS, 윈도우 등 확장 가능
  • 관리자 앱 : 푸시 메시지를 전송하는 관리자용 앱
  • 서버 : 모노리틱 또는 마이크로 서비스 기반
    • Auth 서비스 : 인증 기능을 제공하는 서비스. 여기서는 인증 시 토큰을 받아 저장
    • Push 서비스 : 푸시 서비스 제공
  • DBMS
  • 구글 FCM 서비스

 

처리 흐름

  1. 앱에서 사용자 인증(또는 초기화) 시 Firebase 토큰을 전달
  2. 사용자 정보와 매핑되도록 토큰을 DB에 저장
  3. 관리자 앱에서 사용자 정보 조회
  4. 푸시 서비스에 푸시 요청. 대상으로 사용자 키값 지정
  5. 사용자 키값과 매핑되는 토큰으로 FCM 전송 요청
  6. 앱에서 푸시 수신
  7. 푸시 전송 결과 응답
  8. (옵션)전송 결과 저장

 

위 아키텍처는 RAD 서버를 이용해 마이크로 서비스 아키텍처로 구현하면 좋을 것 같습니다.

물론 데이터 스냅, WebBroker 등의 다른 백엔드 기술을 이용해도 구현가능합니다.

 

위 아키텍처는 확장가능합니다.

현재는 안드로이드 앱으로 한정지었지만, iOS 앱 또는 윈도우 앱으로 확장가능합니다.

현재는 푸시 서비스를 구글 FCM 서비스로 한정지었지만, 다른 푸시 서비스로 병렬로 운영할 수도 있습니다.

예를 들면, WNS(윈도우즈 푸시 알림 서비스)를 연동한다면 윈도우 앱을 대상으로도 푸시 메시지 전송이 가능할 것입니다.

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
654 XML MAPPER 업데이트 관리자 2020.10.21 274
653 [개발팁] 오래된 레거시 델파이, C++ 애플리케이션을 최신 스타일의 초고속 앱으로 마이그레이션하기 관리자 2020.10.15 333
652 [10.4 시드니][업데이트 1] 새로운 IDE 기능들 관리자 2020.10.08 329
651 [엠바카데로 UX SUMMIT] 눈여겨 봐야할 컨텐츠들! 관리자 2020.10.06 285
650 이 달의 기술자료 - 2020년 10월 file 험프리 2020.09.24 355
649 [발표자료] 델파이 개발자가 REST 서비스를 활용할 때 가장 많이 하는 질문 TOP 5 file 관리자 2020.09.18 1164
648 [10.4 시드니][업데이트 1] 새로운 TLightweightMREW 레코드 관리자 2020.09.10 403
647 [10.4 시드니][업데이트 1] What's NEW! 신기능 자세히 보기 [2] 관리자 2020.09.03 967
646 [REST API] REST 기반 파일 업로드와 다운로드 구현하기 험프리 2020.08.31 82860
645 [개발환경] 델파이, RAD스튜디오 에서 Git과 Github를 사용해야하는 이유와 꼭 필요한 만큼 사용법 관리자 2020.08.27 1253
644 이 달의 기술자료 - 2020년 09월 file 험프리 2020.08.27 258
643 델파이/C++빌더에 TTcpClient, TTcpServer, TUdpSocket 등록하기 [1] file 험프리 2020.08.26 613
642 [고객 사례- 델파이, 예술, 창작] 아트젠, 컴퓨터로 완성하는 미술 작품 관리자 2020.08.25 385
641 2020 년 8 월 GM 업데이트 관리자 2020.08.24 479
640 이 달의 기술자료 - 2020년 08월 험프리 2020.07.30 359
639 [10.4 시드니][패치] RAD스튜디오 10.4 '세 번째 패치(Patch 3)': VCL그리드, C++Win64 디버깅, C++ 안드로이드 예외처리 핸들링 및 리소스 등 관리자 2020.07.29 681
638 [생산성] RAD 스튜디오, 델파이, C++빌더 단축키 표 관리자 2020.07.28 406
637 [발표자료] VCL 애플리케이션 확장하기 with RAD 서버 관리자 2020.07.22 374
636 [발표자료] 20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio 관리자 2020.07.22 257
635 델파이 개발자 관점에서 본 C++ 빌더 file 김원경 2020.07.20 1156