Aby napisać wieloplatformową aplikację kliencką Firebase Cloud Messaging w języku C++, użyj interfejsu Firebase Cloud Messaging API. Zestaw C++ SDK działa zarówno na platformach Android, jak i Apple, przy czym 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 dołączonych instrukcjach konfiguracji przejrzyj wymagania dotyczące urządzenia i aplikacji dotyczące korzystania z pakietu Firebase C++ SDK, w tym zalecenie dotyczące używania narzędzia CMake do tworzenia aplikacji.
Upewnij się, że w pliku
build.gradle
na poziomie projektu uwzględniono repozytorium Google Maven zarówno w sekcjibuildscript
, jak iallprojects
.
Utwórz obiekt aplikacji Firebase, 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 aplikację i skonstruowany odbiornik:
::firebase::messaging::Initialize(app, listener);
Aplikacje korzystające z pakietu SDK usług Google Play powinny przed uzyskaniem dostępu do funkcji sprawdzić urządzenie pod kątem kompatybilnego pakietu APK usług Google Play. Aby dowiedzieć się więcej, zapoznaj się z artykułem Sprawdź pakiet APK usług 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ć projekt dla FCM:
- W pliku Podfile swojego projektu dodaj zależność FCM:
pod 'FirebaseMessaging'
- Przeciągnij frameworki
firebase.framework
ifirebase_messaging.framework
do swojego projektu Xcode z Firebase C++ SDK .
- W pliku Podfile swojego projektu dodaj zależność FCM:
Skonfiguruj swój projekt Xcode, aby włączyć powiadomienia push:
- Wybierz projekt z obszaru Nawigatora .
- Wybierz cel projektu z obszaru Edytora .
Wybierz zakładkę Ogólne w obszarze Edytora .
- Przewiń w dół do Linked Frameworks and Libraries , a następnie kliknij przycisk + , aby dodać struktury.
W wyświetlonym oknie przewiń do UserNotifications.framework , kliknij ten wpis, a następnie kliknij Dodaj .
Ta platforma pojawia się tylko w Xcode v8 i nowszych i jest wymagana przez tę bibliotekę.
Wybierz kartę Możliwości z obszaru Edytora .
- Przełącz Powiadomienia push na Włączone .
- Przewiń w dół do Tryby w tle , a następnie przełącz na Wł .
- Wybierz Powiadomienia zdalne w obszarze Tryby w tle .
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 odbiornik:
::firebase::messaging::Initialize(app, listener);
Uzyskaj dostęp do tokena rejestracji urządzenia
Podczas inicjowania biblioteki Firebase Cloud Messaging żądany jest token rejestracji dla instancji aplikacji klienckiej. Aplikacja otrzyma token z wywołaniem zwrotnym OnTokenReceived
, które powinno być zdefiniowane w klasie implementującej firebase::messaging::Listener
.
Jeśli chcesz kierować reklamy na to konkretne urządzenie, potrzebujesz dostępu do tego tokena.
Uwaga dotycząca dostarczania wiadomości na Androidzie
Gdy aplikacja w ogóle nie działa, a użytkownik dotknie powiadomienia, wiadomość domyślnie nie jest kierowana przez wbudowane wywołania zwrotne FCM. W takim przypadku ładunki komunikatów są odbierane za pośrednictwem Intent
używanej do uruchamiania aplikacji. Aby FCM przekierowywał te przychodzące wiadomości do wywołania zwrotnego biblioteki C++, musisz zastąpić metodę onNewIntent
w swoim Activity 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, mają zawartość swojego pola powiadomienia używaną do wypełnienia powiadomienia w zasobniku systemowym, ale ta treść powiadomienia nie zostanie przekazana do FCM. Oznacza to, że Message::notification
będzie miało wartość null.
W podsumowaniu:
Stan aplikacji | Powiadomienie | Dane | Obydwa |
---|---|---|---|
Pierwszoplanowy | OnMessageReceived | OnMessageReceived | OnMessageReceived |
Tło | Taca systemowa | OnMessageReceived | Powiadomienie: zasobnik systemowy Dane: w dodatkach intencji. |
Niestandardowa obsługa wiadomości 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ć domyślne zachowanie. 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ąp metody ListenerService
.
ListenerService
to klasa Java, która przechwytuje przychodzące wiadomości wysyłane do aplikacji i kieruje je do biblioteki C++. Gdy aplikacja jest na pierwszym planie (lub gdy aplikacja jest w tle i otrzymuje ładunek zawierający tylko dane), komunikaty przechodzą przez jedno z wywołań zwrotnych dostępnych w tej klasie. Aby dodać niestandardowe zachowanie do obsługi wiadomości, musisz rozszerzyć domyślną ListenerService
FCM:
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
Nadpisując metodę ListenerService.onMessageReceived
można wykonać akcje na podstawie odebranego obiektu RemoteMessage i uzyskać dane komunikatu:
@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ż przesłonić, aby uzyskać więcej informacji, zapoznaj się z dokumentacją 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 klas niestandardowych muszą one zostać uwzględnione w pliku AndroidManifest.xml
, aby zaczęły obowiązywać. Upewnij się, że manifest zawiera narzędzia scalania, deklarując odpowiedni atrybut w 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
. Ten manifest jest zwykle łączony z manifestem specyficznym dla projektu, dzięki czemu ListenerService
może działać. Tę ListenerService
należy zastąpić niestandardową usługą nasłuchiwania. Można to osiągnąć, usuwając domyślną ListenerService
i dodając niestandardową usługę, co można zrobić za pomocą następujących wierszy pliku AndroidManifest.xml
projektów:
<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ą z 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 na potrzeby 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 (oraz w Androidzie, Analytics). Aby to zrobić, dodaj wartość metadanych do pliku Info.plist
(nie GoogleService-Info.plist
) na platformach Apple lub 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>
Szybki
FirebaseMessagingAutoInitEnabled = NO
Aby ponownie włączyć FCM, możesz wykonać wywołanie w czasie wykonywania:
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
Ta wartość utrzymuje się po ponownym uruchomieniu aplikacji.
Obsługa wiadomości za pomocą głębokich linków w systemie Android
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 obsługującego precyzyjne linki do Twojej aplikacji. Filtr intencji powinien przechwytywać precyzyjne linki z Twojej domeny. Jeśli Twoje wiadomości nie zawierają głębokiego 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 link do określonego schematu i hosta, aplikacja rozpocznie działanie z tym filtrem intencji, aby obsłużyć link.
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 przykładzie szybkiego startu , który 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 będziesz potrzebować implementacji serwera , aby móc korzystać z tych funkcji.