| 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 dodaj repozytorium Google Maven do sekcjibuildscriptiallprojects.
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 produkcyjnego 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 nawigacji.
- 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 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 (7.1.0 i nowsze) 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 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 określonego przez Ciebie schematu i hosta, 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