Flutter uygulamalarında Firebase Cloud Messaging'i kullanmaya başlama

Platform seçin: iOS+ Android Web Flutter Unity C++


Bu kılavuzda, mesajları güvenilir bir şekilde gönderebilmek için Flutter istemci uygulamalarınızda Firebase Cloud Messaging kullanmaya nasıl başlayacağınız açıklanmaktadır.

Hedeflediğiniz platforma bağlı olarak, uygulamanız gereken bazı ek kurulum adımları vardır.

iOS+

Yöntem karıştırma

Apple cihazlarda FCM Flutter eklentisini kullanmak için yöntem dönüşümü gereklidir. Bu izin olmadan FCM kayıt işleme gibi önemli Firebase özellikleri düzgün çalışmaz.

Android

Google Play hizmetleri

FCM istemcileri için Android 7.0 veya sonraki sürümlerin yüklü olduğu ve Google Play Hizmetleri'nin de yüklü olduğu cihazlar ya da Google API'leri ile Android 7.0 çalıştıran bir emülatör gerekir. Android uygulamalarınızı yalnızca Google Play Store üzerinden dağıtmak zorunda olmadığınızı unutmayın.

Play Hizmetleri SDK'sını kullanan uygulamalar, Google Play Hizmetleri özelliklerine erişmeden önce her zaman cihazda uyumlu bir Google Play Hizmetleri APK'sı olup olmadığını kontrol etmelidir. Bunu iki yerde yapmanız önerilir: ana etkinliğin onCreate() yönteminde ve onResume() yönteminde. onCreate() uygulamasındaki kontrol, uygulamanın başarılı bir kontrol olmadan kullanılamamasını sağlar. Check-in onResume(), kullanıcı çalışan uygulamaya geri düğmesi gibi başka bir yolla dönerse kontrolün yine de yapılmasını sağlar.

Cihazda Google Play Hizmetleri'nin uyumlu bir sürümü yoksa uygulamanız, kullanıcıların Google Play Hizmetleri'ni Play Store'dan indirmesine olanak tanımak için GoogleApiAvailability.makeGooglePlayServicesAvailable() yöntemini çağırabilir.

Web

FCM ile web kimlik bilgilerini yapılandırma

FCM web arayüzü, desteklenen web push hizmetlerine gönderme isteklerini yetkilendirmek için Gönüllü Uygulama Sunucusu Kimlik Tanımlaması veya "VAPID" anahtarları olarak adlandırılan web kimlik bilgilerini kullanır. Uygulamanızı push bildirimlerine abone yapmak için Firebase projenizle bir anahtar çifti ilişkilendirmeniz gerekir. Firebase konsolu üzerinden yeni bir anahtar çifti oluşturabilir veya mevcut anahtar çiftinizi içe aktarabilirsiniz.

FCM eklentisini yükleyin

  1. Henüz yapmadıysanız Flutter için Firebase eklentilerini yükleyip ilk kullanıma hazırlayın.

  2. Eklentiyi yüklemek için Flutter projenizin kökünden aşağıdaki komutu çalıştırın:

    flutter pub add firebase_messaging
    
  3. İşlem tamamlandıktan sonra Flutter uygulamanızı yeniden oluşturun:

    flutter run
    

Bildirim izni iste

Bir cihaza bildirim mesajı göndermek için register() kullanarak cihazı FCM ile kaydetmeniz gerekir. Bildirim izni verilmemişse bu yöntem, kullanıcıdan bildirim izni ister. Aksi takdirde, işlem başarılı olursa FID'yi onRegistered üzerinden iletir veya bir hata nedeniyle gelecekteki işlemleri reddeder.

// 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...
}

Firebase yükleme kimliğine erişme

Firebase Kurulum Kimliği'ni kullanarak kaydı etkinleştirme

Firebase Kurulum Kimliği (FID) kullanarak uygulama örneğinizi FCM ile kaydetmeyi etkinleştirmek için öncelikle uygulamanızın Android ve Apple platformları için yapılandırmasında FID'leri etkinleştirmeniz gerekir (Web'de statik etkinleştirme yapılandırması gerekmez):

Android

AndroidManifest.xml dosyanızın <application> öğesinin içine aşağıdaki <meta-data> öğesini ekleyin:

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

iOS+

FirebaseMessagingInstallationIdEnabled anahtarını Info.plist dosyanıza ekleyin ve true (YES) olarak ayarlayın:

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

onRegistered akışına abone olma

Belirli bir cihazdaki uygulama örneğinize mesaj göndermek için FCM ile kaydedildikten sonra söz konusu uygulama örneğinin Firebase yükleme kimliğine (FID) ihtiyacınız vardır. FID, onRegistered akışı üzerinden eşzamansız olarak sağlanır.

Android ve Apple platformlarında, otomatik başlatma etkinleştirildiğinde (varsayılan) FCM, başlangıçta uygulama örneğini otomatik olarak kaydeder. Ancak register() için açık bir çağrı yapılması gerekir:

  • Web'de İsteğe bağlı olarak vapidKey ve serviceWorkerScriptPath parametrelerini iletebilirsiniz.
  • Android ve Apple platformlarında otomatik başlatma devre dışı bırakılmışsa veya unregister() çağrıldıktan sonra. Ayrıca, kayıtlı FID ile onRegistered'i tetiklemek için dilediğiniz zaman register() yöntemini çağırabilirsiniz.

Kayıt etkinliği yayınlandığında dinleyicinizin etkin olması için register() çağrısı yapmadan önce her zaman onRegistered öğesine abone olun:

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",
);

onRegistered akışı, aşağıdaki senaryolarda FID'yi yayınlar:

  1. Otomatik başlatma etkinleştirildiğinde Android ve Apple platformlarında ilk uygulama başlatma ve rutin senkronizasyon sırasında otomatik olarak.
  2. Manuel register() çağrısı her tamamlandığında (uygulama örneği zaten kayıtlı olsa bile onRegistered, kayıtlı FID'yi yayınlamaya devam eder).
  3. Firebase yükleme kimliği değişikliği algılandığında ve uygulama FCM ile yeniden kaydedildiğinde veya web'de bir pushsubscriptionchange etkinliği tetiklendiğinde.

Firebase Kurulum Kimliği'ni (FID) aldıktan sonra uygulama sunucunuza gönderin ve tercih ettiğiniz yöntemi kullanarak depolayın.

Kayıt jetonuna erişme (desteği sonlandırıldı)

Belirli bir cihaza mesaj göndermek için cihaz kayıt jetonunu bilmeniz gerekir. Bir uygulama örneğinin kayıt jetonunu almak için getToken() işlevini çağırın. Bildirim izni verilmemişse bu yöntem, kullanıcıdan bildirim izni ister. Aksi takdirde, jeton döndürür veya hata nedeniyle gelecekteki isteği reddeder.

Web platformlarında, VAPID ortak anahtarınızı getToken() yöntemine iletin:

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

Jeton her güncellendiğinde bildirim almak için onTokenRefresh akışına abone olun:

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

Otomatik başlatmayı önleme

FCM kaydı oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Otomatik kaydı önlemeyi tercih ederseniz derleme sırasında otomatik başlatmayı devre dışı bırakın.

Otomatik başlatma devre dışı bırakıldığında, çalışma zamanında register() yöntemini çağırarak uygulama örneğini açıkça kaydedebilirsiniz (Firebase Kurulum Kimliği'ni almak için önce onRegistered yöntemine abone olduğunuzdan emin olun):

await FirebaseMessaging.instance.register();

iOS

iOS'te Info.plist öğenize bir meta veri değeri ekleyin:

FirebaseMessagingAutoInitEnabled = NO

Android

Android'de, aşağıdaki meta veri değerlerini AndroidManifest.xml dosyanıza ekleyerek Analytics veri toplamayı ve FCM otomatik başlatmayı devre dışı bırakın (her ikisini de devre dışı bırakmanız gerekir):

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

Çalışma zamanında FCM otomatik başlatma özelliğini yeniden etkinleştirme

Belirli bir uygulama örneği için otomatik başlatmayı etkinleştirmek üzere setAutoInitEnabled() işlevini çağırın:

await FirebaseMessaging.instance.setAutoInitEnabled(true);

Bu değer, ayarlandıktan sonra uygulama yeniden başlatıldığında da geçerli olur.

Test bildirim mesajı gönderme

  1. Uygulamayı hedef cihaza yükleyip çalıştırın. Apple cihazlarda, uzaktan bildirim alma izni isteğini kabul etmeniz gerekir.

  2. Uygulamanın cihazda arka planda çalıştığından emin olun.

  3. Firebase konsolunda DevOps & Engagement (DevOps ve Etkileşim) > Messaging'e (Mesajlaşma) gidin.

  4. Kampanya oluşturun.

    • Bu ilk mesajınızsa:

      1. İlk kampanyanızı oluşturun'u seçin.

      2. Firebase Notifications'ı ve Oluştur'u seçin.

    • Daha önce kampanya oluşturduysanız:

      1. Kampanyalar sekmesinde Yeni kampanya'yı seçin.

      2. Bildirimler'i tıklayın.

  5. Mesaj metnini girin.

  6. Sağ bölmeden Test mesajı gönder'i seçin.

  7. Firebase Kurulum Kimliği veya FCM kayıt jetonu ekleyin etiketli alana kayıtlı Firebase Kurulum Kimliğinizi veya kayıt jetonunuzu girin.

  8. Test et'i seçin.

Test'i seçtikten sonra, uygulamanın arka planda olduğu hedef istemci cihaz bildirimi alır.

Uygulamanıza mesaj teslimiyle ilgili bilgi edinmek için Firebase konsolunda DevOps & Engagement (DevOps ve Etkileşim) > Messaging (Mesajlaşma) > Reports (Raporlar) kontrol paneline gidin. Bu kontrol panelinde, Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısı ile Android uygulamaları için "gösterim" (kullanıcılar tarafından görülen bildirimler) verileri kaydedilir.

Etkileşimi işleme

Kullanıcılar bir bildirime dokunduğunda hem Android hem de iOS'te uygulama açılır. Uygulama sonlandırılırsa başlatılır, arka planda ise ön plana getirilir.

Bildirimin içeriğine bağlı olarak, uygulama açıldığında kullanıcının etkileşimini yönetmek isteyebilirsiniz. Örneğin, bildirim kullanılarak yeni bir sohbet mesajı gönderilirse ve kullanıcı bunu seçerse uygulama açıldığında söz konusu görüşmeyi açmak isteyebilirsiniz.

firebase-messaging paketi, bu etkileşimi yönetmek için iki yöntem sunar:

  1. getInitialMessage(): Uygulama sonlandırılmış bir durumdan açılırsa bu yöntem, RemoteMessage içeren bir Future döndürür. Kullanıldıktan sonra RemoteMessage kaldırılır.
  2. onMessageOpenedApp: Uygulama arka plan durumundan açıldığında RemoteMessage yayınlayan bir Stream.

Kullanıcılarınızın sorunsuz bir deneyim yaşamasını sağlamak için her iki senaryoyu da ele almanız gerekir. Aşağıdaki kod örneğinde bunun nasıl yapılabileceği açıklanmaktadır:

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("...");
  }
}

Etkileşimi nasıl ele alacağınız kurulumunuza bağlıdır. Daha önce gösterilen örnek, StatefulWidget kullanımına dair temel bir örnektir.

Sonraki adımlar

Kurulum adımlarını tamamladıktan sonra Flutter için FCM ile devam etmek üzere kullanabileceğiniz birkaç seçenek vardır: