Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

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

  2. Utwórz obiekt aplikacji Firebase, 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 aplikację i skonstruowany odbiornik:

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

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

  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ć projekt dla FCM:
    1. W pliku Podfile swojego projektu dodaj zależność FCM:
      pod 'FirebaseMessaging'
    2. Przeciągnij frameworki firebase.framework i firebase_messaging.framework do swojego projektu Xcode z Firebase C++ SDK .
  3. Skonfiguruj swój projekt Xcode, aby włączyć powiadomienia push:

    1. Wybierz projekt z obszaru Nawigatora .
    2. Wybierz cel projektu z obszaru Edytora .
    3. Wybierz zakładkę Ogólne w obszarze Edytora .

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

    4. Wybierz kartę Możliwości z obszaru Edytora .

      1. Przełącz Powiadomienia push na Włączone .
      2. Przewiń w dół do Tryby w tle , a następnie przełącz na .
      3. Wybierz Powiadomienia zdalne w obszarze Tryby w tle .
  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 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 Obie
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 (od 7.1.0) 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.

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 aby korzystać z tych funkcji, potrzebujesz implementacji serwera .