본 글은 [Do it! 깡샘의 플러터&다트 프로그래밍] 의 내용을 발췌한 것입니다.
책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.
FCM이란?
FCMFirebase cloud message은 구글의 클라우드 메시지 서비스이며 서버에서 특정 상황이나 데이터가 발생할 때 등록된 앱에 메시지를 전달할 목적으로 사용합니다. 서버와 앱이 데이터를 주고받으려면 네트워크로 연결돼 있어야 하며 이를 위해 소켓socket 프로그램이 필요합니다. 그런데 앱에서 소켓 프로그램을 구현하면 백그라운드 제약 등의 문제가 발생할 수 있습니다.
그래서 대부분 앱은 서버에서 어떤 데이터를 전달받을 때 푸시 서비스push service를 이용합니다. FCM은 이 푸시 서비스를 지원하는 파이어베이스의 제품입니다. FCM은 서버의 데이터를 앱에 직접 전달하는 것이 아니라 FCM 서버에 전달하고 FCM 서버에서 앱에 데이터를 전달합니다. 서버의 데이터가 앱에 직접 전달되지는 않았지만 서버에서 데이터가 발생한 시점에 앱에 데이터를 전달할 수 있습니다.
플러터에서 FCM을 이용하려면 firebase_message 패키지를 등록해야 합니다.
dependencies:
firebase_messaging: ^11.4.2
토큰 획득
앱에서 FCM을 이용하면 FCM 서버에서 토큰을 발행합니다. 토큰은 서버에 저장해 두었다가 앱에 메시지를 보내야 할 때 메시지와 함께 FCM 서버에 전달합니다. 그러면 FCM 서버에서 토큰을 분석해 해당 사용자의 폰에 메시지를 전달하는 구조입니다.
FCM 서버에서 앱에 발행한 토큰은 다음 코드로 가져올 수 있습니다.
var token = await FirebaseMessaging.instance.getToken();
메시지 받기
FCM 서버에서 앱으로 전달하는 데이터를 받으려면 FirebaseMessaging.onMessage를 이용해야 합니다. onMessage는 Stream<RemoteMessage> 타입의 속성으로 FCM 서버에서 전달한 메시지를 Stream으로 방출합니다. 이때 앱에서는 RemoteMessage 타입의 메시지를 전달받습니다.
다음 코드처럼 작성하면 메시지가 전달될 때마다 listen에 등록한 함수를 반복해서 실행합니다.
FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
});
RemoteMessage로 전달되는 데이터는 서버에서 구성하기 나름인데 크게 notification 정보와 data 정보로 구분됩니다. notification 정보는 title값과 body값으로 구성하며 data 정보는 특별한 규칙 없이 서버에서 자유롭게 키-값 구조로 구성한 데이터입니다.
RemoteMessage 를 이용해 서버에서 전송한 데이터는 다음처럼 얻을 수 있습니다.
RemoteNotification? notification = message.notification;
Map<String, dynamic> data = message.data;
백그라운드에서 메시지 받기
앱이 포그라운드foregraund* 상황일 때 전달되는 메시지는 앞에서 알아본 것처럼 Firebase Messaging.onMessage로 받을 수 있습니다. 그런데 언제 FCM 메시지가 전달될지 모르며 메시지가 전달되는 순간 앱이 백그라운드background* 상황일 수 있습니다.
앱이 백그라운드 상황일 때 전달되는 메시지를 받으려면 FirebaseMessaging.onBackground Message()를 이용해 백그라운드에서 실행할 함수로 등록해야 합니다. 백그라운드 상황에서 전달되는 메시지도 RemoteMessage 타입입니다.
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
}
... (생략) ...
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.
'flutter' 카테고리의 다른 글
플러터, 상태관리 프레임워크(Bloc, Provider, GetX) 어떤 것을 이용할 것인가? (1) | 2023.03.23 |
---|---|
플러터 - image_picker (0) | 2023.03.13 |
플러터 - BasicMessageChannel (0) | 2023.03.13 |
플러터 - GetX로 상태 관리하기 (0) | 2023.03.13 |
플러터 - Bloc Cubit (0) | 2023.03.13 |