Flutter에서 Firebase 클라우드 메시징 클라이언트 앱 설정

다음 단계를 수행하여 Flutter에서 FCM 클라이언트를 설정합니다.

플랫폼별 설정 및 요구사항

필요한 단계는 타겟팅하는 플랫폼에 따라 다릅니다.

iOS+

Xcode에서 앱 기능 사용 설정

애플리케이션이 메시지를 수신하려면 먼저 Xcode 프로젝트에서 푸시 알림과 백그라운드 모드를 사용 설정해야 합니다.

  1. Xcode 프로젝트 작업공간(ios/Runner.xcworkspace)을 엽니다.
  2. 푸시 알림을 사용 설정합니다.
  3. 백그라운드 가져오기원격 알림 백그라운드 실행 모드를 사용 설정합니다.

APN 인증 키 업로드

FCM을 사용하기 전에 Firebase에 APN 인증서를 업로드합니다. 아직 APN 인증서가 없으면 Apple Developer Member Center에서 만듭니다.

  1. Firebase Console 프로젝트 내에서 톱니바퀴 아이콘을 선택하고 프로젝트 설정을 선택한 다음 클라우드 메시징 탭을 선택합니다.
  2. 개발 인증서, 프로덕션 인증서 또는 둘 다에 인증서 업로드 버튼을 선택합니다. 최소 하나 이상이 필요합니다.
  3. 각 인증서에 대해 .p12 파일을 선택하고 필요하다면 비밀번호를 입력합니다. 이 인증서의 번들 ID가 앱의 번들 ID와 일치해야 합니다. 저장을 선택합니다.

메서드 재구성

Apple 기기에서 FCM Flutter 플러그인을 사용하려면 메서드 재구성을 사용 중지하면 안 됩니다. 재구성이 필요하며 재구성이 없으면 FCM 토큰 처리와 같은 주요 Firebase 기능이 제대로 작동하지 않습니다.

Android

Google Play 서비스

FCM 클라이언트에 Android 4.4 이상을 실행하며 Google Play 서비스도 설치되어 있는 기기 또는 Google API로 Android 4.4를 실행하는 에뮬레이터가 필요합니다. Google Play 스토어를 통해서만 Android 앱을 배포하도록 제한되지는 않습니다.

Play 서비스 SDK를 사용하는 앱은 Google Play 서비스 기능에 액세스하기 전에 항상 기기에 호환되는 Google Play 서비스 APK가 있는지 확인해야 합니다. 기본 활동의 onCreate() 메서드 및 onResume() 메서드 등 두 위치에서 확인 작업을 하는 것이 좋습니다. onCreate()로 확인하면 확인에 성공하지 못한 앱을 사용할 수 없게 됩니다. onResume()으로 확인하면 사용자가 '뒤로' 버튼과 같은 다른 수단을 통해 실행 중인 앱으로 돌아오는 경우에 확인 작업이 계속 수행될 수 있습니다.

기기에 호환되는 Google Play 서비스 버전이 없으면 앱에서 GoogleApiAvailability.makeGooglePlayServicesAvailable()을 호출하여 사용자가 Play 스토어에서 Google Play 서비스를 다운로드하도록 허용할 수 있습니다.

FCM에서 웹 사용자 인증 정보 구성

FCM 웹 인터페이스는 '자발적 애플리케이션 서버 ID' 또는 'VAPID' 키라고 하는 웹 사용자 인증 정보를 사용하여 지원되는 웹 푸시 서비스에 대한 보내기 요청을 승인합니다. 앱에서 푸시 알림을 구독하려면 키 쌍을 Firebase 프로젝트에 연결해야 합니다. Firebase Console을 통해 새 키 쌍을 생성하거나 기존 키 쌍을 가져올 수 있습니다.

새 키 쌍 생성
  1. Firebase Console 설정 창의 클라우드 메시징 탭을 열고 웹 구성 섹션으로 스크롤합니다.

  2. 웹 푸시 인증서 탭에서 키 쌍 생성을 클릭합니다. Console에 키 쌍이 생성되었다는 알림이 표시되고 공개 키 문자열과 추가된 날짜가 표시됩니다.

기존 키 쌍 가져오기

이미 웹 앱에서 사용 중인 기존 키 쌍이 있으면 FCM으로 이 키 쌍을 가져와서 FCM API를 통해 기존 웹 앱 인스턴스에 연결할 수 있습니다. 키를 가져오려면 Firebase 프로젝트에 액세스할 수 있는 소유자 수준의 권한이 있어야 합니다. 기존 공개 및 비공개 키를 base64 URL 보안 인코딩 양식으로 가져옵니다.

  1. Firebase Console 설정 창의 클라우드 메시징 탭을 열고 웹 구성 섹션으로 스크롤합니다.

  2. 웹 푸시 인증서 탭에서 링크 텍스트인 '기존 키 쌍 가져오기'를 찾아서 선택합니다.

  3. 키 쌍 가져오기 대화상자에서 해당 필드에 공개 및 비공개 키를 입력하고 가져오기를 클릭합니다. 콘솔에 공개 키 문자열과 추가된 날짜가 표시됩니다.

키 형식과 키 생성 방법에 대한 자세한 내용은 애플리케이션 서버 키를 참조하세요.

FCM 플러그인 설치

  1. 아직 수행하지 않았으면 Flutter의 Firebase 플러그인을 설치하고 초기화합니다.

  2. Flutter 프로젝트의 루트에서 다음 명령어를 실행하여 플러그인을 설치합니다.

    flutter pub add firebase_messaging
    
  3. 완료되면 Flutter 애플리케이션을 다시 빌드합니다.

    flutter run
    

등록 토큰 액세스

특정 기기로 메시지를 보내려면 기기의 등록 토큰을 알아야 합니다. 알림 콘솔의 필드에 토큰을 입력해야 이 튜토리얼을 마칠 수 있으므로 토큰을 검색한 후 복사하거나 안전하게 저장해야 합니다.

앱 인스턴스의 현재 등록 토큰을 가져오려면 getToken()을 호출합니다. 알림 권한이 부여되지 않은 경우 이 메서드는 사용자에게 알림 권한을 요청합니다. 그렇지 않은 경우 토큰을 반환하거나 오류가 있으면 예정을 거부합니다.

final fcmToken = await FirebaseMessaging.instance.getToken();

웹 플랫폼에서 VAPID 공개 키를 getToken()에 전달합니다.

final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

토큰이 업데이트될 때마다 알림을 받으려면 onTokenRefresh 스트림을 구독합니다.

FirebaseMessaging.instance.onTokenRefresh
    .listen((fcmToken) {
      // TODO: If necessary send token to application server.

      // Note: This callback is fired at each app startup and whenever a new
      // token is generated.
    })
    .onError((err) {
      // Error getting token.
    });

자동 초기화 방지

FCM 등록 토큰이 생성되면 라이브러리는 식별자와 구성 데이터를 Firebase에 업로드합니다. 토큰 자동 생성을 방지하려면 빌드 시간에 자동 초기화를 중지합니다.

iOS

다음과 같이 iOS에서 메타데이터 값을 Info.plist에 추가합니다.

FirebaseMessagingAutoInitEnabled = NO

Android

Android에서는 다음 메타데이터 값을 AndroidManifest.xml에 추가하여 애널리틱스 수집과 FCM 자동 초기화를 중지합니다(둘 다 중지해야 함).

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

런타임 시 FCM 자동 초기화 다시 사용 설정

특정 앱 인스턴스에 auto-init를 사용 설정하려면 setAutoInitEnabled()를 호출합니다.

await FirebaseMessaging.instance.setAutoInitEnabled(true);

이 값을 설정하고 나면 앱을 다시 시작해도 유지됩니다.

다음 단계

클라이언트 앱이 설정되었으면 알림 작성기를 사용하여 다운스트림 메시지를 보낼 수 있습니다. 백그라운드 앱에 테스트 메시지 보내기를 참조하세요.

앱에 다른 고급 동작을 추가하려면 서버 구현이 필요합니다.

그런 다음 앱 클라이언트에서 다음을 수행합니다.