Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

Aby napisać wieloplatformowe Firebase Cloud Messaging aplikację kliencką z C ++, użyj 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 nie masz, dodać Firebase do 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 projekcie poziomu build.gradle pliku, upewnij się, że to repozytorium Maven Google zarówno w swojej buildscript i allprojects sekcjach.

  2. Tworzenie obiektu Firebase App, przechodząc w środowisku JNI i aktywny:

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

  3. Zdefiniowanie klasy, która implementuje firebase::messaging::Listener interfejsu.

  4. Inicjowanie FCM, przekazując aplikację i skonstruowanej 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, patrz Sprawdzanie Google usługi odgrywają APK .

iOS+

  1. Potrzebny jest ważny Nazwy APN certyfikat. Jeżeli nie masz jeszcze jeden, upewnij się, aby utworzyć w Państwa firmy Apple Developer Center .
  2. Jeśli jeszcze nie masz, dodać Firebase do projektu C ++ . Następnie, aby skonfigurować swój projekt dla FCM:
    1. W Podfile Twojego projektu, dodać zależność FCM:
      pod 'Firebase/Messaging'
    2. Przeciągnij firebase.framework i firebase_messaging.framework ram do projektu Xcode z Firebase C ++ SDK .
  3. Skonfiguruj swój projekt Xcode, aby włączyć powiadomienia push:

    1. Wybierz projekt z obszaru Navigator.
    2. Wybierz cel projektu z obszaru Editor.
    3. Wybierz zakładkę Ogólne z obszaru Editor.

      1. Przewiń w dół do Linked ram i bibliotek, a następnie kliknij przycisk +, aby dodać ram.
      2. W oknie, które się pojawi, wskaż UserNotifications.framework, kliknij na ten wpis, a następnie kliknij przycisk 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 Editor.

      1. Przełączyć powiadomień push Wł.
      2. Przewiń w dół do tła Tryby, a następnie przełączyć ją na Wł.
      3. Wybierz zdalnych powiadomień pod Tryby tle.
  4. Tworzenie obiektu Firebase App:

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

  5. Zdefiniowanie klasy, która implementuje firebase::messaging::Listener interfejsu.

  6. Inicjowanie Firebase Cloud Messaging, przekazując aplikację i skonstruowanej 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 OnTokenReceived zwrotnego, które powinny zostać 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 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 tym przypadku ładowność wiadomości są odbierane przez Intent używany do uruchamiania aplikacji. Aby mieć FCM naprzód tych wiadomości przychodzących do biblioteki C ++ zwrotnego, trzeba zastąpić metodę onNewIntent w swojej działalnoś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 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 zerowy.

W podsumowaniu:

Stan aplikacji Notyfikacja 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że chcesz nadpisać domyślne zachowanie. Aby to zrobić na Android będzie trzeba napisać niestandardowych klas, które rozszerzają com.google.firebase.messaging.cpp.ListenerService jak zaktualizować swój projektu AndroidManifest.xml .

Przestawianie ListenerService metod.

ListenerService jest klasa Java, który przechwytuje przychodzące wiadomości wysyłane do aplikacji i tras ich 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 zachowania do obsługi wiadomości, trzeba będzie przedłużyć FCM jest domyślną ListenerService :

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

class MyListenerService extends ListenerService {

Nadrzędnymi metoda ListenerService.onMessageReceived można wykonywać działania w oparciu o otrzymane RemoteMessage obiektu i uzyskać dane wiadomość:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService ma także kilka innych metod, które są rzadziej używane. Te mogą być pominięte, a także, aby uzyskać więcej informacji zobacz FirebaseMessagingService odniesienia.

@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);
}

aktualizacja AndroidManifest.xml

Po Twojej klasy niestandardowe zostały napisane, muszą być zawarte w AndroidManifest.xml odniosły skutek. Upewnić się, że manifest zawiera narzędzia seryjnej deklarując odpowiedni atrybut wewnątrz <manifest> tagu, jak w przykładzie:

<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 firebase_messaging_cpp.aar archiwum istnieje AndroidManifest.xml plik, który deklaruje FCM jest domyślną ListenerService . Ten manifest jest zwykle połączone z konkretnym projektem, który jest oczywisty sposób ListenerService jest w stanie uruchomić. Ten ListenerService musi zastąpić usługi cusom słuchacza. Że odbywa się poprzez usunięcie domyślnego ListenerService i dodając niestandardowe usługi, które mogą być wykonane z następujących liniach swoich projektów AndroidManifest.xml pliku:

<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 r) użycie JobIntentService co wymaga dodatkowych modyfikacji w AndroidManifest.xml pliku.

<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ć, należy dodać wartość metadanych do Info.plist (nie Twój GoogleService-Info.plist ) na platformach Apple, lub swojej 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ę funkcjonalność wykazać w próbie szybkiego startu , który można pobrać, uruchomić, a opinię.

Aby dodać inne, bardziej zaawansowane zachowanie do aplikacji, zapoznaj się z przewodnikami dotyczącymi wysyłania wiadomości z serwera aplikacji:

Pamiętaj, że musisz mieć implementację serwera do korzystania z tych funkcji.