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 15492
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13974
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16508
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23283
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18934
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39269
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174736
1063 모바일 앱 실행 시 (비정상종료)검은화면이 표시되는 경우 조치방법 험프리 2015.07.03 4434
1062 모바일 첫걸음: 델파이 iOS 개발 - 3. 웹브라우저 작성 손보라 2013.09.17 4396
1061 델파이 iOS 개발 따라잡기: 4. iOS앱으로 바코드 캡쳐하기 관리자 2013.08.27 4391
1060 사물인터넷(IoT)과 RAD Studio - 다양한 디바이스 연동 Humphery 2014.03.22 4376
1059 데이터스냅(DataSnap) - 이미지 송수신 예제 [1] file Humphery 2014.05.19 4365
1058 [소식] Nokia X에서 델파이로 만든 앱도 등록가능합니다. [1] file Humphery 2014.03.11 4343
1057 [기술백서] 모바일로 가면서 개발자가 하게 되는 실수 TOP5 (한글) 관리자 2013.07.06 4318
1056 [10.4 시드니 신기능] Sarina Dupont이 정리한 주요 신기능 모아 보기 험프리 2020.05.28 4304
1055 [델파이 웹개발] 델파이로 풀스택 웹 개발하기 - uniGUI 활용 (Full Stack Web Development with uniGUI for Delphi) file 관리자 2021.02.01 4300
1054 RAD Studio IDE 상에서 Github 소스코드 이용하기 [1] file Humphery 2014.07.31 4298
1053 OutputDebugString 함수로 디버그로그를 출력할 수 있습니다. file 험프리 2016.02.16 4290
1052 공학용 계산기앱 안드로이드 마켓 등록 완료. [2] file c2design 2014.04.03 4243
1051 RAD Studio 최신 데모 소스코드 다운로드 Humphery 2014.09.04 4222
1050 델파이 물리엔진 Box2d 소개. FMX, VCL 용(오픈소스) [1] Humphery 2014.04.22 4181
1049 안드로이드 SDK 수동 설치 방법 file 김원경 2020.07.15 4170
1048 9월 6일 RAD Studio XE5 세미나 발표자료입니다. file 관리자 2013.09.09 4169
1047 David I의 31일 동영상(한글자막) - InterBase Express로 나만의 SQL DB를 활용한 파이어몽키 앱 만들기 관리자 2013.03.26 4167
1046 델파이로 만든 공학용계산기 앱 Android/iOS 동시 런칭. [4] file c2design 2014.04.11 4160
1045 [따라하기] reFind 도구를 이용해 BDE 프로젝트를 FireDAC으로 마이그레이션 따라하기 [9] Humphery 2015.04.14 4148
1044 에러 "InterBase is not licensed"가 Interbase ToGo 사용시 발생하는 경우 관리자 2013.04.04 4140