FCM을 시작하기 위해 앱이 백그라운드 상태일 때 알림 작성기에서 개발 기기로 테스트 알림 메시지를 전송하는 가장 단순한 사용 사례부터 살펴보겠습니다. 이 페이지에서는 설정에서 검증까지 이 작업을 수행하는 모든 단계를 설명하며 FCM용 Fultter 앱을 설정했으면 일부 단계가 이미 완료된 상태일 수 있습니다.
FCM 플러그인 설치
아직 설치하지 않았으면 Flutter에 Firebase SDK를 설치하고 초기화합니다.
Flutter 프로젝트의 루트에서 다음 명령어를 실행하여 플러그인을 설치합니다.
flutter pub add firebase_messaging
완료되면 Flutter 애플리케이션을 다시 빌드합니다.
flutter run
등록 토큰 액세스
특정 기기로 메시지를 보내려면 기기의 등록 토큰을 알아야 합니다. 알림 콘솔의 필드에 토큰을 입력해야 이 튜토리얼을 마칠 수 있으므로 토큰을 검색한 후 복사하거나 안전하게 저장해야 합니다.
앱 인스턴스의 현재 등록 토큰을 가져오려면 getToken()
을 호출합니다. 알림 권한이 부여되지 않은 경우 이 메서드는 사용자에게 알림 권한을 요청합니다. 그렇지 않은 경우 토큰을 반환하거나 오류가 있으면 예정을 거부합니다.
final fcmToken = await FirebaseMessaging.instance.getToken();
테스트 알림 메시지 전송
대상 기기에 앱을 설치하고 실행합니다. Apple 기기에서는 원격 알림을 수신할 수 있는 권한 요청을 수락해야 합니다.
앱을 기기에서 백그라운드 상태로 만듭니다.
Firebase Console에서 메시지 페이지를 엽니다.
첫 번째 메시지인 경우 첫 번째 캠페인 만들기를 선택합니다.
- Firebase 알림 메시지를 선택하고 만들기를 선택합니다.
그렇지 않으면 캠페인 탭에서 새 캠페인을 선택한 후 알림을 선택합니다.
메시지 본문을 입력합니다. 다른 모든 필드는 선택사항입니다.
오른쪽 창에서 테스트 메시지 전송을 선택합니다.
FCM 등록 토큰 추가 필드에 이 가이드의 앞선 섹션에서 가져온 등록 토큰을 입력합니다.
테스트를 선택합니다.
테스트를 선택하면 타겟팅된 클라이언트 기기(앱은 백그라운드 상태임)에서 알림을 수신해야 합니다.
앱으로 전송된 메시지의 통계를 파악하려면 Apple 및 Android 기기에서 열린 전송 메시지 수와 Android 앱의 '노출수'(사용자에게 표시된 알림) 데이터가 기록된 FCM 보고 대시보드를 확인합니다.
상호작용 처리
사용자가 알림을 탭하면 Android 및 iOS의 기본 동작은 애플리케이션을 여는 것입니다. 애플리케이션이 종료된 상태라면 시작되고, 백그라운드에 있다면 포그라운드로 전환됩니다.
알림의 콘텐츠에 따라 애플리케이션이 열릴 때 사용자의 상호작용을 처리하려고 할 수 있습니다. 예를 들어 새 채팅 메시지가 알림을 통해 전송되고 사용자가 이를 선택하면 애플리케이션이 열릴 때 특정 대화를 열려고 할 수 있습니다.
firebase-messaging
패키지는 이 상호작용을 처리하는 두 가지 방법을 제공합니다.
getInitialMessage()
: 애플리케이션이 종료된 상태에서 열리면 이 메서드는RemoteMessage
가 포함된Future
를 반환합니다. 소비되면RemoteMessage
가 삭제됩니다.onMessageOpenedApp
: 애플리케이션이 백그라운드 상태에서 열릴 때RemoteMessage
를 게시하는Stream
입니다.
사용자에게 원활한 환경을 보장하려면 두 시나리오를 모두 처리해야 합니다. 아래 코드 예시는 이를 처리하는 방법을 개략적으로 설명합니다.
class Application extends StatefulWidget {
@override
State<StatefulWidget> createState() => _Application();
}
class _Application extends State<Application> {
// In this example, suppose that all messages contain a data field with the key 'type'.
Future<void> setupInteractedMessage() async {
// Get any messages which caused the application to open from
// a terminated state.
RemoteMessage? initialMessage =
await FirebaseMessaging.instance.getInitialMessage();
// If the message also contains a data property with a "type" of "chat",
// navigate to a chat screen
if (initialMessage != null) {
_handleMessage(initialMessage);
}
// Also handle any interaction when the app is in the background via a
// Stream listener
FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
}
void _handleMessage(RemoteMessage message) {
if (message.data['type'] == 'chat') {
Navigator.pushNamed(context, '/chat',
arguments: ChatArguments(message),
);
}
}
@override
void initState() {
super.initState();
// Run code required to handle interacted messages in an async function
// as initState() must not be async
setupInteractedMessage();
}
@override
Widget build(BuildContext context) {
return Text("...");
}
}
상호작용을 처리하는 방법은 애플리케이션 설정에 따라 다릅니다. 위의 예시는 StatefulWidget
을 사용하는 기본 예시를 보여줍니다.
다음 단계
포그라운드 앱에 메시지 전송
백그라운드 앱에 알림 메시지를 보내는 데 성공했으면 Flutter 앱에서 메시지 수신을 참조하여 포그라운드 앱에 전송하는 방법을 알아보세요.
알림 메시지 이외의 고급 기능
앱에 다른 고급 동작을 추가하려면 서버 구현이 필요합니다.
그런 다음 앱 클라이언트에서 다음을 수행합니다.