Konfigurowanie aplikacji klienckiej Komunikacja w chmurze Firebase (FCM) w języku C++

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

  1. 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 środowiskach buildscript i Sekcje: allprojects.

    .
  2. Utwórz obiekt aplikacji Firebase, przekazując w środowisku JNI Aktywność:

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

  3. Zdefiniuj klasę, która implementuje funkcję firebase::messaging::Listener za pomocą prostego interfejsu online.

  4. Zainicjuj FCM, przekazując w aplikacji i utworzony detektor:

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

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

  1. Jeśli jeszcze nie masz tego za sobą, dodaj Firebase do swojego projektu w C++, Następnie, aby skonfigurować projekt dla FCM:
    1. W pliku Podfile projektu dodaj zależność FCM:
      pod 'FirebaseMessaging'
    2. Przeciągnij firebase.framework i firebase_messaging.framework platform do projektu Xcode z pakietu SDK Firebase C++.
  2. 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

    1. W projekcie w konsoli Firebase wybierz ikona koła zębatego, wybierz Ustawienia projektu i wybierz Komunikacja w chmurze.

    2. W sekcji Konfiguracja aplikacji na iOS kliknij Prześlij obok Klucz uwierzytelniania APNs.

    3. 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.

  3. Aby włączyć powiadomienia push, skonfiguruj projekt Xcode:

    1. Wybierz projekt w obszarze Nawigator.
    2. W obszarze edytora wybierz cel projektu.
    3. W sekcji Obszar edytora kliknij kartę Ogólne.

      1. Przewiń w dół do sekcji Połączone platformy i biblioteki, a potem kliknij przycisk +, aby dodać platformy.
      2. 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ę.

    4. W obszarze Edytora kliknij kartę Możliwości.

      1. Ustaw Powiadomienia push w pozycji Włączone.
      2. Przewiń w dół do sekcji Tryby w tle i ustaw przełącznik w pozycji Wł.
      3. W sekcji Tryby w tle wybierz Powiadomienia zdalne.
  4. Utwórz obiekt aplikacji Firebase:

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

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

  6. 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.

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.