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 24798
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 23094
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 25101
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 30988
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 32012
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 27412
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 48464
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 185420
1063 [개발팁 시리즈] 델파이/C++빌더 VCL 애플리케이션을 개발한다면? 꼭 확인하세요! 관리자 2019.11.20 534
1062 주요 OS 시장 점유율 - 윈도우와 안드로이드! file 관리자 2019.11.19 674
1061 윈도우 버전 점유율 변화: 2009년부터 2019년 현재까지! file 관리자 2019.11.18 453
1060 [델파이 샘플 코드] 안드로이드, iOS, OSX, 윈도우, 리눅스, HTML5 관리자 2019.11.13 726
» FCM 전송 구헌혀기 - 앱 서버 프로토콜 사용 메시지 전송 험프리 2019.11.08 1218
1058 [고객사례-게임, 델파이] Rise of Legions 관리자 2019.11.08 863
1057 [데모 영상] 델파이 프로젝트에 구글 시트 연동하기 (엔터프라이즈 커넥터 활용) 관리자 2019.11.08 644
1056 델파이 코드 컨버전 빠르게 완료하기 관리자 2019.11.06 689
1055 엔터프라이즈 커넥터 무료 제공 (업데이트 서브스크립션 계약중인 고객 대상) 관리자 2019.10.31 509
1054 InterBase ToGo 모바일용 라이선스 배포하기 file 데브기어 2019.10.30 563
1053 DLL 폼에서 VCL 폼 스타일 적용하기 file 김원경 2019.10.28 6047
1052 [고객 사례- 의료, 델파이] 의료용 소프트웨어(폐활량&심전도 체크) - Advanced Spirometer and ECG 관리자 2019.10.25 706
1051 [고객사례-소셜네트워크, 델파이] KisKis 관리자 2019.10.25 1190
1050 이 달의 기술자료 - 2019년 11월 file 험프리 2019.10.25 432
1049 IBM 왓슨과 인공지능(AI) 활용하기 - 델파이/C++빌더 관리자 2019.10.25 780
1048 [발표자료] 20191017 실전 사례로 살펴보는 소프트웨어 현대화 전략 file 관리자 2019.10.23 469
1047 윈도우 10 지원과 좋은 UX 구현을 위해 기억해야 할 점 관리자 2019.10.22 714
1046 [개발사례-유통분야] 20년된 프로그램을 현대식 마이크로서비스 아키텍처로 전환 관리자 2019.10.22 1177
1045 [개발팁] TBooleanHelper.ToString 그리고 TUseBoolStrs 관리자 2019.10.21 349
1044 RAD스튜디오의 iOS 13 및 안드로이드 64-bit 대응 관리자 2019.10.21 597