Wprowadzenie do Komunikacji w chmurze Firebase w aplikacjach Flutter

Wybierz platformę: iOS+ Android Sieć Flutter Unity C++


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

W zależności od platformy, na którą kierujesz aplikację, musisz wykonać dodatkowe kroki konfiguracji.

iOS+

Podmiana metody

Aby korzystać z wtyczki FCM Flutter na urządzeniach Apple, wymagana jest podmiana metody. Bez niej kluczowe funkcje Firebase, takie jak FCM obsługa tokenów nie będą działać prawidłowo.

Android

Usługi Google Play

FCM klienci wymagają urządzeń z Androidem w wersji 4.4 lub nowszej, na których są zainstalowane Usługi Google Play, lub emulatora z Androidem 4.4 i interfejsami API Google. Pamiętaj, że nie musisz wdrażać aplikacji na Androida tylko w Sklepie Google Play.

Aplikacje, które korzystają z pakietu SDK Usług Play, powinny zawsze sprawdzać, czy na urządzeniu jest zainstalowany zgodny plik APK Usług Google Play, zanim uzyskają dostęp do funkcji Usług Google Play. Zalecamy, aby robić to w 2 miejscach: w metodzie onCreate() głównej aktywności oraz w metodzie onResume(). Sprawdzenie w metodzie onCreate() zapewnia, że aplikacja nie będzie mogła być używana bez pomyślnego sprawdzenia. Sprawdzenie w metodzie onResume() zapewnia, że jeśli użytkownik wróci do uruchomionej aplikacji w inny sposób, np. za pomocą przycisku Wstecz, sprawdzenie zostanie wykonane.

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

Sieć

Konfigurowanie danych logowania w sieci za pomocą FCM

Interfejs FCM Web używa danych logowania w sieci, zwanych kluczami identyfikacji serwera aplikacji (Voluntary Application Server Identification) lub kluczami „VAPID”, do autoryzowania żądań wysyłania do obsługiwanych usług Web Push. Aby subskrybować aplikację na powiadomienia push, musisz powiązać parę kluczy z projektem w Firebase. Możesz wygenerować nową parę kluczy lub zaimportować istniejącą parę kluczy w Firebase konsoli.

Instalowanie wtyczki FCM

  1. Zainstaluj i zainicjuj wtyczki Firebase dla Flutter jeśli nie masz ich jeszcze.

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

    flutter pub add firebase_messaging
    
  3. Po zakończeniu ponownie skompiluj aplikację Flutter:

    flutter run
    

Uzyskiwanie dostępu do tokena rejestracji

Aby wysłać wiadomość na konkretne urządzenie, musisz znać token rejestracji urządzenia. Aby pobrać token rejestracji instancji aplikacji, wywołaj metodę getToken(). Jeśli nie przyznano zgody na wyświetlanie powiadomień, ta metoda poprosi użytkownika o zgodę na wyświetlanie powiadomień. W przeciwnym razie zwraca token 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...
}

Na platformach internetowych przekaż klucz publiczny VAPID do metody 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 generowany jest token rejestracji FCM, biblioteka przesyła identyfikator i dane konfiguracyjne do Firebase. Jeśli wolisz zapobiegać automatycznemu generowaniu tokenów, wyłącz automatyczną inicjalizację podczas kompilacji.

iOS

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

FirebaseMessagingAutoInitEnabled = NO

Android

W 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 FCM automatycznej inicjalizacji w czasie działania

Aby włączyć automatyczną inicjalizację w przypadku konkretnej instancji aplikacji, wywołaj metodę 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 zgodę na otrzymywanie powiadomień zdalnych.
  2. Upewnij się, że aplikacja działa w tle na urządzeniu.
  3. W konsoli Firebase otwórz stronę Messaging.
  4. Jeśli to Twoja pierwsza wiadomość, kliknij Utwórz pierwszą kampanię.
    1. Kliknij Wiadomości z powiadomieniami Firebase i Utwórz.
  5. W przeciwnym razie na karcie Kampanie kliknij Nowa kampania , a potem Powiadomienia.
  6. Wpisz tekst wiadomości.
  7. W prawym panelu kliknij Wyślij wiadomość testową.
  8. W polu Dodaj token rejestracji wpisz token rejestracji.FCM
  9. Kliknij Przetestuj.

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

Aby uzyskać wgląd w dostarczanie wiadomości do aplikacji, zapoznaj się z panelem raportowania FCM , który rejestruje liczbę wysłanych i otwartych wiadomości na urządzeniach Apple i Android oraz dane o wyświetleniach w przypadku aplikacji na Androida.

Obsługa interakcji

Gdy użytkownicy klikną powiadomienie, domyślnym działaniem zarówno na Androidzie, jak 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ługiwać interakcję użytkownika po otwarciu aplikacji. Jeśli na przykład nowa wiadomość na czacie zostanie wysłana za pomocą powiadomienia, a użytkownik ją wybierze, możesz chcieć otworzyć konkretną rozmowę po otwarciu aplikacji.

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

  1. getInitialMessage(): Jeśli aplikacja zostanie otwarta po zamknięciu, ta metoda zwróci Future zawierający RemoteMessage. Po użyciu RemoteMessage zostanie usunięty.
  2. onMessageOpenedApp: Streamktóry publikuje RemoteMessage, gdy aplikacja zostanie otwarta z działania w tle.

Aby zapewnić użytkownikom płynne działanie, musisz obsługiwać oba te scenariusze. Poniższy przykład kodu 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. Wcześniej pokazany przykład to podstawowy przykład użycia StatefulWidget.

Dalsze kroki

Po wykonaniu kroków konfiguracji możesz przejść do korzystania z FCM w Flutter: