Aby napisać wieloplatformową aplikację kliencką Firebase Cloud Messaging w C++, użyj interfejsu API Firebase Cloud Messaging. Pakiet SDK C++ działa zarówno na platformy Android, jak i Apple, wymagana jest dodatkowa konfiguracja dla każdej platformy.
Skonfiguruj Firebase i pakiet SDK FCM
Android
Jeśli jeszcze nie masz tego za sobą, dodaj Firebase do swojego projektu w C++,
W linkowanych instrukcjach konfiguracji zapoznaj się z wymaganiami dotyczącymi urządzenia i aplikacji w przypadku pakietu SDK Firebase C++, w tym z zaleceniem użycia CMake do kompilowania aplikacji.
W pliku
build.gradle
na poziomie projektu umieść dane Repozytorium Google Maven w środowiskachbuildscript
i Sekcje:allprojects
.
Utwórz obiekt aplikacji Firebase, przekazując w środowisku JNI Aktywność:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Zdefiniuj klasę, która implementuje funkcję
firebase::messaging::Listener
za pomocą prostego interfejsu online.Zainicjuj FCM, przekazując w aplikacji i utworzony detektor:
::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 dostępny zgodny plik APK Usług Google Play. Więcej informacji znajdziesz w artykule Sprawdzanie pliku APK Usług Google Play.
iOS+
- Jeśli jeszcze nie masz tego za sobą,
dodaj Firebase do swojego projektu w C++, Następnie, aby skonfigurować projekt dla FCM:
- W pliku Podfile projektu dodaj zależność FCM:
pod 'FirebaseMessaging'
- Przeciągnij
firebase.framework
ifirebase_messaging.framework
platform do projektu Xcode z pakietu SDK Firebase C++.
- W pliku Podfile projektu dodaj zależność FCM:
Prześlij swój klucz uwierzytelniania APNs do Firebase. Jeśli nie masz jeszcze klucza uwierzytelniania APNs, utwórz go w Apple Developer Member Center
-
W projekcie w konsoli Firebase wybierz ikona koła zębatego, wybierz Ustawienia projektu i wybierz Komunikacja w chmurze.
-
W sekcji Konfiguracja aplikacji na iOS kliknij Prześlij obok Klucz uwierzytelniania APNs.
-
Przejdź do miejsca, w którym masz zapisany klucz, wybierz go i kliknij Otwórz. Dodaj identyfikator klucza (dostępny w sekcji Apple Developer Member Center) i kliknij Prześlij.
-
Aby włączyć powiadomienia push, skonfiguruj projekt Xcode:
- Wybierz projekt w obszarze Nawigator.
- W obszarze edytora wybierz cel projektu.
W sekcji Obszar edytora kliknij 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 UserPowiadomienia.framework, kliknij ten wpis, a następnie 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.
- Ustaw Powiadomienia push w pozycji Włączone.
- 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 aplikacji 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);
Uzyskiwanie dostępu do tokena rejestracji urządzenia
Po zainicjowaniu biblioteki Komunikacji w chmurze Firebase (FCM) token rejestracji
żądania 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, potrzebujesz dostępu 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 usługi FCM
. W tym przypadku ładunki wiadomości są odbierane przez Intent
.
używane do uruchomienia aplikacji. Aby usługa FCM przekazywała dalej te przychodzące
do wywołania zwrotnego biblioteki C++, musisz zastąpić tę metodę
onNewIntent
w swojej aktywności i przekazuj 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 jej treść nie jest przekazywana do FCM. To znaczy,
Message::notification
będzie mieć wartość null.
W skrócie:
Stan aplikacji | Powiadomienie | Dane | Oba rodzaje |
---|---|---|---|
Pierwszy plan | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
Tło | Zasobnik systemowy | OnMessageReceived |
Powiadomienie: obszar powiadomień Dane: w dodatkowych celach. |
Niestandardowa obsługa wiadomości 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 napisać klasy niestandardowe rozszerzające klasę com.google.firebase.messaging.cpp.ListenerService
, a także zaktualizować plik AndroidManifest.xml
projektu.
Zastąp ListenerService
metody.
ListenerService
to klasa Java, która przechwytuje wiadomości przychodzące wysyłane do
i przekierowuje do biblioteki C++. Gdy aplikacja działa na pierwszym planie
(lub gdy aplikacja działa w tle i otrzymuje ładunek zawierający tylko dane),
wiadomości będą przekazywane przez jedno z wywołań zwrotnych udostępnionych w tej klasie. Aby dodać
niestandardowe zachowanie w zakresie obsługi wiadomości, musisz rozszerzyć zakres FCM
domyślna wartość 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); }
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 łączenia, 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
. Ta ListenerService
musi zostać zastąpiona przez
dzięki niestandardowemu odbiornikowi. Aby to zrobić, usuń domyślną usługę ListenerService
i dodaj niestandardową usługę. Możesz to 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 SDK Firebase C++ (od 7.1.0) używają biblioteki JobIntentService
, która wymaga
dodatkowe modyfikacje w pliku AndroidManifest.xml
.
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
Zapobiegaj automatycznemu inicjowaniu
FCM generuje token rejestracji na potrzeby kierowania na urządzenia.
Gdy wygenerowany zostanie token, biblioteka prześle do Firebase identyfikator i dane 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
Twój Info.plist
(nie GoogleService-Info.plist
) na platformach Apple,
lub AndroidManifest.xml
na Androida:
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ść będzie się utrzymywać w przypadku ponownych uruchomień aplikacji.
Radzenie sobie z wiadomościami za pomocą precyzyjnych linków na Androidzie
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 wiadomości nie zawierają precyzyjnego linku, ta konfiguracja nie jest wymagana. 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ż określić symbol wieloznaczny, aby zwiększyć skuteczność filtra intencji. i elastyczności. 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 w Firebase. Więcej informacji o tej funkcji znajdziesz w pliku przykładowym „Szybki start”, 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.