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

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

C++로 교차 플랫폼 Firebase Cloud Messaging 클라이언트 앱을 작성하려면 Firebase Cloud Messaging API를 사용하세요. C++ SDK는 Android 및 Apple 플랫폼 모두에서 작동하며 각 플랫폼에 필요한 몇 가지 추가 설정이 있습니다.

Firebase 및 FCM SDK 설정

기계적 인조 인간

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

    • 연결된 설정 안내에서 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. 유효한 APNs 인증서가 필요합니다. 아직 가지고 있지 않다면 Apple Developer Member Center 에서 하나 만드십시오.
  2. 아직 추가하지 않았다면 C++ 프로젝트에 Firebase를 추가합니다 . 그런 다음 FCM용 프로젝트를 설정하려면 다음 단계를 따르세요.
    1. 프로젝트의 Podfile에서 FCM 종속 항목(
      pod 'FirebaseMessaging'
      )을 추가합니다.
    2. firebase.framework 및 firebase_messaging.framework 프레임워크를 firebase.framework C++ SDK 에서 Xcode 프로젝트로 드래그합니다.
  3. 푸시 알림을 활성화하도록 Xcode 프로젝트를 구성합니다.

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

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

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

    4. Editor 영역 에서 Capabilities 탭을 선택합니다.

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

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

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

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

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

장치 등록 토큰에 액세스

Firebase Cloud Messaging 라이브러리를 초기화하면 클라이언트 앱 인스턴스에 대한 등록 토큰이 요청됩니다. 앱은 firebase firebase::messaging::Listener 를 구현하는 클래스에서 정의되어야 하는 OnTokenReceived 콜백으로 토큰을 받습니다.

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

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

앱이 전혀 실행되지 않고 사용자가 알림을 탭하면 메시지는 기본적으로 FCM의 내장 콜백을 통해 라우팅되지 않습니다. 이 경우 메시지 페이로드는 응용 프로그램을 시작하는 데 사용되는 Intent 를 통해 수신됩니다. FCM이 이러한 수신 메시지를 C++ 라이브러리 콜백으로 전달하도록 하려면 Activity에서 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에서는 분석)을 비활성화하여 구성 시 생성을 방지할 수 있습니다. 이렇게 하려면 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를 사용하여 다운스트림 및 주제 메시지를 보낼 준비가 된 것입니다. 자세히 알아보려면 다운로드, 실행 및 검토할 수 있는 빠른 시작 샘플 에서 설명된 이 기능을 참조하세요.

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

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