Aby napisać wieloplatformową aplikację klienta Firebase Cloud Messaging w C++, użyj interfejsu API Firebase Cloud Messaging. Pakiet SDK C++ działa zarówno na platformy Androida, jak i platformy Apple, ale wymagana jest dodatkowa konfiguracja na każdej z tych platform.
Konfigurowanie Firebase i pakietu SDK FCM
Android
Jeśli nie zostało to jeszcze zrobione, dodaj Firebase do projektu C++.
W linkowanych instrukcjach konfiguracji sprawdź wymagania dotyczące urządzenia i aplikacji dotyczące korzystania z pakietu SDK Firebase C++, w tym zalecenie używania CMake do kompilowania aplikacji.
W pliku
build.gradle
na poziomie projektu dodaj repozytorium Maven firmy Google w sekcjachbuildscript
iallprojects
.
Utwórz obiekt Firebase App, przekazując środowisko JNI i działanie:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Zdefiniuj klasę, która implementuje interfejs
firebase::messaging::Listener
.Zainicjuj FCM, przekazując App i skonstruowany obiekt Listener:
::firebase::messaging::Initialize(app, listener);
Aplikacje korzystające z pakietu SDK Usług Google Play powinny przed uzyskaniem dostępu do funkcji sprawdzić na urządzeniu, czy jest na nim zgodna wersja pliku APK Usług Google Play. Więcej informacji znajdziesz w artykule Sprawdzanie pliku APK Usług Google Play.
iOS+
- Jeśli nie zostało to jeszcze zrobione, dodaj Firebase do projektu C++. Następnie, aby skonfigurować projekt dla FCM:
- W pliku Podfile projektu dodaj zależność FCM:
pod 'FirebaseMessaging'
- Przeciągnij do projektu Xcode biblioteki
firebase.framework
ifirebase_messaging.framework
z Firebase C++ SDK.
- W pliku Podfile projektu dodaj zależność FCM:
Prześlij klucz uwierzytelniania APNs do Firebase. Jeśli nie masz jeszcze klucza uwierzytelniania APN, utwórz go w Centrum dla deweloperów Apple.
-
W konsoli Firebase projektu kliknij ikonę koła zębatego, wybierz Ustawienia projektu, a następnie kartę Cloud Messaging.
-
W sekcji Konfiguracja aplikacji na iOS kliknij Prześlij obok Klucz uwierzytelniania APNs.
-
Przejdź do lokalizacji, 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.
-
Skonfiguruj projekt Xcode, aby włączyć powiadomienia push:
- Wybierz projekt w obszarze Nawigacja.
- W obszarze edytora wybierz cel projektu.
W obszarze edytora wybierz kartę Ogólne.
- Przewiń w dół do sekcji Połączone platformy i biblioteki, a potem kliknij przycisk +, aby dodać platformy.
W wyświetlonym oknie przewiń do pozycji UserNotifications.framework, kliknij ten wpis, a potem kliknij Dodaj.
Ten framework jest dostępny tylko w Xcode w wersji 8 i nowszej i jest wymagany przez tę bibliotekę.
W obszarze Edytora kliknij kartę Możliwości.
- Przełącz Powiadomienia push w pozycję Wł..
- Przewiń w dół do sekcji Tryby w tle i ustaw przełącznik w pozycji Wł.
- W sekcji Tryby w tle wybierz Powiadomienia zdalne.
Utwórz obiekt Aplikacja Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Zdefiniuj klasę, która implementuje interfejs
firebase::messaging::Listener
.Inicjuj Komunikację w chmurze Firebase, przekazując aplikację i skonstruowany obiekt Listener:
::firebase::messaging::Initialize(app, listener);
Dostęp do tokena rejestracji urządzenia
Po zainicjowaniu biblioteki Komunikacji w chmurze Firebase (FCM) wysyłane jest żądanie tokena rejestracji dla instancji aplikacji klienckiej. Aplikacja otrzyma token za pomocą wywołania zwrotnego OnTokenReceived
, który powinien być zdefiniowany w klasie implementującej firebase::messaging::Listener
.
Jeśli chcesz kierować reklamy na to konkretne urządzenie, musisz mieć dostęp do tego tokena.
Uwaga na temat dostarczania wiadomości w Androidzie
Gdy aplikacja w ogóle nie jest uruchomiona, a użytkownik kliknie powiadomienie, wiadomość nie jest domyślnie przekierowywana przez wbudowane wywołania zwrotne FCM. W tym przypadku ładunki komunikatów są odbierane przez Intent
używany do uruchamiania aplikacji. Aby usługa FCM przekazywała te wiadomości przychodzące do wywołania zwrotnego biblioteki C++, musisz zastąpić metodę onNewIntent
w 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ść w polu powiadomienia, która jest używana do wypełniania powiadomienia w obszarze powiadomień, ale treść tego powiadomienia nie jest przekazywana do FCM. Oznacza to, że Message::notification
ma wartość null.
W skrócie:
Stan aplikacji | Powiadomienie | Dane | Oba rodzaje |
---|---|---|---|
Pierwszy plan | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
Tło | obszar powiadomień. | OnMessageReceived |
Powiadomienie: w obszarze powiadomień Dane: w elementach dodatkowych intencji. |
Postępowanie z wiadomościami niestandardowymi na Androidzie
Domyślnie powiadomienia wysyłane do aplikacji są przekazywane do funkcji ::firebase::messaging::Listener::OnMessageReceived
, ale w niektórych przypadkach możesz chcieć zmienić domyślne działanie. Aby to zrobić na Androidzie, musisz utworzyć niestandardowe klasy, które rozszerzają zakres com.google.firebase.messaging.cpp.ListenerService
, a także zaktualizować AndroidManifest.xml
projektu.
Zastąp ListenerService
metodę.
ListenerService
to klasa Java, która przechwytuje przychodzące wiadomości wysyłane do aplikacji i przekierowuje je do biblioteki C++. Gdy aplikacja działa na pierwszym planie (lub gdy działa w tle i otrzymuje dane tylko z ładunku), wiadomości są przekazywane przez jedną z funkcji wywołania zwrotnego udostępnionych w tej klasie. Aby dodać niestandardowe zachowanie do obsługi wiadomości, musisz rozszerzyć domyślne ustawienie ListenerService
FCM:
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); }
Zaktualizuj: AndroidManifest.xml
Po napisaniu niestandardowych klas należy je uwzględnić w definicji AndroidManifest.xml
, aby zaczęły obowiązywać. Upewnij się, że manifest zawiera narzędzia do scalania, deklarując odpowiedni atrybut w tagu <manifest>
, na przykład w ten sposób:
<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 określa domyślny ListenerService
dla FCM. Ten plik manifestu jest zwykle scalany z pliku manifestu konkretnego projektu, dzięki czemu można uruchomić usługę ListenerService
. Ten element ListenerService
musi zostać zastąpiony przez usługę custom listener. Aby to zrobić, usuń domyślną usługę ListenerService
i dodaj niestandardową usługę. Możesz to zrobić, dodając te wiersze do 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 SDK Firebase w C++ (od wersji 7.1.0) korzystają z poziomu JobIntentService
, co wymaga wprowadzenia 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
Funkcja FCM generuje token rejestracji na potrzeby kierowania na urządzenia.
Po wygenerowaniu tokena biblioteka przesyła do Firebase
dane identyfikatora i konfiguracji. Jeśli chcesz uzyskać wyraźną zgodę przed użyciem tokena, możesz zapobiec generowaniu go w momencie konfiguracji, wyłączając FCM (a w przypadku Androida – Analytics). Aby to zrobić, dodaj wartość metadanych do Info.plist
(a nie GoogleService-Info.plist
) na platformach Apple lub do 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 wywołać go w czasie wykonywania:
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
Po ustawieniu ta wartość jest zachowywana po ponownym uruchomieniu aplikacji.
Praca z precyzyjnymi linkami w Wiadomościach 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 działania, które obsługuje precyzyjne linki do 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>
Aby zwiększyć elastyczność filtra intencji, możesz też określić symbol wieloznaczny. 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 schematu i hosta, Twoja aplikacja rozpocznie działanie za pomocą filtra intencji, aby obsłużyć ten link.
Dalsze kroki
Po skonfigurowaniu aplikacji klienta możesz wysyłać wiadomości do podrzędnych i tematycznych za pomocą Firebase. Więcej informacji o tej funkcji znajdziesz w pliku quickstart.py, który możesz pobrać, uruchomić i przeanalizować.
Aby dodać do aplikacji inne, bardziej zaawansowane funkcje, zapoznaj się z tymi przewodnikami dotyczącymi wysyłania wiadomości z serwera aplikacji:
Aby korzystać z tych funkcji, musisz mieć implementację na serwerze.