| Wybierz platformę: | iOS+ Android Web Flutter Unity C++ |
Z tego przewodnika dowiesz się, jak rozpocząć korzystanie z Firebase Cloud Messaging w aplikacjach klienckich C++ , aby móc niezawodnie wysyłać wiadomości.
Aby napisać aplikację kliencką na wielu platformach Firebase Cloud Messaging w języku C++, użyj Firebase Cloud Messaging interfejsu API. Pakiet SDK C++ działa na platformach Android i Apple, ale w przypadku każdej z nich wymagana jest dodatkowa konfiguracja. Więcej informacji o tym, jak pakiet SDK C++ na iOS i Androida współpracuje z FCM, znajdziesz w artykule Informacje o Firebase dla C++.
Konfigurowanie Firebase i pakietu SDK FCM
Android
Jeśli jeszcze tego nie zrobisz, dodaj Firebase do projektu C++.
W połączonych instrukcjach konfiguracji zapoznaj się z wymaganiami dotyczącymi urządzeń i aplikacji w przypadku korzystania z pakietu SDK Firebase C++, w tym z zaleceniem używania CMake do tworzenia aplikacji.
W pliku
build.gradlena poziomie projektu upewnij się, że repozytorium Google Maven jest uwzględnione w sekcjachbuildscriptiallprojects.
Utwórz obiekt aplikacji Firebase, przekazując środowisko JNI i aktywność:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Zdefiniuj klasę, która implementuje interfejs
firebase::messaging::Listener.Zainicjuj FCM, przekazując aplikację i utworzony odbiornik:
::firebase::messaging::Initialize(app, listener);
Aplikacje, które korzystają z pakietu SDK Usług Google Play, powinny przed uzyskaniem dostępu do funkcji sprawdzić, czy na urządzeniu jest zainstalowany zgodny plik APK Usług Google Play. Więcej informacji znajdziesz w artykule Sprawdzanie, czy na urządzeniu jest zainstalowany plik APK Usług Google Play.
iOS+
- Jeśli jeszcze tego nie zrobisz,
dodaj Firebase do projektu C++. Następnie,
aby skonfigurować projekt pod kątem FCM:
- W pliku Podfile projektu dodaj zależność FCM:
pod 'FirebaseMessaging'
- Przeciągnij frameworki
firebase.frameworkifirebase_messaging.frameworkdo projektu Xcode z pakietu SDK Firebase C++.
- W pliku Podfile projektu dodaj zależność FCM:
Prześlij klucz uwierzytelniania APNs do Firebase. Jeśli nie masz jeszcze klucza uwierzytelniania APNs, utwórz go w Apple Developer Member Center.
-
W konsoli Firebase otwórz
Ustawienia > Ogólne. Następnie kliknij kartę Komunikacja w chmurze. - W sekcji Klucz uwierzytelniania APNs w obszarze Konfiguracja aplikacji na iOS, kliknij Prześlij , aby przesłać klucz uwierzytelniania do programowania lub klucz uwierzytelniania do produkcji albo oba te klucze. Wymagany jest co najmniej 1 klucz.
- Otwórz lokalizację, w której został zapisany klucz, wybierz go i kliknij Otwórz. Dodaj identyfikator klucza (dostępny w Apple Developer Member Center) i kliknij Prześlij.
-
W konsoli Firebase otwórz
Skonfiguruj projekt Xcode, aby włączyć powiadomienia push:
- Wybierz projekt w obszarze nawigatora.
- Wybierz cel projektu w obszarze edytora.
Wybierz kartę Ogólne w obszarze edytora.
- Przewiń do sekcji Połączone frameworki i biblioteki, a następnie kliknij przycisk +, aby dodać frameworki.
W wyświetlonym oknie przewiń do sekcji UserNotifications.framework, kliknij wpis, a następnie kliknij Dodaj.
Ten framework jest dostępny tylko w Xcode w wersji 8 lub nowszej i jest wymagany przez tę bibliotekę.
Wybierz kartę Możliwości w obszarze edytora.
- Przełącz Powiadomienia push na Włączone.
- Przewiń do sekcji Tryby działania w tle, a następnie przełącz ją na Włączone.
- W sekcji Tryby działania w tle wybierz Powiadomienia zdalne.
Utwórz obiekt aplikacji Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Zdefiniuj klasę, która implementuje interfejs
firebase::messaging::Listener.Zainicjuj Komunikację w chmurze Firebase, przekazując aplikację i utworzony odbiornik:
::firebase::messaging::Initialize(app, listener);
Uzyskiwanie dostępu do tokena rejestracji FCM
Po zainicjowaniu biblioteki Komunikacji w chmurze Firebase wysyłane jest żądanie tokena rejestracji dla instancji aplikacji klienckiej. Aplikacja otrzyma token za pomocą wywołania zwrotnego OnTokenReceived, które powinno być zdefiniowane w klasie implementującej firebase::messaging::Listener.
Jeśli chcesz kierować reklamy na tę konkretną instancję aplikacji, musisz mieć dostęp do tego tokena.
Uwaga na temat dostarczania wiadomości na Androida
Gdy aplikacja nie jest w ogóle uruchomiona, a użytkownik kliknie powiadomienie,
wiadomość domyślnie nie jest kierowana przez FCM's wbudowane
wywołania zwrotne. W takim przypadku ładunki wiadomości są odbierane za pomocą Intent używanego do uruchamiania aplikacji. Aby FCM przekazywał te przychodzące
wiadomości do wywołania zwrotnego biblioteki C++, musisz zastąpić metodę
onNewIntent w swojej aktywności i przekazać Intent do
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); } }
Wiadomości odbierane, gdy aplikacja działa w tle, mają treść pola powiadomienia używaną do wypełniania powiadomienia w obszarze powiadomień, ale ta treść powiadomienia nie będzie przekazywana do FCM. Oznacza to, że Message::notification będzie mieć wartość null.
W skrócie:
| Stan aplikacji | Powiadomienie | Dane | Oba rodzaje |
|---|---|---|---|
| Pierwszy plan | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
| Tło | Obszar powiadomień | OnMessageReceived |
Powiadomienie: obszar powiadomień Dane: w dodatkach do intencji. |
Niestandardowa obsługa wiadomości na Androida
Domyślnie powiadomienia wysyłane do aplikacji są przekazywane do ::firebase::messaging::Listener::OnMessageReceived, ale w niektórych przypadkach możesz chcieć zastąpić domyślne działanie. Aby to zrobić na Androidzie, musisz napisać niestandardowe klasy, które rozszerzają com.google.firebase.messaging.cpp.ListenerService, a także zaktualizować plik AndroidManifest.xml projektu.
Zastępowanie metod ListenerService
ListenerService to klasa Java, która przechwytuje przychodzące wiadomości wysyłane do aplikacji i kieruje je do biblioteki C++. Gdy aplikacja działa na pierwszym planie (lub gdy działa w tle i odbiera ładunek zawierający tylko dane), wiadomości będą przechodzić przez jedno z wywołań zwrotnych udostępnianych w tej klasie. Aby dodać
niestandardowe działanie do obsługi wiadomości, musisz rozszerzyć FCM's
domyślną usługę ListenerService:
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
Zastępując metodę ListenerService.onMessageReceived, możesz
wykonywać działania na podstawie otrzymanego
obiektu RemoteMessage
i pobierać dane wiadomości:
@Override public void onMessageReceived(RemoteMessage message) { Log.d(TAG, "A message has been received."); // Do additional logic... super.onMessageReceived(message); }
ListenerService ma też kilka innych metod, które są używane rzadziej.
Można je też zastąpić. Więcej informacji znajdziesz w dokumentacji
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); }
Aktualizowanie pliku AndroidManifest.xml
Gdy napiszesz niestandardowe klasy, musisz je uwzględnić w pliku AndroidManifest.xml, aby zaczęły działać. Upewnij się, że manifest zawiera narzędzia do scalania, deklarując odpowiedni atrybut w tagu <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">
W archiwum firebase_messaging_cpp.aar znajduje się plik AndroidManifest.xml
, który deklaruje domyślną usługę FCM ListenerService. Ten manifest jest zwykle scalany z manifestem specyficznym dla projektu, dzięki czemu usługa ListenerService może działać. Tę usługę ListenerService trzeba zastąpić niestandardową usługą odbiornika. Aby to zrobić, usuń domyślną usługę ListenerService i dodaj niestandardową usługę, co możesz zrobić za pomocą tych wierszy w pliku AndroidManifest.xml projektu:
<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>
Nowe wersje pakietu Firebase C++ SDK (od 7.1.0) używają JobIntentService, co wymaga dodatkowych modyfikacji w pliku AndroidManifest.xml.
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
Zapobieganie automatycznej inicjalizacji
FCM generuje token rejestracji na potrzeby kierowania reklam na instancję aplikacji.
Gdy token zostanie wygenerowany, biblioteka prześle identyfikator i dane konfiguracyjne do Firebase. Jeśli chcesz uzyskać wyraźną zgodę przed użyciem tokena, możesz zapobiec jego wygenerowaniu podczas konfigurowania, wyłączając FCM (a na Androidzie – Analytics). Aby to zrobić, dodaj wartość metadanych do
pliku Info.plist (nie do pliku GoogleService-Info.plist) na platformach Apple
lub do pliku AndroidManifest.xml na Androidzie:
Android
<?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>
Swift
FirebaseMessagingAutoInitEnabled = NO
Aby ponownie włączyć FCM, możesz wykonać wywołanie w czasie działania:
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
Po ustawieniu ta wartość jest zachowywana po ponownym uruchomieniu aplikacji.
Wiadomości z precyzyjnymi linkami na Androida
FCM umożliwia wysyłanie wiadomości zawierających precyzyjny link do Twojej aplikacji. Aby otrzymywać wiadomości zawierające precyzyjny link, musisz dodać nowy filtr intencji do aktywności, która obsługuje precyzyjne linki w Twojej aplikacji. Filtr intencji powinien przechwytywać precyzyjne linki do Twojej domeny. Jeśli Twoje wiadomości nie zawierają precyzyjnego linku, ta konfiguracja nie jest konieczna. W pliku 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>
Możesz też użyć symbolu wieloznacznego, aby filtr intencji był bardziej elastyczny. Przykład:
<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>
Gdy użytkownicy klikną powiadomienie zawierające link do schematu i hosta, które określisz, Twoja aplikacja uruchomi aktywność z tym filtrem intencji, aby obsłużyć link.
Dalsze kroki
Po wykonaniu czynności konfiguracyjnych możesz przejść do dalszych działań związanych z FCM dla C++:
- Wysyłanie wiadomości na urządzenia
- Odbieranie wiadomości w aplikacji C++
- Wysyłanie wiadomości do tematów