C++로 교차 플랫폼 Firebase Cloud Messaging 클라이언트 앱을 작성하려면 Firebase Cloud Messaging API를 사용하세요. C++ SDK는 Android 및 Apple 플랫폼 모두에서 작동하며 각 플랫폼에 필요한 몇 가지 추가 설정이 있습니다.
Firebase 및 FCM SDK 설정
기계적 인조 인간
아직 추가하지 않았다면 C++ 프로젝트에 Firebase를 추가합니다 .
연결된 설정 안내에서 CMake를 사용하여 앱을 빌드하기 위한 권장사항을 포함하여 Firebase C++ SDK를 사용하기 위한 기기 및 앱 요구사항을 검토하세요.
프로젝트 수준
build.gradle
파일에서buildscript
및allprojects
섹션 모두에 Google의 Maven 저장소를 포함해야 합니다.
JNI 환경 및 활동:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
을 전달하는 Firebase 앱 객체를 만듭니다.firebase::messaging::Listener
인터페이스를 구현하는 클래스를 정의합니다.앱과 생성된 리스너를 전달하여 FCM을 초기화합니다.
::firebase::messaging::Initialize(app, listener);
Google Play 서비스 SDK에 의존하는 앱은 기능에 액세스하기 전에 기기에서 호환되는 Google Play 서비스 APK를 확인해야 합니다. 자세한 내용 은 Google Play 서비스 APK 확인을 참조하세요.
iOS+
- 유효한 APNs 인증서가 필요합니다. 아직 가지고 있지 않다면 Apple Developer Member Center 에서 하나 만드십시오.
- 아직 추가하지 않았다면 C++ 프로젝트에 Firebase를 추가합니다 . 그런 다음 FCM용 프로젝트를 설정하려면 다음 단계를 따르세요.
- 프로젝트의 Podfile에서 FCM 종속 항목(
pod 'FirebaseMessaging'
)을 추가합니다. - firebase.framework 및
firebase_messaging.framework
프레임워크를firebase.framework
C++ SDK 에서 Xcode 프로젝트로 드래그합니다.
- 프로젝트의 Podfile에서 FCM 종속 항목(
푸시 알림을 활성화하도록 Xcode 프로젝트를 구성합니다.
- 네비게이터 영역 에서 프로젝트를 선택합니다.
- Editor 영역 에서 프로젝트 대상을 선택합니다.
편집기 영역 에서 일반 탭을 선택합니다.
- Linked Frameworks and Libraries 까지 아래로 스크롤한 다음 + 버튼을 클릭하여 프레임워크를 추가합니다.
표시되는 창에서 UserNotifications.framework 로 스크롤하고 해당 항목을 클릭한 다음 추가 를 클릭합니다.
이 프레임워크는 Xcode v8 이상에만 나타나며 이 라이브러리에 필요합니다.
Editor 영역 에서 Capabilities 탭을 선택합니다.
- 푸시 알림 을 켜기 로 전환합니다.
- 배경 모드 까지 아래로 스크롤한 다음 켜기 로 전환합니다.
- 백그라운드 모드 에서 원격 알림 을 선택합니다.
Firebase 앱 개체 만들기:
app = ::firebase::App::Create(::firebase::AppOptions());
firebase::messaging::Listener
인터페이스를 구현하는 클래스를 정의합니다.앱과 구성된 리스너를 전달하여 Firebase 클라우드 메시징을 초기화합니다.
::firebase::messaging::Initialize(app, listener);
장치 등록 토큰에 액세스
Firebase Cloud Messaging 라이브러리를 초기화하면 클라이언트 앱 인스턴스에 대한 등록 토큰이 요청됩니다. 앱은 firebase firebase::messaging::Listener
를 구현하는 클래스에서 정의되어야 하는 OnTokenReceived
콜백으로 토큰을 받습니다.
특정 장치를 대상으로 하려면 이 토큰에 대한 액세스 권한이 필요합니다.
Android에서의 메시지 전달에 대한 참고 사항
앱이 전혀 실행되지 않고 사용자가 알림을 탭하면 메시지는 기본적으로 FCM의 내장 콜백을 통해 라우팅되지 않습니다. 이 경우 메시지 페이로드는 응용 프로그램을 시작하는 데 사용되는 Intent
를 통해 수신됩니다. FCM이 이러한 수신 메시지를 C++ 라이브러리 콜백으로 전달하도록 하려면 Activity에서 onNewIntent
메서드를 재정의하고 Intent
를 MessageForwardingService
에 전달해야 합니다.
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);
이 값은 일단 설정되면 앱을 다시 시작해도 지속됩니다.
Android에서 딥 링크로 메시지 처리
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를 사용하여 다운스트림 및 주제 메시지를 보낼 준비가 된 것입니다. 자세히 알아보려면 다운로드, 실행 및 검토할 수 있는 빠른 시작 샘플 에서 설명된 이 기능을 참조하세요.
앱에 다른 고급 동작을 추가하려면 앱 서버에서 메시지 보내기에 대한 가이드를 참조하세요.
이러한 기능을 사용하려면 서버 구현 이 필요합니다.