Xamarin.Android uygulamanıza anında iletme bildirimleri ekleme

Genel Bakış

Bu öğreticide, Xamarin.Android hızlı başlangıç projesine anında iletme bildirimleri ekleyerek her kayıt eklendiğinde cihaza anında iletme bildirimi gönderilmesini sağlarsınız.

İndirilen hızlı başlangıç sunucusu projesini kullanmıyorsanız, anında iletme bildirimi uzantısı paketine ihtiyacınız olacaktır. Daha fazla bilgi için Bkz. Azure Mobile Apps için .NET arka uç sunucusu SDK'sı ile çalışma kılavuzu.

Önkoşullar

Bu öğretici için kurulum gerekir:

Bildirim Hub'ı yapılandırma

Azure App Service Mobile Apps özelliği, gönderim göndermek için Azure Notification Hubs'ı kullandığından, mobil uygulamanız için bir bildirim hub'ı yapılandıracaksınız.

  1. Azure portalApp Services'e gidin ve uygulamanızın arka ucunu seçin. Ayarlar'ın altında Gönder'i seçin.

  2. Uygulamaya bildirim hub'ı kaynağı eklemek için Bağlan'ı seçin. Hub oluşturabilir veya var olan bir hub'a bağlanabilirsiniz.

    Hub yapılandırma

Artık Mobile Apps arka uç projenize bir bildirim hub'ı bağladınız. Daha sonra bu bildirim hub'sını cihazlara göndermek üzere bir platform bildirim sistemine (PNS) bağlanacak şekilde yapılandıracaksınız.

Firebase Cloud Messaging'i etkinleştirme

  1. Firebase konsolunda oturum açın. Henüz bir tane yoksa yeni bir Firebase projesi oluşturun.

  2. Projenizi oluşturduktan sonra Firebase’i Android uygulamanıza ekleyin’i seçin.

    Firebase’i Android uygulamanıza ekleyin

  3. Android uygulamanıza Firebase ekleme sayfasında aşağıdaki adımları uygulayın:

    1. Android paket adı için uygulamanızın build.gradle dosyasında applicationId değerini kopyalayın. Bu örnekte, şeklindedir com.fabrikam.fcmtutorial1app.

      Paket adını belirtin

    2. Uygulamayı kaydet'i seçin.

  4. Google-services.json dosyasını indir'i seçin, dosyayı projenizin uygulama klasörüne kaydedin ve ardından İleri'yi seçin.

    google-services.json dosyasını indirin

  5. Android Studio'da projenizde aşağıdaki yapılandırma değişikliklerini yapın.

    1. Proje düzeyi build.gradle dosyanızda (<project>/build.gradle), bağımlılıklar bölümüne aşağıdaki deyimi ekleyin.

      classpath 'com.google.gms:google-services:4.0.1'
      
    2. Uygulama düzeyi build.gradle dosyanızda (<project>/<app-module>/build.gradle), bağımlılıklar bölümüne aşağıdaki deyimleri ekleyin.

      implementation 'com.google.firebase:firebase-core:16.0.8'
      implementation 'com.google.firebase:firebase-messaging:17.3.4'
      
    3. Bağımlılıklar bölümünden sonra uygulama düzeyi build.gradle dosyasının sonuna aşağıdaki satırı ekleyin.

      apply plugin: 'com.google.gms.google-services'
      
    4. Araç çubuğunda Şimdi eşitle'yi seçin.

      build.gradle yapılandırma değişiklikleri

  6. İleri’yi seçin.

  7. Bu adımı atla'yı seçin.

    Son adımı atla

  8. Firebase konsolunda projenizin dişli simgesini seçin. Sonra, Proje Ayarları’nı seçin.

    Proje Ayarları’nı seçin

  9. Google-services.json dosyasını Android Studio projenizin uygulama klasörüne indirmediyseniz, bunu bu sayfada yapabilirsiniz.

  10. Üst kısımdaki Bulut Mesajlaşması sekmesine geçin.

  11. Sunucu anahtarını kopyalayıp daha sonra kullanmak üzere kaydedin. Hub'ınızı yapılandırmak için bu değeri kullanırsınız.

Azure'ı anında iletme istekleri gönderecek şekilde yapılandırma

  1. Azure portalTüm>Uygulama Hizmetlerine Gözat'a ve ardından Mobile Apps arka ucuna tıklayın. Ayarlar'ın altında App Service Gönder'e tıklayın ve ardından bildirim hub'ınızın adına tıklayın.

  2. Google'a (GCM) gidin, önceki yordamda Firebase'den aldığınız Sunucu Anahtarı değerini girin ve Kaydet'e tıklayın.

    Portalda API anahtarını ayarlama

Mobile Apps arka ucu artık Firebase Cloud Messaging kullanacak şekilde yapılandırılmıştır. Bu, bildirim hub'ını kullanarak android cihazda çalışan uygulamanıza anında iletme bildirimleri göndermenizi sağlar.

Sunucu projesini anında iletme bildirimleri gönderecek şekilde güncelleştirme

Bu bölümde, mevcut Mobile Apps arka uç projenizdeki kodu her yeni öğe eklendiğinde anında iletme bildirimi gönderecek şekilde güncelleştirin. Bu işlem, platformlar arası gönderimlere olanak tanıyan Azure Notification Hubs'ın şablon özelliğiyle desteklenir. Çeşitli istemciler, şablonlar kullanılarak anında iletme bildirimleri için kaydedilir ve tek bir evrensel gönderim tüm istemci platformlarına ulaşabilir.

Arka uç proje türünüzle eşleşen aşağıdaki yordamlardan birini seçin: .NET arka ucu veya arka uçNode.js.

.NET arka uç projesi

  1. Visual Studio'da sunucu projesine sağ tıklayın. Ardından NuGet Paketlerini Yönet'i seçin. için Microsoft.Azure.NotificationHubsarama yapın ve yükle'yi seçin. Bu işlem, arka uçtan bildirim göndermek için Notification Hubs kitaplığını yükler.

  2. Sunucu projesinde Controllers>TodoItemController.cs dosyasını açın. Ardından aşağıdaki using deyimlerini ekleyin:

    using System.Collections.Generic;
    using Microsoft.Azure.NotificationHubs;
    using Microsoft.Azure.Mobile.Server.Config;
    
  3. PostTodoItem yönteminde InsertAsync çağrısından sonra aşağıdaki kodu ekleyin:

    // Get the settings for the server project.
    HttpConfiguration config = this.Configuration;
    MobileAppSettingsDictionary settings =
        this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
    // Get the Notification Hubs credentials for the mobile app.
    string notificationHubName = settings.NotificationHubName;
    string notificationHubConnection = settings
        .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
    // Create a new Notification Hub client.
    NotificationHubClient hub = NotificationHubClient
    .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
    // Send the message so that all template registrations that contain "messageParam"
    // receive the notifications. This includes APNS, GCM, WNS, and MPNS template registrations.
    Dictionary<string,string> templateParams = new Dictionary<string,string>();
    templateParams["messageParam"] = item.Text + " was added to the list.";
    
    try
    {
        // Send the push notification and log the results.
        var result = await hub.SendTemplateNotificationAsync(templateParams);
    
        // Write the success result to the logs.
        config.Services.GetTraceWriter().Info(result.State.ToString());
    }
    catch (System.Exception ex)
    {
        // Write the failure result to the logs.
        config.Services.GetTraceWriter()
            .Error(ex.Message, null, "Push.SendAsync Error");
    }
    

    Bu işlem, öğeyi içeren bir şablon bildirimi gönderir. Yeni öğe eklendiğinde metin.

  4. Sunucu projesini yeniden yayımlayın.

Arka uç proje Node.js

  1. Arka uç projenizi ayarlayın.

  2. todoitem.js'daki mevcut kodu aşağıdaki kodla değiştirin:

    var azureMobileApps = require('azure-mobile-apps'),
    promises = require('azure-mobile-apps/src/utilities/promises'),
    logger = require('azure-mobile-apps/src/logger');
    
    var table = azureMobileApps.table();
    
    table.insert(function (context) {
    // For more information about the Notification Hubs JavaScript SDK,
    // see https://aka.ms/nodejshubs.
    logger.info('Running TodoItem.insert');
    
    // Define the template payload.
    var payload = '{"messageParam": "' + context.item.text + '" }';  
    
    // Execute the insert. The insert returns the results as a promise.
    // Do the push as a post-execute action within the promise flow.
    return context.execute()
        .then(function (results) {
            // Only do the push if configured.
            if (context.push) {
                // Send a template notification.
                context.push.send(null, payload, function (error) {
                    if (error) {
                        logger.error('Error while sending push notification: ', error);
                    } else {
                        logger.info('Push notification sent successfully!');
                    }
                });
            }
            // Don't forget to return the results from the context.execute().
            return results;
        })
        .catch(function (error) {
            logger.error('Error while running context.execute: ', error);
        });
    });
    
    module.exports = table;  
    

    Bu işlem, yeni bir öğe eklendiğinde item.text dosyasını içeren bir şablon bildirimi gönderir.

  3. Dosyayı yerel bilgisayarınızda düzenlediğinizde, sunucu projesini yeniden yayımlayın.

İstemci projesini anında iletme bildirimleri için yapılandırma

  1. Çözüm görünümünde (veya Visual Studio'da Çözüm Gezgini), Bileşenler klasörüne sağ tıklayın, Daha Fazla Bileşen Al... öğesine tıklayın, Google Cloud Messaging İstemcisi bileşenini arayın ve projeye ekleyin.

  2. ToDoActivity.cs proje dosyasını açın ve sınıfına aşağıdaki using deyimini ekleyin:

    using Gcm.Client;
    
  3. ToDoActivity sınıfına aşağıdaki yeni kodu ekleyin:

    // Create a new instance field for this activity.
    static ToDoActivity instance = new ToDoActivity();
    
    // Return the current activity instance.
    public static ToDoActivity CurrentActivity
    {
        get
        {
            return instance;
        }
    }
    // Return the Mobile Services client.
    public MobileServiceClient CurrentClient
    {
        get
        {
            return client;
        }
    }
    

    Bu, mobil istemci örneğine anında iletme işleyici hizmeti işleminden erişmenizi sağlar.

  4. MobileServiceClient oluşturulduktan sonra OnCreate yöntemine aşağıdaki kodu ekleyin:

    // Set the current instance of TodoActivity.
    instance = this;
    
    // Make sure the GCM client is set up correctly.
    GcmClient.CheckDevice(this);
    GcmClient.CheckManifest(this);
    
    // Register the app for push notifications.
    GcmClient.Register(this, ToDoBroadcastReceiver.senderIDs);
    

ToDoActivity'niz artık anında iletme bildirimleri eklemeye hazır.

Uygulamanıza anında iletme bildirimleri kodu ekleme

  1. Projesinde adlı ToDoBroadcastReceiveryeni bir sınıf oluşturun.

  2. ToDoBroadcastReceiver sınıfına aşağıdaki using deyimlerini ekleyin:

    using Gcm.Client;
    using Microsoft.WindowsAzure.MobileServices;
    using Newtonsoft.Json.Linq;
    
  3. using deyimleri ile ad alanı bildirimi arasına aşağıdaki izin isteklerini ekleyin:

    [assembly: Permission(Name = "@PACKAGE_NAME@.permission.C2D_MESSAGE")]
    [assembly: UsesPermission(Name = "@PACKAGE_NAME@.permission.C2D_MESSAGE")]
    [assembly: UsesPermission(Name = "com.google.android.c2dm.permission.RECEIVE")]
    //GET_ACCOUNTS is only needed for android versions 4.0.3 and below
    [assembly: UsesPermission(Name = "android.permission.GET_ACCOUNTS")]
    [assembly: UsesPermission(Name = "android.permission.INTERNET")]
    [assembly: UsesPermission(Name = "android.permission.WAKE_LOCK")]
    
  4. Mevcut ToDoBroadcastReceiver sınıf tanımını aşağıdakilerle değiştirin:

    [BroadcastReceiver(Permission = Gcm.Client.Constants.PERMISSION_GCM_INTENTS)]
    [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_MESSAGE }, 
        Categories = new string[] { "@PACKAGE_NAME@" })]
    [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_REGISTRATION_CALLBACK }, 
        Categories = new string[] { "@PACKAGE_NAME@" })]
    [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_LIBRARY_RETRY }, 
    Categories = new string[] { "@PACKAGE_NAME@" })]
    public class ToDoBroadcastReceiver : GcmBroadcastReceiverBase<PushHandlerService>
    {
        // Set the Google app ID.
        public static string[] senderIDs = new string[] { "<PROJECT_NUMBER>" };
    }
    

    Yukarıdaki kodda, uygulamanızı Google geliştirici portalında sağladığınızda değerini Google tarafından atanan proje numarasıyla değiştirmeniz <PROJECT_NUMBER> gerekir.

  5. ToDoBroadcastReceiver.cs proje dosyasına PushHandlerService sınıfını tanımlayan aşağıdaki kodu ekleyin:

    // The ServiceAttribute must be applied to the class.
    [Service]
    public class PushHandlerService : GcmServiceBase
    {
        public static string RegistrationID { get; private set; }
        public PushHandlerService() : base(ToDoBroadcastReceiver.senderIDs) { }
    }
    

    Bu sınıfın GcmServiceBase'den türetildiğini ve Service özniteliğinin bu sınıfa uygulanması gerektiğini unutmayın.

    Not

    GcmServiceBase sınıfı OnRegistered(), OnUnRegistered(), OnMessage() ve OnError() yöntemlerini uygular. PushHandlerService sınıfında bu yöntemleri geçersiz kılmanız gerekir.

  6. Aşağıdaki kodu, OnRegistered olay işleyicisini geçersiz kılan PushHandlerService sınıfına ekleyin.

    protected override void OnRegistered(Context context, string registrationId)
    {
        System.Diagnostics.Debug.WriteLine("The device has been registered with GCM.", "Success!");
    
        // Get the MobileServiceClient from the current activity instance.
        MobileServiceClient client = ToDoActivity.CurrentActivity.CurrentClient;
        var push = client.GetPush();
    
        // Define a message body for GCM.
        const string templateBodyGCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    
        // Define the template registration as JSON.
        JObject templates = new JObject();
        templates["genericMessage"] = new JObject
        {
            {"body", templateBodyGCM }
        };
    
        try
        {
            // Make sure we run the registration on the same thread as the activity, 
            // to avoid threading errors.
            ToDoActivity.CurrentActivity.RunOnUiThread(
    
                // Register the template with Notification Hubs.
                async () => await push.RegisterAsync(registrationId, templates));
    
            System.Diagnostics.Debug.WriteLine(
                string.Format("Push Installation Id", push.InstallationId.ToString()));
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(
                string.Format("Error with Azure push registration: {0}", ex.Message));
        }
    }
    

    Bu yöntem, anında iletme bildirimleri için Azure'a kaydolmak için döndürülen GCM kayıt kimliğini kullanır. Etiketler yalnızca oluşturulduktan sonra kayda eklenebilir. Daha fazla bilgi için bkz . Nasıl yapılır: Etiket göndermeyi etkinleştirmek için cihaz yüklemesine etiket ekleme.

  7. PushHandlerService içindeki OnMessage yöntemini aşağıdaki kodla geçersiz kılın:

    protected override void OnMessage(Context context, Intent intent)
    {
        string message = string.Empty;
    
        // Extract the push notification message from the intent.
        if (intent.Extras.ContainsKey("message"))
        {
            message = intent.Extras.Get("message").ToString();
            var title = "New item added:";
    
            // Create a notification manager to send the notification.
            var notificationManager = 
                GetSystemService(Context.NotificationService) as NotificationManager;
    
            // Create a new intent to show the notification in the UI. 
            PendingIntent contentIntent =
                PendingIntent.GetActivity(context, 0,
                new Intent(this, typeof(ToDoActivity)), 0);
    
            // Create the notification using the builder.
            var builder = new Notification.Builder(context);
            builder.SetAutoCancel(true);
            builder.SetContentTitle(title);
            builder.SetContentText(message);
            builder.SetSmallIcon(Resource.Drawable.ic_launcher);
            builder.SetContentIntent(contentIntent);
            var notification = builder.Build();
    
            // Display the notification in the Notifications Area.
            notificationManager.Notify(1, notification);
    
        }
    }
    
  8. OnUnRegistered() ve OnError() yöntemlerini aşağıdaki kodla geçersiz kılın.

    protected override void OnUnRegistered(Context context, string registrationId)
    {
        throw new NotImplementedException();
    }
    
    protected override void OnError(Context context, string errorId)
    {
        System.Diagnostics.Debug.WriteLine(
            string.Format("Error occurred in the notification: {0}.", errorId));
    }
    

Uygulamanızda anında iletme bildirimlerini test etme

Öykünücüde bir sanal cihaz kullanarak uygulamayı test edebilirsiniz. Öykünücüde çalışırken ek yapılandırma adımları gerekir.

  1. Sanal cihazın, Android Sanal Cihaz (AVD) yöneticisinde hedef olarak ayarlanmış Google API'leri olmalıdır.

  2. Uygulama>Ayarları>Hesap ekle'ye tıklayarak Android cihazına bir Google hesabı ekleyin ve ardından istemleri izleyin.

  3. Todolist uygulamasını daha önce olduğu gibi çalıştırın ve yeni bir yapılacaklar öğesi ekleyin. Bu kez, bildirim alanında bir bildirim simgesi görüntülenir. Bildirimin tam metnini görüntülemek için bildirim çekmecesini açabilirsiniz.