Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

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

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

SDK 설정

이 섹션에서는 앱에 대해 다른 Firebase 기능을 이미 활성화한 경우 완료할 수 있는 작업을 다룹니다. 아직 Android 프로젝트에 Firebase를 추가하지 않았다면 추가하세요.

앱 매니페스트 수정

앱의 매니페스트에 다음을 추가합니다.

  • FirebaseMessagingService 를 확장하는 서비스입니다. 백그라운드에서 앱에 대한 알림을 수신하는 것 이상의 메시지 처리를 수행하려는 경우에 필요합니다. 포그라운드 앱에서 알림을 수신하고, 데이터 페이로드를 수신하고, 업스트림 메시지를 보내는 등의 작업을 수행하려면 이 서비스를 확장해야 합니다.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (선택 사항) 응용 프로그램 구성 요소 내에서 기본 알림 아이콘 및 색상을 설정하는 메타데이터 요소입니다. Android는 수신 메시지가 아이콘이나 색상을 명시적으로 설정하지 않을 때마다 이 값을 사용합니다.
  • <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
         See README(https://goo.gl/l4GJaQ) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_ic_notification" />
    <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
         notification message. See README(https://goo.gl/6BKBk7) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />
  • (선택사항) Android 8.0(API 레벨 26) 이상부터 알림 채널 이 지원 및 권장됩니다. FCM은 기본 설정이 포함된 기본 알림 채널을 제공합니다. 고유한 기본 채널을 만들고 사용하려면 default_notification_channel_id 를 표시된 대로 알림 채널 개체의 ID로 설정합니다. FCM은 들어오는 메시지가 알림 채널을 명시적으로 설정하지 않을 때마다 이 값을 사용합니다. 자세한 내용은 알림 채널 관리 를 참조하십시오.
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Android 13 이상에서 런타임 알림 권한 요청

Android 13에는 알림 표시를 위한 새로운 런타임 권한이 도입되었습니다. 이는 FCM 알림을 사용하는 Android 13 이상에서 실행되는 모든 앱에 영향을 미칩니다.

기본적으로 FCM SDK(버전 23.0.6 이상)에는 매니페스트에 정의된 POST_NOTIFICATIONS 권한이 포함되어 있습니다. 그러나 앱은 상수 android.permission.POST_NOTIFICATIONS 를 통해 이 권한의 런타임 버전도 요청해야 합니다. 사용자가 이 권한을 부여할 때까지 앱에서 알림을 표시할 수 없습니다.

새 런타임 권한을 요청하려면:

Java

// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                // FCM SDK (and your app) can post notifications.
            } else {
                // TODO: Inform user that that your app will not show notifications.
            }
        });

private void askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
                PackageManager.PERMISSION_GRANTED) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
        }
    }
}

Kotlin+KTX

// Declare the launcher at the top of your Activity/Fragment:
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
    if (isGranted) {
        // FCM SDK (and your app) can post notifications.
    } else {
        // TODO: Inform user that that your app will not show notifications.
    }
}

private fun askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
        }
    }
}

일반적으로 앱에 알림을 게시할 수 있는 권한을 부여하면 활성화될 기능을 사용자에게 설명하는 UI를 표시해야 합니다. 이 UI는 사용자에게 확인아니요 버튼과 같은 동의 또는 거부 옵션을 제공해야 합니다. 사용자가 확인 을 선택하면 권한을 직접 요청합니다. 사용자가 아니요 를 선택하면 사용자가 알림 없이 계속할 수 있습니다.

앱이 사용자에게 POST_NOTIFICATIONS 권한을 요청해야 하는 시기에 대한 자세한 모범 사례는 알림 런타임 권한 을 참조하세요.

Android 12L(API 레벨 32) 이하를 대상으로 하는 앱에 대한 알림 권한

Android는 앱이 포그라운드에 있는 한 앱이 처음 알림 채널을 생성할 때 자동으로 사용자에게 권한을 요청합니다. 그러나 채널 생성 및 권한 요청 시기에 관한 중요한 주의 사항이 있습니다.

  • 앱이 백그라운드에서 실행 중일 때 첫 번째 알림 채널을 생성하는 경우(FCM SDK는 FCM 알림을 수신할 때 수행) 앱이 열리는 시간. 즉 , 앱이 열리고 사용자가 권한을 수락하기 전에 수신된 모든 알림이 손실됩니다 .
  • 플랫폼의 API를 활용하여 권한을 요청하려면 Android 13 이상을 대상으로 앱을 업데이트하는 것이 좋습니다. 이것이 가능하지 않은 경우 알림 권한 대화 상자를 트리거하고 알림이 손실되지 않도록 하기 위해 앱에 알림을 보내기 전에 알림 채널을 만들어야 합니다 . 자세한 내용은 알림 권한 모범 사례 를 참조하세요.

선택 사항: POST_NOTIFICATIONS 권한 제거

기본적으로 FCM SDK에는 POST_NOTIFICATIONS 권한이 포함되어 있습니다. 앱에서 알림 메시지를 사용하지 않고(FCM 알림을 통해, 다른 SDK를 통해 또는 앱에서 직접 게시) 앱에 권한을 포함하지 않으려면 매니페스트 병합기의 remove 마커를 사용하여 제거할 수 있습니다. 이 권한을 제거하면 FCM 알림뿐만 아니라 모든 알림이 표시되지 않습니다. 앱의 매니페스트 파일에 다음을 추가합니다.

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

장치 등록 토큰에 액세스

앱을 처음 시작할 때 FCM SDK는 클라이언트 앱 인스턴스에 대한 등록 토큰을 생성합니다. 단일 기기를 대상으로 하거나 기기 그룹을 생성하려면 FirebaseMessagingService 를 확장하고 onNewToken 을 재정의하여 이 토큰에 액세스해야 합니다.

이 섹션에서는 토큰을 검색하는 방법과 토큰에 대한 변경 사항을 모니터링하는 방법에 대해 설명합니다. 토큰은 초기 시작 후 교체될 수 있으므로 최신 업데이트된 등록 토큰을 검색하는 것이 좋습니다.

다음과 같은 경우 등록 토큰이 변경될 수 있습니다.

  • 앱이 새 기기에서 복원됩니다.
  • 사용자가 앱을 제거/재설치합니다.
  • 사용자가 앱 데이터를 지웁니다.

현재 등록 토큰 검색

현재 토큰을 검색해야 하는 경우 FirebaseMessaging.getInstance().getToken() 을 호출합니다.

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Kotlin+KTX

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

토큰 생성 모니터링

onNewToken 콜백은 새 토큰이 생성될 때마다 실행됩니다.

Java

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@Override
public void onNewToken(@NonNull String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token);
}

Kotlin+KTX

/**
 * Called if the FCM registration token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the
 * FCM registration token is initially generated so this is where you would retrieve the token.
 */
override fun onNewToken(token: String) {
    Log.d(TAG, "Refreshed token: $token")

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token)
}

토큰을 얻은 후에는 앱 서버로 보내고 원하는 방법을 사용하여 저장할 수 있습니다.

Google Play 서비스 확인

Play 서비스 SDK를 사용하는 앱은 Google Play 서비스 기능에 액세스하기 전에 항상 기기에서 호환되는 Google Play 서비스 APK를 확인해야 합니다. 주 활동의 onCreate() 메서드와 onResume() 메서드의 두 곳에서 이 작업을 수행하는 것이 좋습니다. onCreate() 에서 확인하면 성공적인 확인 없이 앱을 사용할 수 없습니다. onResume() 에서 확인하면 사용자가 뒤로 버튼과 같은 다른 수단을 통해 실행 중인 앱으로 돌아가더라도 확인이 계속 수행됩니다.

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

자동 초기화 방지

FCM 등록 토큰이 생성되면 라이브러리가 식별자와 구성 데이터를 Firebase에 업로드합니다. 토큰 자동 생성을 방지하려면 다음 메타데이터 값을 AndroidManifest.xml 에 추가하여 Analytics 수집 및 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 자동 초기화를 다시 활성화하려면 런타임 호출을 수행합니다.

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Analytics 수집을 다시 활성화하려면 FirebaseAnalytics 클래스의 setAnalyticsCollectionEnabled() 메서드를 호출합니다. 예를 들어:

setAnalyticsCollectionEnabled(true);

이러한 값은 일단 설정되면 앱을 다시 시작해도 유지됩니다.

다음 단계

클라이언트 앱이 설정되면 알림 작성기 를 사용하여 다운스트림 메시지를 보낼 준비가 된 것입니다. 이 기능은 다운로드, 실행 및 검토할 수 있는 빠른 시작 샘플 에 나와 있습니다.

앱에 다른 고급 동작을 추가하려면 인텐트 필터를 선언하고 수신 메시지에 응답하는 활동을 구현하면 됩니다. 자세한 내용은 앱 서버에서 메시지 보내기 가이드를 참조하세요.

이러한 기능을 활용하려면 서버 구현 및 서버 프로토콜(HTTP 또는 XMPP) 또는 Admin SDK 구현이 필요합니다.