Aracılığıyla paylaş


Firebase Cloud Messaging ile Uzaktan Bildirimler

Bu kılavuz, bir Xamarin.Android uygulamasında uzaktan bildirimleri (anında iletme bildirimleri olarak da adlandırılır) uygulamak için Firebase Cloud Messaging'in nasıl kullanılacağına ilişkin adım adım bir açıklama sağlar. Firebase Cloud Messaging (FCM) ile iletişim için gereken çeşitli sınıfların nasıl uygulandığını gösterir, ANDROID Bildirimi'nin FCM'ye erişim için nasıl yapılandırıldığını gösteren örnekler sağlar ve Firebase Konsolu'nu kullanarak aşağı akış mesajlaşmasını gösterir.

FCM bildirimlerine genel bakış

Bu kılavuzda, FCM mesajlaşmasının temellerini göstermek için FCMClient adlı temel bir uygulama oluşturulacaktır. FCMClient , Google Play Hizmetleri'nin olup olmadığını denetler, FCM'den kayıt belirteçleri alır, Firebase Konsolu'ndan gönderdiğiniz uzak bildirimleri görüntüler ve konu iletilerine abone olur:

Uygulamanın örnek ekran görüntüsü

Aşağıdaki konu alanları araştırılacaktır:

  1. Arka Plan Bildirimleri

  2. Konu İletileri

  3. Ön Plan Bildirimleri

Bu kılavuz sırasında FCMClient'a artımlı olarak işlevsellik ekleyecek ve FCM ile nasıl etkileşim kuracağını anlamak için bir cihazda veya öykünücüde çalıştıracaksınız. FCM sunucularıyla canlı uygulama işlemlerine tanık olmak için günlüğü kullanacaksınız ve Firebase Konsol Bildirimleri GUI'sine girdiğiniz FCM iletilerinden bildirimlerin nasıl oluşturulduğunu göreceksiniz.

Gereksinimler

Firebase Cloud Messaging tarafından gönderilebilen farklı ileti türleri hakkında bilgi sahibi olmanız yararlı olacaktır. İletinin yükü, bir istemci uygulamasının iletiyi nasıl alacağını ve işleneceğini belirler.

Bu kılavuza devam etmeden önce Google'ın FCM sunucularını kullanmak için gerekli kimlik bilgilerini almanız gerekir; bu işlem Firebase Cloud Messaging'te açıklanmıştır. Özellikle, bu kılavuzda sunulan örnek kodla kullanmak için google-services.json dosyasını indirmeniz gerekir. Firebase Konsolu'nda henüz bir proje oluşturmadıysanız (veya google-services.json dosyasını henüz indirmediyseniz) bkz. Firebase Cloud Messaging.

Örnek uygulamayı çalıştırmak için Firebase ile uyumluluk sağlayan bir Android test cihazına veya öykünücüye ihtiyacınız olacaktır. Firebase Cloud Messaging, Android 4.0 veya üzeri sürümlerde çalışan istemcileri destekler ve bu cihazlarda da Google Play Store uygulaması yüklü olmalıdır (Google Play Services 9.2.1 veya üzeri gereklidir). Cihazınızda Henüz Google Play Store uygulaması yüklü değilse, indirmek ve yüklemek için Google Play web sitesini ziyaret edin. Alternatif olarak, Android SDK öykünücüsünün test cihazı yerine Google Play Services yüklü olmasını sağlayabilirsiniz (Android SDK öykünücüsü kullanıyorsanız Google Play Store'u yüklemeniz gerekmez).

Uygulama projesi başlatma

Başlamak için FCMClient adlı boş bir Xamarin.Android projesi oluşturun. Xamarin.Android projeleri oluşturmayı bilmiyorsanız bkz . Merhaba, Android. Yeni uygulama oluşturulduktan sonra, sonraki adım paket adını ayarlamak ve FCM ile iletişim için kullanılacak birkaç NuGet paketi yüklemektir.

Paket adını ayarlama

Firebase Cloud Messaging'te FCM özellikli uygulama için bir paket adı belirttiniz. Bu paket adı, API anahtarıyla ilişkili uygulama kimliği olarak da görev alır. Uygulamayı şu paket adını kullanacak şekilde yapılandırın:

  1. FCMClient projesinin özelliklerini açın.

  2. Android Bildirimi sayfasında paket adını ayarlayın.

Aşağıdaki örnekte paket adı olarak com.xamarin.fcmexampleayarlanmıştır:

Paket adını ayarlama

Android Bildirimi'ni güncelleştirirken, iznin etkinleştirildiğinden Internet de emin olun.

Önemli

Bu paket adı Firebase Konsolu'na girilen paket adıyla tam olarak eşleşmiyorsa istemci uygulaması FCM'den kayıt belirteci alamaz.

Xamarin Google Play Services Base paketini ekleme

Firebase Cloud Messaging, Google Play Hizmetleri'ne bağlı olduğundan Xamarin Google Play Services - Temel NuGet paketi Xamarin.Android projesine eklenmelidir. Sürüm 29.0.0.2 veya üzeri gerekir.

  1. Visual Studio'da, Başvurular > NuGet Paketlerini Yönet ... öğesine sağ tıklayın.

  2. Gözat sekmesine tıklayın ve Xamarin.GooglePlayServices.Base'i arayın.

  3. Bu paketi FCMClient projesine yükleyin:

    Google Play Services Base'i yükleme

NuGet yüklemesi sırasında hata alırsanız FCMClient projesini kapatın, yeniden açın ve NuGet yüklemesini yeniden deneyin.

Xamarin.GooglePlayServices.Base'i yüklediğinizde, gerekli tüm bağımlılıklar da yüklenir. MainActivity.cs düzenleyin ve aşağıdaki using deyimi ekleyin:

using Android.Gms.Common;

Bu deyim, Xamarin.GooglePlayServices.Base içindeki sınıfı FCMClient kodu için kullanılabilir hale getirirGoogleApiAvailability. GoogleApiAvailability Google Play Hizmetleri'nin varlığını denetlemek için kullanılır.

Xamarin Firebase Mesajlaşma paketini ekleme

FCM'den ileti almak için Xamarin Firebase - Messaging NuGet paketinin uygulama projesine eklenmesi gerekir. Bu paket olmadan, bir Android uygulaması FCM sunucularından ileti alamaz.

  1. Visual Studio'da, Başvurular > NuGet Paketlerini Yönet ... öğesine sağ tıklayın.

  2. Xamarin.Firebase.Messaging için arama.

  3. Bu paketi FCMClient projesine yükleyin:

    Xamarin Firebase Mesajlaşması Yükleme

Xamarin.Firebase.Messaging yüklediğinizde, gerekli tüm bağımlılıklar da yüklenir.

Ardından, MainActivity.cs düzenleyin ve aşağıdaki using deyimleri ekleyin:

using Firebase.Messaging;
using Firebase.Iid;
using Android.Util;

İlk iki deyim, Xamarin.Firebase.Messaging NuGet paketindeki türleri FCMClient kodu için kullanılabilir hale getirir. Android.Util , FMS ile işlemleri gözlemlemek için kullanılacak günlüğe kaydetme işlevi ekler.

Google Services JSON dosyasını ekleme

Sonraki adım, google-services.json dosyasını projenizin kök dizinine eklemektir:

  1. google-services.json proje klasörüne kopyalayın.

  2. Uygulama projesine google-services.json ekleyin (Çözüm Gezgini Tüm Dosyaları Göster'e tıklayın, google-services.json sağ tıklayın ve ardından Projeye Ekle'yi seçin).

  3. Çözüm Gezgini penceresinde google-services.json öğesini seçin.

  4. Özellikler bölmesinde Derleme Eylemi'ni GoogleServicesJson olarak ayarlayın:

    Derleme eylemini GoogleServicesJson olarak ayarlama

    Not

    GoogleServicesJson derleme eylemi gösterilmiyorsa çözümü kaydedip kapatın ve yeniden açın.

Projeye google-services.json eklendiğinde (ve GoogleServicesJson derleme eylemi ayarlandığında), derleme işlemi istemci kimliğini ve API anahtarını ayıklar ve ardından bu kimlik bilgilerini obj/Debug/android/AndroidManifest.xml konumunda bulunan birleştirilmiş/oluşturulan AndroidManifest.xml ekler. Bu birleştirme işlemi, FCM sunucularına bağlantı için gereken tüm izinleri ve diğer FCM öğelerini otomatik olarak ekler.

Google Play Hizmetleri'ni denetleme ve bildirim kanalı oluşturma

Google, Android uygulamalarının Google Play Services özelliklerine erişmeden önce Google Play Hizmetleri APK'sının varlığını denetlemesini önerir (daha fazla bilgi için bkz . Google Play hizmetlerini denetleme).

İlk olarak uygulamanın kullanıcı arabirimi için bir başlangıç düzeni oluşturulur. Resources/layout/Main.axml dosyasını düzenleyin ve içeriğini aşağıdaki XML ile değiştirin:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp">
    <TextView
        android:text=" "
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/msgText"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:padding="10dp" />
</LinearLayout>

Bu TextView , Google Play Hizmetleri'nin yüklü olup olmadığını belirten iletileri görüntülemek için kullanılır. Main.axml dosyasındaki değişiklikleri kaydedin.

MainActivity.cs düzenleyin ve sınıfına MainActivity aşağıdaki örnek değişkenlerini ekleyin:

public class MainActivity : AppCompatActivity
{
    static readonly string TAG = "MainActivity";

    internal static readonly string CHANNEL_ID = "my_notification_channel";
    internal static readonly int NOTIFICATION_ID = 100;

    TextView msgText;

ve NOTIFICATION_ID değişkenleriCHANNEL_ID, bu kılavuzda daha sonra eklenecek MainActivity yönteminde CreateNotificationChannel kullanılacaktır.

Aşağıdaki örnekte yöntem, OnCreate uygulama FCM hizmetlerini kullanmaya çalışmadan önce Google Play Hizmetleri'nin kullanılabilir olduğunu doğrulayacaktır. MainActivity sınıfına aşağıdaki yöntemi ekleyin:

public bool IsPlayServicesAvailable ()
{
    int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable (this);
    if (resultCode != ConnectionResult.Success)
    {
        if (GoogleApiAvailability.Instance.IsUserResolvableError (resultCode))
            msgText.Text = GoogleApiAvailability.Instance.GetErrorString (resultCode);
        else
        {
            msgText.Text = "This device is not supported";
            Finish ();
        }
        return false;
    }
    else
    {
        msgText.Text = "Google Play Services is available.";
        return true;
    }
}

Bu kod, Google Play Services APK'sının yüklü olup olmadığını görmek için cihazı denetler. Yüklü değilse, kullanıcıdan Google Play Store'dan bir APK indirmesini (veya cihazın sistem ayarlarında etkinleştirmesini) belirten bir ileti görüntülenir TextBox .

Android 8.0 (API düzeyi 26) veya üzerinde çalışan uygulamaların bildirimlerini yayımlamak için bir bildirim kanalı oluşturması gerekir. Bildirim kanalını oluşturacak sınıfına MainActivity aşağıdaki yöntemi ekleyin (gerekirse):

void CreateNotificationChannel()
{
    if (Build.VERSION.SdkInt < BuildVersionCodes.O)
    {
        // Notification channels are new in API 26 (and not a part of the
        // support library). There is no need to create a notification
        // channel on older versions of Android.
        return;
    }

    var channel = new NotificationChannel(CHANNEL_ID,
                                          "FCM Notifications",
                                          NotificationImportance.Default)
                  {

                      Description = "Firebase Cloud Messages appear in this channel"
                  };

    var notificationManager = (NotificationManager)GetSystemService(Android.Content.Context.NotificationService);
    notificationManager.CreateNotificationChannel(channel);
}

OnCreate yöntemini aşağıdaki kod ile değiştirin:

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);
    SetContentView (Resource.Layout.Main);
    msgText = FindViewById<TextView> (Resource.Id.msgText);

    IsPlayServicesAvailable ();

    CreateNotificationChannel();
}

IsPlayServicesAvailable öğesinin sonunda OnCreate çağrılır, böylece uygulama her başlatıldığında Google Play Services denetimi çalıştırılır. Yöntemi CreateNotificationChannel , Android 8 veya üzeri çalıştıran cihazlar için bir bildirim kanalının mevcut olduğundan emin olmak için çağrılır. Uygulamanızın bir OnResume yöntemi varsa, bu yöntem de çağrısı IsPlayServicesAvailable OnResume yapmalıdır. Uygulamayı tamamen yeniden derleyin ve çalıştırın. Her şey düzgün yapılandırıldıysa, aşağıdaki ekran görüntüsüne benzer bir ekran görmeniz gerekir:

Uygulama, Google Play Hizmetleri'nin kullanılabilir olduğunu gösterir

Bu sonucu almazsanız, cihazınızda Google Play Hizmetleri APK'sının yüklü olduğunu doğrulayın (daha fazla bilgi için bkz . Google Play Hizmetlerini Ayarlama). Daha önce açıklandığı gibi FCMClient projenize Xamarin.Google.Play.Services.Base paketini eklediğinizi de doğrulayın.

Örnek kimliği alıcısını ekleme

Sonraki adım Firebase kayıt belirteçlerinin FirebaseInstanceIdService oluşturulmasını, döndürülmesini ve güncelleştirilmesini işleyecek şekilde genişleten bir hizmet eklemektir. FCM'nin FirebaseInstanceIdService cihaza ileti gönderebilmesi için hizmet gereklidir. FirebaseInstanceIdService Hizmet istemci uygulamasına eklendiğinde, uygulama otomatik olarak FCM iletilerini alır ve uygulama arka planlandığında bildirim olarak görüntüler.

Android Bildirimi'nde alıcıyı bildirme

AndroidManifest.xml düzenleyin ve bölümüne aşağıdaki <receiver> öğeleri <application> ekleyin:

<receiver
    android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
    android:exported="false" />
<receiver
    android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="${applicationId}" />
    </intent-filter>
</receiver>

Bu XML aşağıdakileri yapar:

  • Her uygulama FirebaseInstanceIdReceiver örneği için benzersiz bir tanımlayıcı sağlayan bir uygulama bildirir. Bu alıcı ayrıca eylemlerin kimliğini doğrular ve yetkiler.

  • Hizmetleri güvenli bir şekilde başlatmak için kullanılan bir iç FirebaseInstanceIdInternalReceiver uygulama bildirir.

  • Uygulama kimliği, projeye eklenen google-services.json dosyasında depolanır. Xamarin.Android Firebase bağlamaları belirteci ${applicationId} uygulama kimliğiyle değiştirir; uygulama kimliğini sağlamak için istemci uygulaması tarafından ek kod gerekmez.

FirebaseInstanceIdReceiver, ve olaylarını FirebaseInstanceId alan ve FirebaseMessaging bunları öğesinden FirebaseInstanceIdServicetüretdiğiniz sınıfa teslim eden bir WakefulBroadcastReceiver öğedir.

Firebase Örnek Kimliği Hizmetini Uygulama

Uygulamayı FCM'ye kaydetme işi, sağladığınız özel FirebaseInstanceIdService hizmet tarafından işlenir. FirebaseInstanceIdService aşağıdaki adımları gerçekleştirir:

  1. İstemci uygulamasını FCM ve uygulama sunucusuna erişme yetkisi veren güvenlik belirteçleri oluşturmak için Örnek Kimliği API'sini kullanır. Buna karşılık, uygulama FCM'den bir kayıt belirteci alır.

  2. Uygulama sunucusu gerektiriyorsa kayıt belirtecini uygulama sunucusuna iletir.

MyFirebaseIIDService.cs adlı yeni bir dosya ekleyin ve şablon kodunu aşağıdakilerle değiştirin:

using System;
using Android.App;
using Firebase.Iid;
using Android.Util;

namespace FCMClient
{
    [Service]
    [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
    public class MyFirebaseIIDService : FirebaseInstanceIdService
    {
        const string TAG = "MyFirebaseIIDService";
        public override void OnTokenRefresh()
        {
            var refreshedToken = FirebaseInstanceId.Instance.Token;
            Log.Debug(TAG, "Refreshed token: " + refreshedToken);
            SendRegistrationToServer(refreshedToken);
        }
        void SendRegistrationToServer(string token)
        {
            // Add custom implementation, as needed.
        }
    }
}

Bu hizmet, kayıt belirteci ilk oluşturulduğunda veya değiştirildiğinde çağrılan bir OnTokenRefresh yöntem uygular. Çalıştırıldığında OnTokenRefresh özelliğinden FirebaseInstanceId.Instance.Token en son belirteci alır (FCM tarafından zaman uyumsuz olarak güncelleştirilir). Bu örnekte, yenilenen belirteç çıkış penceresinde görüntülenebilmesi için günlüğe kaydedilir:

var refreshedToken = FirebaseInstanceId.Instance.Token;
Log.Debug(TAG, "Refreshed token: " + refreshedToken);

OnTokenRefresh seyrek çağrılır: Aşağıdaki koşullarda belirteci güncelleştirmek için kullanılır:

  • Uygulama yüklendiğinde veya kaldırıldığında.

  • Kullanıcı uygulama verilerini sildiğinde.

  • Uygulama Örnek Kimliğini sildiğinde.

  • Belirtecin güvenliği tehlikeye atıldığında.

Google'ın Örnek Kimliği belgelerine göre FCM Örnek Kimliği hizmeti, uygulamanın belirtecini düzenli aralıklarla (genellikle 6 ayda bir) yenilemesini ister.

OnTokenRefresh ayrıca kullanıcının kayıt belirtecini uygulama tarafından tutulan sunucu tarafı hesabıyla (varsa) ilişkilendirmek için çağrılar SendRegistrationToAppServer da yapılır:

void SendRegistrationToAppServer (string token)
{
    // Add custom implementation here as needed.
}

Bu uygulama uygulama sunucusunun tasarımına bağlı olduğundan, bu örnekte boş bir yöntem gövdesi sağlanır. Uygulama sunucunuz FCM kayıt bilgileri gerektiriyorsa, kullanıcının FCM örnek kimliği belirtecini uygulamanız tarafından tutulan herhangi bir sunucu tarafı hesabıyla ilişkilendirmek için değiştirin SendRegistrationToAppServer . (Belirtecin istemci uygulamasına göre opak olduğunu unutmayın.)

Uygulama sunucusuna bir belirteç gönderildiğinde, SendRegistrationToAppServer belirtecin sunucuya gönderilip gönderilmediğini belirtmek için bir boole değeri tutmalıdır. Bu boole değeri false ise belirteci SendRegistrationToAppServer uygulama sunucusuna gönderir; aksi takdirde, belirteç önceki bir çağrıda uygulama sunucusuna zaten gönderilmiştir. Bazı durumlarda (örneğin, bu FCMClient örnekte), uygulama sunucusunun belirteci gerekmez; bu nedenle bu örnek için bu yöntem gerekli değildir.

İstemci uygulama kodunu uygulama

Alıcı hizmetleri artık var olduğuna göre, bu hizmetlerden yararlanmak için istemci uygulama kodu yazılabilir. Aşağıdaki bölümlerde, kayıt belirtecini günlüğe kaydetmek için kullanıcı arabirimine bir düğme eklenir (Örnek Kimliği belirteci olarak da adlandırılır) ve uygulama bir bildirimden başlatıldığında bilgileri görüntülemek Intent için MainActivity daha fazla kod eklenir:

Uygulama ekranına günlük belirteci düğmesi eklendi

Günlük belirteçleri

Bu adımda eklenen kod yalnızca tanıtım amaçlıdır; üretim istemci uygulamasının kayıt belirteçlerini günlüğe kaydetmesi gerekmez. Resources/layout/Main.axml dosyasını düzenleyin ve öğesinden TextView hemen sonra aşağıdaki Button bildirimi ekleyin:

<Button
  android:id="@+id/logTokenButton"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:text="Log Token" />

Yönteminin sonuna MainActivity.OnCreate aşağıdaki kodu ekleyin:

var logTokenButton = FindViewById<Button>(Resource.Id.logTokenButton);
logTokenButton.Click += delegate {
    Log.Debug(TAG, "InstanceID token: " + FirebaseInstanceId.Instance.Token);
};

Bu kod, Günlük Belirteci düğmesine dokunulduğunda geçerli belirteci çıkış penceresine günlüğe kaydeder.

Bildirim amaçlarını işleme

Kullanıcı FCMClient'dan verilen bir bildirime dokunduğundaIntent, bu bildirim iletisine eşlik eden tüm veriler ek olarak kullanılabilir hale getirilir. MainActivity.cs düzenleyin ve yönteminin en üstüne OnCreate (çağrısından IsPlayServicesAvailableönce) aşağıdaki kodu ekleyin:

if (Intent.Extras != null)
{
    foreach (var key in Intent.Extras.KeySet())
    {
        var value = Intent.Extras.GetString(key);
        Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
    }
}

Kullanıcı bildirim iletisine dokunduğunda uygulamanın başlatıcısı Intent tetiklenir, bu nedenle bu kod çıkış penceresinde eşlik eden tüm verileri Intent günlüğe kaydeder. Farklı Intent bir tetiklenmeliyse, click_action bildirim iletisinin alanı buna Intent ayarlanmalıdır (başlatıcı Intent belirtilmediğinde click_action kullanılır).

Arka plan bildirimleri

FCMClient uygulamasını derleyin ve çalıştırın. Günlük Belirteci düğmesi görüntülenir:

Günlük Belirteci düğmesi görüntülenir

Günlük Belirteci düğmesine dokunun. IDE çıkış penceresinde aşağıdaki gibi bir ileti görüntülenmelidir:

Çıkış penceresinde görüntülenen Örnek Kimliği belirteci

Belirteçle etiketlenmiş uzun dize, Firebase Konsolu'na yapıştıracağınız örnek kimliği belirtecidir; bu dizeyi seçip panoya kopyalayın. Örnek kimliği belirteci görmüyorsanız, google-services.json doğru ayrıştırıldığını doğrulamak için yöntemin en üstüne OnCreate aşağıdaki satırı ekleyin:

Log.Debug(TAG, "google app id: " + GetString(Resource.String.google_app_id));

google_app_id Çıkış penceresine günlüğe kaydedilen değer, google-services.json kaydedilen değerle eşleşmelidirmobilesdk_app_id. google-services.json Resource.String.google_app_id işlenirken msbuild tarafından oluşturulur.

İleti gönderme

Firebase Konsolunda oturum açın, projenizi seçin, Bildirimler'e tıklayın ve İlk İleTİSİnİZİ GÖNDER'e tıklayın:

İlk İletinizi Gönder düğmesi

İleti oluştur sayfasında, ileti metnini girin ve Tek cihaz'ı seçin. IDE çıkış penceresinden örnek kimliği belirtecini kopyalayın ve Firebase Konsolu'nun FCM kayıt belirteci alanına yapıştırın:

İleti oluştur iletişim kutusu

Android cihazında (veya öykünücüde), Android Genel Bakış düğmesine dokunup giriş ekranına dokunarak uygulamanın arka planını oluşturun. Cihaz hazır olduğunda Firebase Konsolu'nda MESAJ GÖNDER'e tıklayın:

İleti gönder düğmesi

İletiyi gözden geçir iletişim kutusu görüntülendiğinde GÖNDER'e tıklayın. Bildirim simgesi cihazın bildirim alanında (veya öykünücüde) görünmelidir:

Bildirim simgesi gösteriliyor

İletiyi görüntülemek için bildirim simgesini açın. Bildirim iletisi, Firebase Konsolu'nun İleti metin alanına tam olarak yazılan ileti olmalıdır:

Cihazda bildirim iletisi görüntülenir

FCMClient uygulamasını başlatmak için bildirim simgesine dokunun. FCMClient'a Intent gönderilen ek öğeler IDE çıkış penceresinde listelenir:

Anahtar, ileti kimliği ve daraltma anahtarından amaç ek listeleri

Bu örnekte from anahtarı uygulamanın Firebase proje numarasına (bu örnekte41590732), collapse_key ise paket adına (com.xamarin.fcmexample) ayarlanır. İleti almazsanız, cihazdaki (veya öykünücüdeki ) FCMClient uygulamasını silmeyi deneyin ve yukarıdaki adımları yineleyin.

Not

Uygulamayı zorla kapatırsanız, FCM bildirimleri teslim etmeyi durdurur. Android, arka plan hizmeti yayınlarının yanlışlıkla veya gereksiz yere durdurulan uygulamaların bileşenlerini başlatmasını engeller. (Bu davranış hakkında daha fazla bilgi için bkz. Durdurulan uygulamalarda denetimleri başlatın.) Bu nedenle, uygulamayı her çalıştırdığınızda el ile kaldırmanız ve hata ayıklama oturumundan durdurmanız gerekir; bu, FCM'yi iletilerin alınmaya devam etmesi için yeni bir belirteç oluşturmaya zorlar.

Özel varsayılan bildirim simgesi ekleme

Önceki örnekte, bildirim simgesi uygulama simgesine ayarlanmıştır. Aşağıdaki XML, bildirimler için özel bir varsayılan simge yapılandırıyor. Android, bildirim simgesinin açıkça ayarlanmadığı tüm bildirim iletileri için bu özel varsayılan simgeyi görüntüler.

Özel bir varsayılan bildirim simgesi eklemek için, simgenizi Resources/drawable dizinine ekleyin, AndroidManifest.xml düzenleyin ve aşağıdaki öğeyi <application> bölümüne ekleyin<meta-data>:

<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />

Bu örnekte Resources/drawable/ic_stat_ic_notification.png konumunda bulunan bildirim simgesi özel varsayılan bildirim simgesi olarak kullanılacaktır. Özel bir varsayılan simge AndroidManifest.xml yapılandırılmamışsa ve bildirim yükünde hiçbir simge ayarlanmadıysa, Android uygulama simgesini bildirim simgesi olarak kullanır (yukarıdaki bildirim simgesi ekran görüntüsünde görüldüğü gibi).

Konu iletilerini işleme

Şimdiye kadar yazılan kod kayıt belirteçlerini işler ve uygulamaya uzaktan bildirim işlevselliği ekler. Sonraki örnek, konu iletilerini dinleyen ve bunları kullanıcıya uzak bildirimler olarak iletir. Konu iletileri, belirli bir konuya abone olan bir veya daha fazla cihaza gönderilen FCM iletileridir. Konu iletileri hakkında daha fazla bilgi için bkz . Konu Mesajlaşması.

Bir konuya abone olma

Resources/layout/Main.axml dosyasını düzenleyin ve önceki Button öğeden hemen sonra aşağıdaki Button bildirimi ekleyin:

<Button
  android:id="@+id/subscribeButton"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:layout_marginTop="20dp"
  android:text="Subscribe to Notifications" />

Bu XML, düzene Bildirime Abone Ol düğmesini ekler. MainActivity.cs düzenleyin ve yönteminin sonuna OnCreate aşağıdaki kodu ekleyin:

var subscribeButton = FindViewById<Button>(Resource.Id.subscribeButton);
subscribeButton.Click += delegate {
    FirebaseMessaging.Instance.SubscribeToTopic("news");
    Log.Debug(TAG, "Subscribed to remote notifications");
};

Bu kod, düzende Bildirime Abone Ol düğmesini bulur ve tıklanma işleyicisini, abone olunan konu başlığını ( haberler) ileten koduna FirebaseMessaging.Instance.SubscribeToTopicatar. Kullanıcı Abone Ol düğmesine dokunduğunda, uygulama haber konusuna abonedir. Aşağıdaki bölümde Firebase Konsol Bildirimleri GUI'sinden bir haber konusu iletisi gönderilecektir.

Konu iletisi gönderme

Uygulamayı kaldırın, yeniden derleyin ve yeniden çalıştırın. Bildirimlere Abone Ol düğmesine tıklayın:

Bildirimlere Abone Ol düğmesi

Uygulama başarıyla abone olduysa, IDE çıkış penceresinde konu eşitlemesinin başarılı olduğunu görmeniz gerekir:

Çıkış penceresi konu eşitleme başarılı iletisini gösterir

Konu iletisi göndermek için aşağıdaki adımları kullanın:

  1. Firebase Konsolu'nda YENİ MESAJ'a tıklayın.

  2. İleti oluştur sayfasında ileti metnini girin ve Konu'ya tıklayın.

  3. Konu açılır menüsünde, yerleşik konu başlığını (haberler) seçin:

    Haber konusunu seçme

  4. Android cihazında (veya öykünücüde), Android Genel Bakış düğmesine dokunup giriş ekranına dokunarak uygulamanın arka planını oluşturun.

  5. Cihaz hazır olduğunda Firebase Konsolu'nda MESAJ GÖNDER'e tıklayın.

  6. Günlük çıkışında /topics/news dosyasını görmek için IDE çıkış penceresini denetleyin:

    /topic/news iletisi gösteriliyor

Bu ileti çıkış penceresinde göründüğünde, bildirim simgesi Android cihazındaki bildirim alanında da görünmelidir. Konu iletisini görüntülemek için bildirim simgesini açın:

Konu iletisi bildirim olarak görüntülenir

İleti almazsanız, cihazdaki (veya öykünücüdeki ) FCMClient uygulamasını silmeyi deneyin ve yukarıdaki adımları yineleyin.

Ön plan bildirimleri

Ön planlı uygulamalarda bildirim almak için uygulamanız FirebaseMessagingServicegerekir. Bu hizmet, veri yüklerini almak ve yukarı akış iletileri göndermek için de gereklidir. Aşağıdaki örneklerde FirebaseMessagingService , genişleten bir hizmetin nasıl uygulanacağı gösterilmektedir; sonuçta elde edilen uygulama ön planda çalışırken uzaktan bildirimleri işleyebilecektir.

FirebaseMessagingService Uygulama

Hizmet, FirebaseMessagingService Firebase'den gelen iletileri almaktan ve işlemekten sorumludur. Her uygulamanın bu türe alt sınıf eklemesi ve gelen iletiyi işlemek için öğesini OnMessageReceived geçersiz kılması gerekir. Bir uygulama ön planda olduğunda, OnMessageReceived geri arama her zaman iletiyi işler.

Not

Uygulamaların yalnızca 10 saniye içinde gelen Firebase Bulut İletisini işlemesi gerekir. Bundan daha uzun süren tüm çalışmalar, Android İş Zamanlayıcı veya Firebase İş Dağıtıcısı gibi bir kitaplık kullanılarak arka plan yürütme için zamanlanmalıdır.

MyFirebaseMessagingService.cs adlı yeni bir dosya ekleyin ve şablon kodunu aşağıdakilerle değiştirin:

using System;
using Android.App;
using Android.Content;
using Android.Media;
using Android.Util;
using Firebase.Messaging;

namespace FCMClient
{
    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
        const string TAG = "MyFirebaseMsgService";
        public override void OnMessageReceived(RemoteMessage message)
        {
            Log.Debug(TAG, "From: " + message.From);
            Log.Debug(TAG, "Notification Message Body: " + message.GetNotification().Body);
        }
    }
}

Yeni FCM iletilerinin MESSAGING_EVENT öğesine yönlendirilmesi için MyFirebaseMessagingServiceamaç filtresinin bildirilmesi gerektiğini unutmayın:

[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]

İstemci uygulaması FCM'den bir ileti aldığında, OnMessageReceived yöntemini çağırarak GetNotification ileti içeriğini geçirilen RemoteMessage nesneden ayıklar. Ardından, ileti içeriğini IDE çıkış penceresinde görüntülenebilmesi için günlüğe kaydeder:

var body = message.GetNotification().Body;
Log.Debug(TAG, "Notification Message Body: " + body);

Not

içinde FirebaseMessagingServicekesme noktaları ayarlarsanız hata ayıklama oturumunuz FCM'nin iletileri nasıl teslim ettiği nedeniyle bu kesme noktalarına isabet edebilir veya olmayabilir.

Başka bir ileti gönder

Uygulamayı kaldırın, yeniden derleyin, yeniden çalıştırın ve başka bir ileti göndermek için şu adımları izleyin:

  1. Firebase Konsolu'nda YENİ MESAJ'a tıklayın.

  2. İleti oluştur sayfasında, ileti metnini girin ve Tek cihaz'ı seçin.

  3. IDE çıkış penceresindeki belirteç dizesini kopyalayın ve daha önce olduğu gibi Firebase Konsolu'nun FCM kayıt belirteci alanına yapıştırın.

  4. Uygulamanın ön planda çalıştığından emin olun, ardından Firebase Konsolu'nda İLETİ GÖNDER'e tıklayın:

    Konsoldan başka bir ileti gönderme

  5. İletiyi gözden geçir iletişim kutusu görüntülendiğinde GÖNDER'e tıklayın.

  6. Gelen ileti IDE çıkış penceresine kaydedilir:

    Çıktı penceresine yazdırılan ileti gövdesi

Yerel bildirim göndereni ekleme

Bu kalan örnekte, gelen FCM iletisi, uygulama ön planda çalışırken başlatılan yerel bir bildirime dönüştürülür. MyFirebaseMessageService.cs düzenleyin ve aşağıdaki using deyimleri ekleyin:

using FCMClient;
using System.Collections.Generic;

aşağıdaki yöntemi içine MyFirebaseMessagingServiceekleyin:

void SendNotification(string messageBody, IDictionary<string, string> data)
{
    var intent = new Intent(this, typeof(MainActivity));
    intent.AddFlags(ActivityFlags.ClearTop);
    foreach (var key in data.Keys)
    {
        intent.PutExtra(key, data[key]);
    }

    var pendingIntent = PendingIntent.GetActivity(this,
                                                  MainActivity.NOTIFICATION_ID,
                                                  intent,
                                                  PendingIntentFlags.OneShot);

    var notificationBuilder = new  NotificationCompat.Builder(this, MainActivity.CHANNEL_ID)
                              .SetSmallIcon(Resource.Drawable.ic_stat_ic_notification)
                              .SetContentTitle("FCM Message")
                              .SetContentText(messageBody)
                              .SetAutoCancel(true)
                              .SetContentIntent(pendingIntent);

    var notificationManager = NotificationManagerCompat.From(this);
    notificationManager.Notify(MainActivity.NOTIFICATION_ID, notificationBuilder.Build());
}

Bu bildirimi arka plan bildirimlerinden ayırmak için, bu kod bildirimleri uygulama simgesinden farklı bir simgeyle işaretler. Dosya ic_stat_ic_notification.png Resources/drawable'a ekleyin ve FCMClient projesine ekleyin.

yöntemi, SendNotification bildirimi oluşturmak için kullanır NotificationCompat.Builder ve NotificationManagerCompat bildirimi başlatmak için kullanılır. Bildirim, kullanıcının uygulamasını açmasına ve içine geçirilen dizenin içeriğini görüntülemesine olanak sağlayan bir PendingIntent barındırıyor messageBody. hakkında NotificationCompat.Builderdaha fazla bilgi için bkz. Yerel Bildirimler.

yönteminin SendNotification sonundaki yöntemini çağırın OnMessageReceived :

public override void OnMessageReceived(RemoteMessage message)
{
    Log.Debug(TAG, "From: " + message.From);

    var body = message.GetNotification().Body;
    Log.Debug(TAG, "Notification Message Body: " + body);
    SendNotification(body, message.Data);
}

Bu değişikliklerin bir sonucu olarak, SendNotification uygulama ön plandayken bir bildirim alındığında çalışır ve bildirim alanında görünür.

Bir uygulama arka planda olduğunda, iletinin yükü iletinin nasıl işleneceğini belirler:

  • Bildirim – iletiler sistem tepsisine gönderilir. Burada yerel bir bildirim görüntülenir. Kullanıcı bildirime dokunduğunda uygulama başlatılır.
  • Veriler – iletiler tarafından OnMessageReceivedişlenir.
  • Her ikisi de – hem bildirim hem de veri yüküne sahip iletiler sistem tepsisine teslim edilir. Uygulama başlatıldığında, veri yükü, uygulamayı başlatmak için kullanılan veri yükü içinde Extras Intent görünür.

Bu örnekte, uygulamanın arka planı varsa, SendNotification iletinin veri yükü varsa çalıştırılır. Aksi takdirde, bir arka plan bildirimi (bu kılavuzda daha önce gösterilmiştir) başlatılır.

Son iletiyi gönderme

Uygulamayı kaldırın, yeniden derleyin, yeniden çalıştırın ve son iletiyi göndermek için aşağıdaki adımları kullanın:

  1. Firebase Konsolu'nda YENİ MESAJ'a tıklayın.

  2. İleti oluştur sayfasında, ileti metnini girin ve Tek cihaz'ı seçin.

  3. IDE çıkış penceresindeki belirteç dizesini kopyalayın ve daha önce olduğu gibi Firebase Konsolu'nun FCM kayıt belirteci alanına yapıştırın.

  4. Uygulamanın ön planda çalıştığından emin olun, ardından Firebase Konsolu'nda İLETİ GÖNDER'e tıklayın:

    Ön plan iletisini gönderme

Bu kez, çıkış penceresinde günlüğe kaydedilen ileti de yeni bir bildirimde paketlenmiş olur; uygulama ön planda çalışırken bildirim simgesi bildirim tepsisinde görünür:

Ön plan iletisi için bildirim simgesi

Bildirimi açtığınızda Firebase Konsol Bildirimleri GUI'sinden gönderilen son iletiyi görmeniz gerekir:

Ön plan simgesiyle gösterilen ön plan bildirimi

FCM bağlantısını kesme

Bir konudan abonelikten çıkmak için FirebaseMessaging sınıfında UnsubscribeFromTopic yöntemini çağırın. Örneğin, daha önce abone olunan haber konusunun aboneliğini kaldırmak için, düzene aşağıdaki işleyici koduyla bir Abonelikten Çık düğmesi eklenebilir:

var unSubscribeButton = FindViewById<Button>(Resource.Id.unsubscribeButton);
unSubscribeButton.Click += delegate {
    FirebaseMessaging.Instance.UnsubscribeFromTopic("news");
    Log.Debug(TAG, "Unsubscribed from remote notifications");
};

Cihazın FCM kaydını tamamen kaldırmak için FirebaseInstanceId sınıfında DeleteInstanceId yöntemini çağırarak örnek kimliğini silin. Örneğin:

FirebaseInstanceId.Instance.DeleteInstanceId();

Bu yöntem çağrısı, örnek kimliğini ve onunla ilişkili verileri siler. Sonuç olarak, FCM verilerinin cihaza düzenli olarak gönderilmesi durduruldu.

Sorun giderme

Aşağıda, Xamarin.Android ile Firebase Cloud Messaging kullanılırken ortaya çıkabilecek sorunlar ve geçici çözümler açıklanmaktadır.

FirebaseApp başlatılmadı

Bazı durumlarda şu hata iletisini görebilirsiniz:

Java.Lang.IllegalStateException: Default FirebaseApp is not initialized in this process
Make sure to call FirebaseApp.initializeApp(Context) first.

Bu, çözümü temizleyip projeyi yeniden oluşturarak (Temiz Çözüm Derle>, Çözümü Yeniden Derle>) geçici olarak çözebileceğiniz bilinen bir sorundur.

Özet

Bu kılavuzda, bir Xamarin.Android uygulamasında Firebase Cloud Messaging uzaktan bildirimlerini uygulama adımları ayrıntılı olarak anlatıldı. FCM iletişimleri için gerekli paketlerin nasıl yükleneceğini ve FCM sunucularına erişim için Android Bildirimi'nin nasıl yapılandırıldığını açıkladı. Google Play Hizmetleri'nin varlığını denetlemeyi gösteren örnek kod sağladı. Kayıt belirteci için FCM ile anlaşma sağlayan bir örnek kimliği dinleyicisi hizmetinin nasıl uygulandığını ve uygulamanın arka planı oluşturulurken bu kodun nasıl arka plan bildirimleri oluşturduğunu açıkladı. Konu iletilerine nasıl abone olunduğunu açıkladı ve uygulama ön planda çalışırken uzak bildirimleri almak ve görüntülemek için kullanılan bir ileti dinleyicisi hizmetinin örnek bir uygulamasını sağladı.