Aby napisać wieloplatformową aplikację kliencką Firebase Cloud Messaging w C++, użyj interfejsu Firebase Cloud Messaging API. C++ SDK działa zarówno na platformach Android, jak i Apple, a dla każdej platformy wymagana jest dodatkowa konfiguracja.
Skonfiguruj Firebase i pakiet SDK FCM
Android
Jeśli jeszcze tego nie zrobiłeś, dodaj Firebase do swojego projektu C++ .
W połączonych instrukcjach konfiguracji przejrzyj wymagania dotyczące urządzenia i aplikacji dotyczące korzystania z zestawu SDK Firebase C++, w tym zalecenia dotyczące używania CMake do kompilowania aplikacji.
W pliku
build.gradle
na poziomie projektu pamiętaj, aby uwzględnić repozytorium Maven firmy Google zarówno w sekcjibuildscript
, jak iallprojects
.
Utwórz obiekt Firebase App, przekazując w środowisku JNI i Aktywności:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
Zdefiniuj klasę, która implementuje interfejs
firebase::messaging::Listener
.Zainicjuj FCM, przekazując aplikację i skonstruowany Listener:
::firebase::messaging::Initialize(app, listener);
Aplikacje korzystające z pakietu SDK usług Google Play powinny sprawdzić urządzenie pod kątem zgodnego pakietu APK usług Google Play przed uzyskaniem dostępu do funkcji. Aby dowiedzieć się więcej, zapoznaj się z plikiem APK Sprawdź usługi Google Play .
iOS+
- Potrzebujesz ważnego certyfikatu APNs . Jeśli jeszcze go nie masz, utwórz go w Apple Developer Member Center .
- Jeśli jeszcze tego nie zrobiłeś, dodaj Firebase do swojego projektu C++ . Następnie, aby skonfigurować swój projekt dla FCM:
- W pliku Pod swojego projektu dodaj zależność FCM:
pod 'FirebaseMessaging'
- Przeciągnij struktury
firebase.framework
ifirebase_messaging.framework
do projektu Xcode z pakietu Firebase C++ SDK .
- W pliku Pod swojego projektu dodaj zależność FCM:
Skonfiguruj swój projekt Xcode, aby włączyć powiadomienia push:
- Wybierz projekt z obszaru Nawigator .
- Wybierz cel projektu z obszaru Edytora .
Wybierz kartę Ogólne z obszaru Edytora .
- Przewiń w dół do Linked Frameworks and Libraries , a następnie kliknij przycisk + , aby dodać frameworki.
W wyświetlonym oknie przewiń do UserNotifications.framework , kliknij ten wpis, a następnie kliknij Dodaj .
Ta struktura pojawia się tylko w Xcode v8 i nowszych i jest wymagana przez tę bibliotekę.
Wybierz zakładkę Możliwości z obszaru Edytora .
- Przełącz powiadomienia push na Włączone .
- Przewiń w dół do opcji Tryby tła , a następnie przełącz ją na Włączone .
- Wybierz opcję Powiadomienia zdalne w sekcji Tryby tła .
Utwórz obiekt aplikacji Firebase:
app = ::firebase::App::Create(::firebase::AppOptions());
Zdefiniuj klasę, która implementuje interfejs
firebase::messaging::Listener
.Zainicjuj Firebase Cloud Messaging, przekazując aplikację i skonstruowany Listener:
::firebase::messaging::Initialize(app, listener);
Uzyskaj dostęp do tokena rejestracji urządzenia
Po zainicjowaniu biblioteki Firebase Cloud Messaging wymagany jest token rejestracji dla wystąpienia aplikacji klienckiej. Aplikacja otrzyma token z wywołaniem zwrotnym OnTokenReceived
, które należy zdefiniować 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 systemie Android
Gdy aplikacja w ogóle nie działa, a użytkownik kliknie powiadomienie, wiadomość nie jest domyślnie kierowana przez wbudowane wywołania zwrotne FCM. W takim przypadku ładunki wiadomości są odbierane za pośrednictwem Intent
używanej do uruchamiania aplikacji. Aby FCM przekazywał te wiadomości przychodzące do wywołania zwrotnego biblioteki C++, musisz zastąpić metodę onNewIntent
w działaniu 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 otrzymane, gdy aplikacja działa w tle, zawierają zawartość pola powiadomienia używanego do wypełniania powiadomienia w zasobniku systemowym, ale ta treść powiadomienia nie zostanie przekazana do FCM. Oznacza to, że Message::notification
będzie miał wartość null.
W podsumowaniu:
Stan aplikacji | Powiadomienie | Dane | Obie |
---|---|---|---|
Pierwszoplanowy | OnMessageReceived | OnMessageReceived | OnMessageReceived |
Tło | Taca systemowa | OnMessageReceived | Powiadomienie: taca systemowa Dane: w dodatkach intencji. |
Obsługa wiadomości niestandardowych w systemie Android
Domyślnie powiadomienia wysyłane do aplikacji są przekazywane do ::firebase::messaging::Listener::OnMessageReceived
, ale w niektórych przypadkach możesz chcieć zastąpić zachowanie domyślne. Aby to zrobić w systemie Android, musisz napisać niestandardowe klasy, które rozszerzają com.google.firebase.messaging.cpp.ListenerService
, a także zaktualizować AndroidManifest.xml
projektu.
Zastąp metody usługi ListenerService
.
ListenerService
to klasa Java, która przechwytuje przychodzące wiadomości wysyłane do aplikacji i kieruje je do biblioteki C++. Gdy aplikacja znajduje się na pierwszym planie (lub gdy aplikacja działa w tle i odbiera ładunek zawierający tylko dane), komunikaty będą przechodzić przez jedno z wywołań zwrotnych dostarczonych w tej klasie. Aby dodać niestandardowe zachowanie do obsługi wiadomości, musisz rozszerzyć domyślną ListenerService
w FCM:
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
Nadpisując metodę ListenerService.onMessageReceived
, możesz wykonać akcje na podstawie otrzymanego obiektu RemoteMessage i uzyskać 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 również kilka innych metod, które są używane rzadziej. Można je również zastąpić. Więcej informacji można znaleźć w dokumentacji usługi 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 muszą one zostać uwzględnione w AndroidManifest.xml
, aby zaczęły obowiązywać. Upewnij się, że manifest zawiera narzędzia do scalania, deklarując odpowiedni atrybut wewnątrz tagu <manifest>
, na przykład:
<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ą ListenerService
FCM. Ten manifest jest zwykle scalany z manifestem specyficznym dla projektu, dzięki czemu ListenerService
może działać. Ta usługa ListenerService
musi zostać zastąpiona usługą Custom Listener. Można to osiągnąć, usuwając domyślną usługę ListenerService
i dodając niestandardową usługę, co można zrobić za pomocą następujących wierszy w plikach projektów 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>
Nowe wersje Firebase C++ SDK (7.1.0 i nowsze) korzystają JobIntentService
, która 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>
Zapobiegaj automatycznej inicjalizacji
FCM generuje token rejestracji do kierowania na urządzenia. Po wygenerowaniu tokena biblioteka przesyła identyfikator i dane konfiguracyjne do Firebase. Jeśli chcesz uzyskać wyraźną zgodę przed użyciem tokena, możesz zapobiec generowaniu w czasie konfiguracji, wyłączając FCM (a w Androidzie Analytics). Aby to zrobić, dodaj wartość metadanych do pliku Info.plist
(nie GoogleService-Info.plist
) na platformach Apple lub do pliku 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>
Szybki
FirebaseMessagingAutoInitEnabled = NO
Aby ponownie włączyć FCM, możesz wykonać wywołanie w czasie wykonywania:
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
Ta wartość jest zachowywana po ponownym uruchomieniu aplikacji po ustawieniu.
Obsługa wiadomości 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 dla Twojej aplikacji. Filtr intencji powinien wykrywać precyzyjne linki w Twojej domenie. Jeśli Twoje wiadomości nie zawierają precyzyjnego linku, ta konfiguracja nie jest konieczna. W 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żliwe jest również określenie symbolu wieloznacznego, aby filtr intencji był bardziej elastyczny. Na 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 dotkną powiadomienia zawierającego łącze do określonego schematu i hosta, aplikacja rozpocznie działanie z tym filtrem intencji, aby obsłużyć łącze.
Następne kroki
Po skonfigurowaniu aplikacji klienckiej możesz wysyłać wiadomości podrzędne i tematyczne za pomocą Firebase. Aby dowiedzieć się więcej, zobacz tę funkcję zademonstrowaną w próbce szybkiego startu , którą można pobrać, uruchomić i przejrzeć.
Aby dodać inne, bardziej zaawansowane zachowanie do aplikacji, zapoznaj się z przewodnikami dotyczącymi wysyłania wiadomości z serwera aplikacji:
Pamiętaj, że do korzystania z tych funkcji potrzebna jest implementacja serwera .