Wprowadzenie do Komunikacji w chmurze Firebase w aplikacjach Flutter

Wybierz platformę: iOS+ Android Web Flutter Unity C++


Z tego przewodnika dowiesz się, jak zacząć korzystać z Firebase Cloud Messaging w aplikacjach klienckich Flutter, aby niezawodnie wysyłać wiadomości.

W zależności od platformy, na którą kierujesz reklamy, musisz wykonać kilka dodatkowych czynności konfiguracyjnych.

iOS+

Podmiana metody

Aby korzystać z wtyczki Flutter FCM na urządzeniach Apple, musisz używać podmiany metody. Bez tego kluczowe funkcje Firebase, takie jak obsługa rejestracji FCM, nie będą działać prawidłowo.

Android

Usługi Google Play

Klienty FCM wymagają urządzeń z Androidem 7.0 lub nowszym, na których zainstalowane są też Usługi Google Play, lub emulatora z Androidem 7.0 i interfejsami API Google. Pamiętaj, że nie musisz wdrażać aplikacji na Androida tylko przez Sklep Google Play.

Aplikacje, które korzystają z pakietu SDK usług Google Play, powinny zawsze sprawdzać, czy na urządzeniu jest zgodny plik APK usług Google Play, zanim uzyskają dostęp do funkcji usług Google Play. Zalecamy zrobienie tego w 2 miejscach: w metodzie onCreate() i metodzie onResume() głównej aktywności. Sprawdzanie w onCreate() gwarantuje, że nie można korzystać z aplikacji, jeśli nie przejdzie ona pomyślnie kontroli. Sprawdzanie w metodzie onResume() gwarantuje, że jeśli użytkownik wróci do uruchomionej aplikacji w inny sposób, np. za pomocą przycisku Wstecz, sprawdzanie nadal zostanie przeprowadzone.

Jeśli na urządzeniu nie ma zgodnej wersji Usług Google Play, aplikacja może wywołać metodę GoogleApiAvailability.makeGooglePlayServicesAvailable(), aby umożliwić użytkownikom pobranie Usług Google Play ze Sklepu Play.

Sieć

Konfigurowanie danych logowania do stron internetowych za pomocą FCM

Interfejs internetowy FCM używa danych logowania do sieci o nazwie Voluntary Application Server Identification (VAPID) do autoryzacji żądań wysyłania do obsługiwanych usług internetowych powiadomień push. Aby zasubskrybować powiadomienia push w aplikacji, musisz powiązać parę kluczy z projektem w Firebase. Możesz wygenerować nową parę kluczy lub zaimportować istniejącą parę kluczy za pomocą konsoli Firebase.

Zainstaluj wtyczkę FCM

  1. Zainstaluj i zainicjuj wtyczki Firebase do Fluttera, jeśli jeszcze nie zostało to zrobione.

  2. Aby zainstalować wtyczkę, uruchom to polecenie w katalogu głównym projektu Flutter:

    flutter pub add firebase_messaging
    
  3. Gdy to zrobisz, ponownie skompiluj aplikację Flutter:

    flutter run
    

Poproś o zgodę na wyświetlanie powiadomień

Aby wysłać powiadomienie na urządzenie, musisz zarejestrować urządzenie w FCM za pomocą register(). Jeśli nie przyznano zgody na wyświetlanie powiadomień, ta metoda poprosi użytkownika o jej udzielenie. W przeciwnym razie zwraca FID przez onRegistered w przypadku powodzenia lub odrzuca przyszłość z powodu błędu.

// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);

// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
 // APNS token is available, make FCM plugin API requests...
}

Dostęp do identyfikatora instalacji Firebase

Włączanie rejestracji za pomocą identyfikatora instalacji Firebase

Aby umożliwić rejestrowanie instancji aplikacji w FCM za pomocą identyfikatora instalacji Firebase (FID), musisz najpierw włączyć identyfikatory FID w konfiguracji aplikacji na platformy Android i Apple (w przypadku aplikacji internetowych nie jest wymagana statyczna konfiguracja akceptacji):

Android

Dodaj element <meta-data> w elemencie <application> w pliku AndroidManifest.xml:

<meta-data android:name="firebase_messaging_installation_id_enabled"
           android:value="true" />

iOS+

Dodaj klucz FirebaseMessagingInstallationIdEnabled do pliku Info.plist i ustaw jego wartość na true (YES):

<key>FirebaseMessagingInstallationIdEnabled</key>
<true/>

Subskrybowanie strumienia onRegistered

Aby wysłać wiadomość do instancji aplikacji na konkretnym urządzeniu, musisz mieć identyfikator instalacji Firebase (FID) tej instancji aplikacji po jej zarejestrowaniu w FCM. Identyfikator FID jest dostarczany asynchronicznie przez strumień onRegistered.

Na platformach Android i Apple FCM automatycznie rejestruje instancję aplikacji podczas uruchamiania, gdy włączona jest automatyczna inicjalizacja (domyślnie). Wymagane jest jednak wyraźne wywołanie funkcji register():

  • W internecie. Opcjonalnie możesz przekazać parametry vapidKey i serviceWorkerScriptPath.
  • na platformach Android i Apple, jeśli automatyczna inicjacja jest wyłączona lub po wywołaniu unregister(). Możesz też w każdej chwili wywołać register(), aby aktywować onRegistered z zarejestrowanym już identyfikatorem FID.

Zawsze subskrybuj onRegistered przed wywołaniem register(), aby detektor był aktywny, gdy zostanie wyemitowane zdarzenie rejestracji:

final messaging = FirebaseMessaging.instance;

messaging.onRegistered
    .listen((String installationId) {
      // TODO: Send the Firebase Installation ID (FID) to your application server.
    })
    .onError((err) {
      // Error getting Firebase Installation ID.
    });

// Required on Web, and on Android/Apple if auto-initialization is disabled.
await messaging.register(
  // Optional on Web (ignored on Android and Apple platforms)
  vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu",
);

Strumień onRegistered emituje FID w tych przypadkach:

  1. Automatycznie podczas pierwszego uruchomienia aplikacji i rutynowej synchronizacji na platformach Android i Apple, gdy włączona jest automatyczna inicjalizacja.
  2. Za każdym razem, gdy kończy się ręczne wywołanie register() (nawet jeśli instancja aplikacji jest już zarejestrowana, onRegistered nadal emituje już zarejestrowany identyfikator FID).
  3. Za każdym razem, gdy zostanie wykryta zmiana identyfikatora instalacji Firebase, a aplikacja zostanie ponownie zarejestrowana w FCM, lub w przypadku aplikacji internetowej, gdy zostanie wywołane zdarzenie pushsubscriptionchange.

Po uzyskaniu identyfikatora instalacji Firebase (FID) wyślij go na serwer aplikacji i zapisz, używając preferowanej metody.

Uzyskiwanie dostępu do tokena rejestracji (wycofane)

Aby wysłać wiadomość na konkretne urządzenie, musisz znać token rejestracji urządzenia. Aby pobrać token rejestracji dla instancji aplikacji, wywołaj getToken(). Jeśli nie przyznano zgody na wyświetlanie powiadomień, ta metoda poprosi użytkownika o jej udzielenie. W przeciwnym razie zwraca token lub odrzuca przyszłość z powodu błędu.

Na platformach internetowych przekaż klucz publiczny VAPID do getToken():

final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

Aby otrzymywać powiadomienia o każdej aktualizacji tokena, zasubskrybuj strumień onTokenRefresh:

FirebaseMessaging.instance.onTokenRefresh
    .listen((fcmToken) {
      // TODO: If necessary send token to application server.

      // Note: This callback is fired at each app startup and whenever a new
      // token is generated.
    })
    .onError((err) {
      // Error getting token.
    });

Zapobieganie automatycznej inicjalizacji

Gdy zostanie wygenerowana rejestracja FCM, biblioteka przesyła identyfikator i dane konfiguracji do Firebase. Jeśli chcesz zapobiec automatycznej rejestracji, wyłącz automatyczną inicjalizację podczas kompilacji.

Gdy automatyczna inicjalizacja jest wyłączona, możesz jawnie zarejestrować instancję aplikacji w czasie działania, wywołując register() (pamiętaj, aby najpierw zasubskrybować onRegistered, aby otrzymać identyfikator instalacji Firebase):

await FirebaseMessaging.instance.register();

iOS

W systemie iOS dodaj wartość metadanych do pliku Info.plist:

FirebaseMessagingAutoInitEnabled = NO

Android

Na Androidzie wyłącz zbieranie danych Analytics i automatyczną inicjalizację FCM (musisz wyłączyć obie te funkcje), dodając te wartości metadanych do pliku AndroidManifest.xml:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

Ponowne włączanie automatycznej inicjalizacji FCM w czasie działania

Aby włączyć automatyczną inicjalizację dla konkretnej instancji aplikacji, wywołaj setAutoInitEnabled():

await FirebaseMessaging.instance.setAutoInitEnabled(true);

Po ustawieniu ta wartość jest zachowywana po ponownym uruchomieniu aplikacji.

Wysyłanie testowego powiadomienia

  1. Zainstaluj i uruchom aplikację na urządzeniu docelowym. Na urządzeniach Apple musisz zaakceptować prośbę o uprawnienia do otrzymywania powiadomień zdalnych.

  2. Upewnij się, że aplikacja działa w tle na urządzeniu.

  3. W konsoli Firebase kliknij DevOps & Engagement > Messaging (Wiadomości).

  4. Utworzenie kampanii.

    • Jeśli to Twoja pierwsza wiadomość:

      1. Kliknij Utwórz pierwszą kampanię.

      2. Wybierz Powiadomienia Firebase i kliknij Utwórz.

    • Jeśli masz już utworzone kampanie:

      1. Na karcie Kampanie kliknij Nowa kampania.

      2. Kliknij Powiadomienia.

  5. Wpisz tekst wiadomości.

  6. W panelu po prawej stronie wybierz Wyślij wiadomość testową.

  7. W polu Dodaj identyfikator instalacji Firebase lub token rejestracji FCM wpisz zarejestrowany identyfikator instalacji Firebase lub token rejestracji.

  8. Kliknij Przetestuj.

Gdy klikniesz Test, docelowe urządzenie klienta z aplikacją działającą w tle powinno otrzymać powiadomienie.

Aby uzyskać statystyki dotyczące dostarczania wiadomości do aplikacji, otwórz panel DevOps & Engagement (DevOps i zaangażowanie) > Messaging (Przesyłanie wiadomości) > Reports (Raporty) w konsoli Firebase. Ten panel rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach Apple i urządzeniach z Androidem, a także dane dotyczące „wyświetleń” (powiadomień wyświetlonych użytkownikom) w aplikacjach na Androida.

Interakcja z obsługą

Gdy użytkownicy klikną powiadomienie, domyślnym działaniem na Androidzie i iOS jest otwarcie aplikacji. Jeśli aplikacja została zamknięta, zostanie uruchomiona, a jeśli działa w tle, zostanie przeniesiona na pierwszy plan.

W zależności od treści powiadomienia możesz chcieć obsłużyć interakcję użytkownika po otwarciu aplikacji. Jeśli na przykład nowa wiadomość na czacie zostanie wysłana za pomocą powiadomienia, a użytkownik je wybierze, możesz otworzyć konkretną rozmowę po otwarciu aplikacji.

Pakiet firebase-messaging udostępnia 2 sposoby obsługi tej interakcji:

  1. getInitialMessage(): Jeśli aplikacja zostanie otwarta ze stanu zamknięcia, ta metoda zwraca obiekt Future zawierający obiekt RemoteMessage. Po wykorzystaniu RemoteMessage zostanie usunięty.
  2. onMessageOpenedApp: Stream, który publikuje RemoteMessage, gdy aplikacja jest otwierana ze stanu działania w tle.

Aby zapewnić użytkownikom bezproblemowe działanie, musisz obsłużyć oba scenariusze. Poniższy przykładowy kod pokazuje, jak to zrobić:

class Application extends StatefulWidget {
  @override
  State createState() => _Application();
}

class _Application extends State {
  // In this example, suppose that all messages contain a data field with the key 'type'.
  Future setupInteractedMessage() async {
    // Get any messages which caused the application to open from
    // a terminated state.
    RemoteMessage? initialMessage =
        await FirebaseMessaging.instance.getInitialMessage();

    // If the message also contains a data property with a "type" of "chat",
    // navigate to a chat screen
    if (initialMessage != null) {
      _handleMessage(initialMessage);
    }

    // Also handle any interaction when the app is in the background using a
    // Stream listener
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  }

  void _handleMessage(RemoteMessage message) {
    if (message.data['type'] == 'chat') {
      Navigator.pushNamed(context, '/chat',
        arguments: ChatArguments(message),
      );
    }
  }

  @override
  void initState() {
    super.initState();

    // Run code required to handle interacted messages in an async function
    // as initState() must not be async
    setupInteractedMessage();
  }

  @override
  Widget build(BuildContext context) {
    return Text("...");
  }
}

Sposób obsługi interakcji zależy od konfiguracji. Przedstawiony wcześniej przykład jest podstawowym przykładem użycia StatefulWidget.

Dalsze kroki

Po wykonaniu czynności konfiguracyjnych możesz kontynuować pracę z FCM we Flutterze na kilka sposobów: