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

C++로 Firebase 클라우드 메시징 클라이언트 앱 설정

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

C++로 플랫폼 간 Firebase 클라우드 메시징 클라이언트 앱을 작성하려면 Firebase 클라우드 메시징 API를 사용하세요. C++ SDK는 Android 및 Apple 플랫폼 모두에서 작동하며 각 플랫폼에 몇 가지 추가 설정이 필요합니다.

Firebase 및 FCM SDK 설정

기계적 인조 인간

  1. 아직 추가하지 않았다면 Firebase를 C++ 프로젝트에 추가합니다 .

    • 연결된 설정 지침에서 CMake를 사용하여 앱을 빌드하라는 권장 사항을 포함하여 Firebase C++ SDK를 사용하기 위한 기기 및 앱 요구 사항을 검토하세요.

    • 프로젝트 수준 build.gradle 파일에서 buildscriptallprojects 섹션 모두에 Google의 Maven 저장소를 포함해야 합니다.

  2. JNI 환경 및 활동:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
    을 전달하여 Firebase 앱 개체를 만듭니다.

  3. firebase::messaging::Listener 인터페이스를 구현하는 클래스를 정의합니다.

  4. 앱과 구성된 리스너를 전달하여 FCM을 초기화합니다.

    ::firebase::messaging::Initialize(app, listener);

  5. Google Play 서비스 SDK를 사용하는 앱은 기능에 액세스하기 전에 기기에서 호환되는 Google Play 서비스 APK를 확인해야 합니다. 자세한 내용 은 Google Play 서비스 APK 확인을 참조하세요.

iOS+

  1. 유효한 APN 인증서가 필요합니다. 아직 계정이 없다면 Apple Developer Member Center 에서 만드십시오.
  2. 아직 추가하지 않았다면 Firebase를 C++ 프로젝트에 추가합니다 . 그런 다음 FCM용 프로젝트를 설정하려면 다음을 수행합니다.
    1. 프로젝트의 Podfile에서 FCM 종속성을 추가합니다.
      pod 'FirebaseMessaging'
    2. Firebase C++ SDK 에서 firebase.frameworkfirebase_messaging.framework 프레임워크를 Xcode 프로젝트로 드래그합니다.
  3. 푸시 알림을 활성화하도록 Xcode 프로젝트를 구성합니다.

    1. 네비게이터 영역 에서 프로젝트를 선택합니다.
    2. Editor 영역 에서 프로젝트 대상을 선택합니다.
    3. 편집기 영역 에서 일반 탭을 선택합니다.

      1. Linked Frameworks and Libraries 까지 아래로 스크롤한 다음 + 버튼을 클릭하여 프레임워크를 추가합니다.
      2. 표시되는 창에서 UserNotifications.framework 로 스크롤하고 해당 항목을 클릭한 다음 추가 를 클릭합니다.

        이 프레임워크는 Xcode v8 이상에만 나타나며 이 라이브러리에 필요합니다.

    4. 편집기 영역 에서 기능 탭을 선택합니다.

      1. 푸시 알림켜기 로 전환합니다.
      2. 배경 모드 까지 아래로 스크롤한 다음 켜기 로 전환합니다.
      3. 백그라운드 모드 에서 원격 알림 을 선택합니다.
  4. Firebase 앱 객체 생성:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. firebase::messaging::Listener 인터페이스를 구현하는 클래스를 정의합니다.

  6. Firebase 클라우드 메시징을 초기화하고 앱과 구성된 리스너를 전달합니다.

    ::firebase::messaging::Initialize(app, listener);

장치 등록 토큰에 액세스

Firebase 클라우드 메시징 라이브러리를 초기화하면 클라이언트 앱 인스턴스에 대한 등록 토큰이 요청됩니다. 앱은 firebase::messaging::Listener 를 구현하는 클래스에 정의되어야 하는 OnTokenReceived 콜백과 함께 토큰을 수신합니다.

특정 장치를 대상으로 하려면 이 토큰에 대한 액세스 권한이 필요합니다.

Android에서 메시지 전달에 대한 참고 사항

앱이 전혀 실행되지 않고 사용자가 알림을 탭하면 메시지는 기본적으로 FCM의 내장 콜백을 통해 라우팅되지 않습니다. 이 경우 메시지 페이로드는 응용 프로그램을 시작하는 데 사용되는 Intent 를 통해 수신됩니다. FCM이 이러한 수신 메시지를 C++ 라이브러리 콜백으로 전달하도록 하려면 활동의 onNewIntent 메서드를 재정의하고 IntentMessageForwardingService 에 전달해야 합니다.

import com.google.firebase.messaging.MessageForwardingService;

class MyActivity extends Activity {
  private static final String TAG = "MyActvity";

  @Override
  protected void onNewIntent(Intent intent) {
    Log.d(TAG, "A message was sent to this app while it was in the background.");
    Intent message = new Intent(this, MessageForwardingService.class);
    message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
    message.putExtras(intent);
    message.setData(intent.getData());
    // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`.
    // startService(message);
    MessageForwardingService.enqueueWork(this, message);
  }
}

앱이 백그라운드에 있는 동안 수신된 메시지에는 시스템 트레이 알림을 채우는 데 사용되는 알림 필드의 내용이 있지만 해당 알림 내용은 FCM에 전달되지 않습니다. 즉, Message::notification 은 null이 됩니다.

요약해서 말하자면:

앱 상태 공고 데이터 둘 다
전경 OnMessageReceived OnMessageReceived OnMessageReceived
배경 시스템 트레이 OnMessageReceived 알림: 시스템 트레이
데이터: 의도 외

Android에서 사용자 정의 메시지 처리

기본적으로 앱에 전송된 알림은 ::firebase::messaging::Listener::OnMessageReceived 로 전달되지만 경우에 따라 기본 동작을 재정의해야 할 수도 있습니다. Android에서 이를 수행하려면 com.google.firebase.messaging.cpp.ListenerService 를 확장하는 사용자 정의 클래스를 작성하고 프로젝트의 AndroidManifest.xml 을 업데이트해야 합니다.

ListenerService 메서드를 재정의합니다.

ListenerService 는 앱으로 전송되는 수신 메시지를 가로채서 C++ 라이브러리로 라우팅하는 Java 클래스입니다. 앱이 포그라운드에 있을 때(또는 앱이 백그라운드이고 데이터 전용 페이로드를 수신하는 경우) 메시지는 이 클래스에서 제공되는 콜백 중 하나를 통해 전달됩니다. 메시지 처리에 사용자 지정 동작을 추가하려면 FCM의 기본 ListenerService 를 확장해야 합니다.

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

ListenerService.onMessageReceived 메서드를 재정의하여 수신된 RemoteMessage 개체를 기반으로 작업을 수행하고 메시지 데이터를 가져올 수 있습니다.

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService 에는 덜 자주 사용되는 몇 가지 다른 메서드도 있습니다. 재정의할 수도 있습니다. 자세한 내용은 FirebaseMessagingService 참조를 참조하세요.

@Override
public void onDeletedMessages() {
  Log.d(TAG, "Messages have been deleted on the server.");
  // Do additional logic...
  super.onDeletedMessages();
}

@Override
public void onMessageSent(String messageId) {
  Log.d(TAG, "An outgoing message has been sent.");
  // Do additional logic...
  super.onMessageSent(messageId);
}

@Override
public void onSendError(String messageId, Exception exception) {
  Log.d(TAG, "An outgoing message encountered an error.");
  // Do additional logic...
  super.onSendError(messageId, exception);
}

AndroidManifest.xml 업데이트

사용자 정의 클래스가 작성되면 적용하려면 AndroidManifest.xml 에 포함해야 합니다. 다음과 같이 <manifest> 태그 내에 적절한 속성을 선언하여 매니페스트에 병합 도구가 포함되어 있는지 확인합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.messaging.cpp.samples"
    xmlns:tools="http://schemas.android.com/tools">

firebase_messaging_cpp.aar 아카이브에는 FCM의 기본 ListenerService 를 선언하는 AndroidManifest.xml 파일이 있습니다. 이 매니페스트는 일반적으로 ListenerService 가 실행될 수 있는 방법인 프로젝트별 매니페스트와 병합됩니다. 이 ListenerService 는 사용자 지정 수신기 서비스로 교체해야 합니다. 이는 기본 ListenerService 를 제거하고 사용자 정의 서비스를 추가하여 수행됩니다. 이 작업은 프로젝트 AndroidManifest.xml 파일의 다음 행으로 수행할 수 있습니다.

<service android:name="com.google.firebase.messaging.cpp.ListenerService"
         tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService"
         android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT"/>
  </intent-filter>
</service>

Firebase C++ SDK의 새 버전(7.1.0 이상)은 AndroidManifest.xml 파일에서 추가 수정이 필요한 JobIntentService 를 사용합니다.

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

자동 초기화 방지

FCM은 기기 타겟팅을 위한 등록 토큰을 생성합니다. 토큰이 생성되면 라이브러리에서 식별자와 구성 데이터를 Firebase에 업로드합니다. 토큰을 사용하기 전에 명시적 옵트인을 얻으려면 FCM(Android에서는 Analytics)을 비활성화하여 구성 시 생성을 방지할 수 있습니다. 이렇게 하려면 Apple 플랫폼의 Info.plist ( GoogleService-Info.plist 아님) 또는 Android의 AndroidManifest.xml 에 메타데이터 값을 추가합니다.

기계적 인조 인간

<?xml version="1.0" encoding="utf-8"?>
<application>
  <meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />
  <meta-data android:name="firebase_analytics_collection_enabled"
             android:value="false" />
</application>

빠른

FirebaseMessagingAutoInitEnabled = NO

FCM을 다시 활성화하려면 런타임 호출을 할 수 있습니다.

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

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

FCM을 사용하면 앱에 대한 딥 링크가 포함된 메시지를 보낼 수 있습니다. 딥 링크가 포함된 메시지를 수신하려면 앱의 딥 링크를 처리하는 활동에 새 인텐트 필터를 추가해야 합니다. 인텐트 필터는 도메인의 딥 링크를 잡아야 합니다. 메시지에 딥 링크가 포함되어 있지 않으면 이 구성이 필요하지 않습니다. AndroidManifest.xml에서:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/>
</intent-filter>

의도 필터를 보다 유연하게 만들기 위해 와일드카드를 지정할 수도 있습니다. 예를 들어:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="*.example.com" android:scheme="http"/>
  <data android:host="*.example.com" android:scheme="https"/>
</intent-filter>

사용자가 지정한 체계 및 호스트에 대한 링크가 포함된 알림을 탭하면 앱이 이 인텐트 필터로 활동을 시작하여 링크를 처리합니다.

다음 단계

클라이언트 앱을 설정한 후에는 Firebase로 다운스트림 및 주제 메시지를 보낼 준비가 된 것입니다. 자세한 내용은 다운로드, 실행 및 검토할 수 있는 빠른 시작 샘플 에 나와 있는 이 기능을 참조하세요.

앱에 다른 고급 동작을 추가하려면 앱 서버에서 메시지 보내기에 대한 가이드를 참조하세요.

이러한 기능을 사용하려면 서버 구현 이 필요합니다.