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

Aby napisać wieloplatformową aplikację kliencką Komunikacja w chmurze Firebase (FCM) w języku C++, użyj interfejsu API Komunikacji w chmurze Firebase (FCM). 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.

Skonfiguruj Firebase i pakiet SDK FCM

Android

  1. Dodaj Firebase do swojego projektu w C++, chyba że masz to już za sobą.

    • W połączonych instrukcjach konfiguracji sprawdź wymagania dotyczące urządzeń i aplikacji niezbędne do korzystania z pakietu SDK Firebase w C++, w tym zalecenia dotyczące używania CMake do tworzenia aplikacji.

    • W pliku build.gradle na poziomie projektu dodaj repozytorium Google Maven w sekcjach buildscript i allprojects.

  2. Utwórz obiekt aplikacji Firebase, przekazując w środowisku JNI oraz w polu Activity:

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

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

  4. Zainicjuj FCM, przekazując do aplikacji i tworząc detektor:

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

  5. Aplikacje korzystające z pakietu SDK Usług Google Play powinny przed uzyskaniem dostępu do tych funkcji sprawdzić, czy na urządzeniu znajduje się zgodny plik APK Usług Google Play. Więcej informacji znajdziesz w artykule Sprawdzanie pakietu APK Usług Google Play.

iOS+

  1. Potrzebujesz ważnego certyfikatu APN. Jeśli jeszcze jej nie masz, utwórz ją w Apple Developer Member Center.
  2. Dodaj Firebase do swojego projektu w C++, chyba że masz to już za sobą. Następnie, aby skonfigurować projekt w FCM:
    1. W pliku Podfile projektu dodaj zależność FCM:
      pod 'FirebaseMessaging'
    2. Przeciągnij ramki firebase.framework i firebase_messaging.framework do projektu Xcode z pakietu SDK Firebase C++.
  3. Skonfiguruj projekt Xcode, aby włączyć powiadomienia push:

    1. Wybierz projekt w obszarze Nawigator.
    2. W obszarze edycji wybierz miejsce docelowe 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 sekcji UserPowiadomienia.framework, kliknij ten wpis i wybierz Dodaj.

        Ta platforma pojawia się tylko w Xcode w wersji 8 i nowszych i jest wymagana 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 w Firebase:

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

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

  6. Zainicjuj Komunikację w chmurze Firebase (FCM), przekazując ją do aplikacji oraz utworzony detektor:

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

Uzyskiwanie dostępu 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 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 Androidzie

Gdy aplikacja w ogóle nie jest uruchomiona, a użytkownik klika 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);
  }
}

W wiadomościach odbieranych, gdy aplikacja działa w tle, zawartość pola powiadomień jest wypełniana w obszarze powiadomień w obszarze powiadomień, ale treść tych powiadomień 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 Zasobnik systemowy OnMessageReceived Powiadomienie: w obszarze powiadomień
Dane: w elementach dodatkowych intencji.

Niestandardowa obsługa wiadomości na Androidzie

Domyślnie powiadomienia wysyłane do aplikacji są przekazywane do ::firebase::messaging::Listener::OnMessageReceived, ale w niektórych przypadkach możesz chcieć je zastąpić. 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 metody.

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

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

Po zastąpieniu metody 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ą rzadziej używane. Możesz je również 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

Zapisane klasy niestandardowe muszą zostać uwzględnione w AndroidManifest.xml, aby zaczęły obowiązywać. Upewnij się, że plik manifestu zawiera narzędzia do scalania. W tym celu zadeklaruj w tagu <manifest> odpowiedni atrybut:

<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 deklarujący domyślną wartość ListenerService usługi FCM. Ten plik manifestu jest zwykle scalony z plikiem manifestu konkretnego projektu, w którym może działać ListenerService. Trzeba zastąpić ten obiekt ListenerService usługą detektora klienta. Aby to zrobić, usuń domyślną wartość ListenerService i dodaj usługę niestandardową. Możesz to zrobić w pliku AndroidManifest.xml projektów w następujący sposób:

<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 wersji 7.1.0) używają parametru JobIntentService, który 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 automatycznemu inicjowaniu

FCM generuje token rejestracji na potrzeby kierowania na urządzenia. Po wygenerowaniu tokena biblioteka przesyła identyfikator i dane konfiguracji do Firebase. Jeśli przed użyciem tokena chcesz uzyskać wyraźną zgodę, możesz zapobiec generowaniu danych podczas konfiguracji, wyłączając FCM (a na Androidzie i w Analytics). Aby to zrobić, dodaj wartość metadanych do Info.plist (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 wykonać wywołanie w czasie działania aplikacji:

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

Po ustawieniu ta wartość będzie się utrzymywać w przypadku ponownych uruchomień aplikacji.

FCM zezwala na 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 w Twojej aplikacji. Filtr intencji powinien przechwytywać precyzyjne linki w Twojej domenie. Jeśli 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żytkownik kliknie powiadomienie zawierające link do określonego schematu i hosta, aplikacja rozpocznie aktywność za pomocą tego filtra intencji, aby obsłużyć link.

Dalsze kroki

Po skonfigurowaniu aplikacji klienckiej możesz zacząć wysyłać wiadomości niższe i tematyczne za pomocą Firebase. Więcej informacji znajdziesz w przykładzie krótkiego wprowadzenia, który możesz pobrać, uruchomić i przejrzeć.

Aby dodać inne, bardziej zaawansowane działania w aplikacji, zapoznaj się z przewodnikami po wysyłaniu wiadomości z serwera aplikacji:

Pamiętaj, że aby korzystać z tych funkcji, musisz mieć implementację serwera.