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

Aby napisać wieloplatformową aplikację klienta Firebase Cloud Messaging w C++, użyj interfejsu API Firebase Cloud Messaging. Pakiet SDK C++ działa zarówno na platformy Androida, jak i platformy Apple, ale wymagana jest dodatkowa konfiguracja na każdej z tych platform.

Konfigurowanie Firebase i pakietu SDK FCM

Android

  1. Jeśli nie zostało to jeszcze zrobione, dodaj Firebase do projektu C++.

    • W linkowanych instrukcjach konfiguracji sprawdź wymagania dotyczące urządzenia i aplikacji dotyczące korzystania z pakietu SDK Firebase C++, w tym zalecenie używania CMake do kompilowania aplikacji.

    • W pliku build.gradle na poziomie projektu dodaj repozytorium Maven firmy Google w sekcjach buildscriptallprojects.

  2. Utwórz obiekt Firebase App, przekazując środowisko JNI i działanie:

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

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

  4. Zainicjuj FCM, przekazując App i skonstruowany obiekt Listener:

    ::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 na nim zgodna wersja pliku APK Usług Google Play. Więcej informacji znajdziesz w artykule Sprawdzanie pliku APK Usług Google Play.

iOS+

  1. Jeśli nie zostało to jeszcze zrobione, dodaj Firebase do projektu C++. Następnie, aby skonfigurować projekt dla FCM:
    1. W pliku Podfile projektu dodaj zależność FCM:
      pod 'FirebaseMessaging'
    2. Przeciągnij do projektu Xcode biblioteki firebase.frameworkfirebase_messaging.frameworkFirebase C++ SDK.
  2. Prześlij klucz uwierzytelniania APNs do Firebase. Jeśli nie masz jeszcze klucza uwierzytelniania APN, utwórz go w Centrum dla deweloperów Apple.

    1. W konsoli Firebase projektu kliknij ikonę koła zębatego, wybierz Ustawienia projektu, a następnie kartę Cloud Messaging.

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

    3. Przejdź do lokalizacji, w której został zapisany klucz, wybierz go i kliknij Otwórz. Dodaj identyfikator klucza (dostępny w Apple Developer Member Center) i kliknij Prześlij.

  3. Skonfiguruj projekt Xcode, aby włączyć powiadomienia push:

    1. Wybierz projekt w obszarze Nawigacja.
    2. W obszarze edytora wybierz cel projektu.
    3. W obszarze edytora wybierz 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 pozycji UserNotifications.framework, kliknij ten wpis, a potem 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. Przełącz Powiadomienia push w pozycję Wł..
      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 Aplikacja 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);

Dostęp do tokena rejestracji urządzenia

Po zainicjowaniu biblioteki Komunikacji w chmurze Firebase (FCM) wysyłane jest żądanie tokena rejestracji 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, musisz mieć dostęp 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 wywołania zwrotne FCM. W tym przypadku ładunki komunikatów są odbierane przez Intent używany do uruchamiania aplikacji. Aby usługa FCM przekazywała te wiadomości przychodzące do wywołania zwrotnego biblioteki C++, musisz zastąpić metodę onNewIntent w aktywności 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 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 treść tego powiadomienia nie jest przekazywana do FCM. Oznacza to, że Message::notification ma wartość null.

W skrócie:

Stan aplikacji Powiadomienie Dane Oba rodzaje
Pierwszy plan OnMessageReceived OnMessageReceived OnMessageReceived
Tło obszar powiadomień. OnMessageReceived Powiadomienie: w obszarze powiadomień
Dane: w elementach dodatkowych intencji.

Postępowanie z wiadomościami niestandardowymi 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 utworzyć niestandardowe klasy, które rozszerzają zakres com.google.firebase.messaging.cpp.ListenerService, a także zaktualizować AndroidManifest.xml projektu.

Zastąp ListenerService metodę.

ListenerService to klasa Java, która przechwytuje przychodzące wiadomości wysyłane do aplikacji i przekierowuje je do biblioteki C++. Gdy aplikacja działa na pierwszym planie (lub gdy działa w tle i otrzymuje dane tylko z ładunku), wiadomości są przekazywane przez jedną z funkcji wywołania zwrotnego udostępnionych w tej klasie. Aby dodać niestandardowe zachowanie do obsługi wiadomości, musisz rozszerzyć domyślne ustawienie ListenerService FCM:

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 scalania, 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. Ten element ListenerService musi zostać zastąpiony przez usługę custom listener. Aby to zrobić, usuń domyślną usługę ListenerService i dodaj niestandardową usługę. Możesz to zrobić, dodając te wiersze do 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 w C++ (od wersji 7.1.0) korzystają z poziomu JobIntentService, co wymaga wprowadzenia 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>

Zapobieganie automatycznej inicjalizacji

Funkcja FCM generuje token rejestracji na potrzeby kierowania na urządzenia. Po wygenerowaniu tokena biblioteka przesyła do Firebase dane identyfikatora i 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 Info.plist (a nie GoogleService-Info.plist) na platformach Apple lub do 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>

Swift

FirebaseMessagingAutoInitEnabled = NO

Aby ponownie włączyć FCM, możesz wywołać go w czasie wykonywania:

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

Po ustawieniu ta wartość jest zachowywana po ponownym uruchomieniu 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 Twoje wiadomości nie zawierają precyzyjnego linku, ta konfiguracja nie jest konieczna. 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>

Aby zwiększyć elastyczność filtra intencji, możesz też określić symbol wieloznaczny. 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 za pomocą Firebase. Więcej informacji o tej funkcji znajdziesz w pliku quickstart.py, 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.