Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Skonfiguruj aplikację kliencką Firebase Cloud Messaging za pomocą C++

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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

  1. 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 sekcji buildscript , jak i allprojects .

  2. Utwórz obiekt Firebase App, przekazując w środowisku JNI i Aktywności:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. Zdefiniuj klasę, która implementuje interfejs firebase::messaging::Listener .

  4. Zainicjuj FCM, przechodząc w aplikacji i skonstruowany Listener:

    ::firebase::messaging::Initialize(app, listener);

  5. 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+

  1. Potrzebujesz ważnego certyfikatu APNs . Jeśli jeszcze go nie masz, utwórz go w Apple Developer Member Center .
  2. Jeśli jeszcze tego nie zrobiłeś, dodaj Firebase do swojego projektu C++ . Następnie, aby skonfigurować swój projekt dla FCM:
    1. W pliku Podpliku projektu dodaj zależność FCM:
      pod 'FirebaseMessaging'
    2. Przeciągnij struktury firebase.framework i firebase_messaging.framework do projektu Xcode z pakietu Firebase C++ SDK .
  3. Skonfiguruj swój projekt Xcode, aby włączyć powiadomienia push:

    1. Wybierz projekt z obszaru Nawigator .
    2. Wybierz cel projektu z obszaru Edytora .
    3. Wybierz kartę Ogólne z obszaru Edytora .

      1. Przewiń w dół do Linked Frameworks and Libraries , a następnie kliknij przycisk + , aby dodać frameworki.
      2. 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ę.

    4. Wybierz zakładkę Możliwości z obszaru Edytora .

      1. Przełącz powiadomienia push na Włączone .
      2. Przewiń w dół do opcji Tryby tła , a następnie przełącz ją na Włączone .
      3. Wybierz Powiadomienia zdalne w sekcji Tryby tła .
  4. Utwórz obiekt aplikacji Firebase:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. Zdefiniuj klasę, która implementuje interfejs firebase::messaging::Listener .

  6. 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 komunikatów 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, mają 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 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 jest w tle i odbiera ładunek tylko do danych), 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 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ą rzadziej używane. 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 można uruchomić ListenerService . 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.

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 .