Aracılığıyla paylaş


Xamarin.iOS'ta gelişmiş kullanıcı bildirimleri

iOS 10'da yeni olan Kullanıcı Bildirimi çerçevesi, yerel ve uzak bildirimlerin teslimine ve işlenmesine olanak tanır. Bir uygulama veya uygulama uzantısı bu çerçeveyi kullanarak, konum veya günün saati gibi bir dizi koşul belirterek yerel bildirimlerin teslimini zamanlayabilir.

Kullanıcı bildirimleri hakkında

Yeni Kullanıcı Bildirimi çerçevesi, yerel ve uzak bildirimlerin teslimini ve işlenmesini sağlar. Bu çerçeveyi kullanarak bir uygulama veya Uygulama Uzantısı, konum veya günün saati gibi bir dizi koşul belirterek yerel bildirimlerin teslimini zamanlayabilir.

Ayrıca uygulama veya uzantı, kullanıcının iOS cihazına teslim edildikçe hem yerel hem de uzak bildirimleri alabilir (ve değiştirebilir).

Yeni Kullanıcı Bildirimi KULLANıCı Arabirimi çerçevesi, bir uygulamanın veya Uygulama Uzantısının kullanıcıya sunulduğunda hem yerel hem de uzak bildirimlerin görünümünü özelleştirmesine olanak tanır.

Bu çerçeve, bir uygulamanın kullanıcıya bildirim sunabilmesi için aşağıdaki yolları sağlar:

  • Görsel Uyarılar - Bildirimin ekranın üst kısmından başlık olarak indirildiği yer.
  • Ses ve Titreşimler - Bir bildirimle ilişkilendirilebilir.
  • Uygulama Simgesi Kenar Oluşturma - Uygulama simgesinin yeni içeriğin kullanılabilir olduğunu gösteren bir rozet gösterdiği yer. Okunmamış e-posta iletilerinin sayısı gibi.

Ayrıca, kullanıcının geçerli bağlamı bağlı olarak, bildirim sunmanın farklı yolları vardır:

  • Cihazın kilidi açıksa, bildirim ekranın üst kısmından başlık olarak aşağı yuvarlanır.
  • Cihaz kilitliyse, bildirim kullanıcının kilit ekranında görüntülenir.
  • Kullanıcı bir bildirimi kaçırdıysa Bildirim Merkezi'ni açabilir ve kullanılabilir, bekleyen bildirimleri orada görüntüleyebilir.

Xamarin.iOS uygulamasının gönderebileceği iki tür Kullanıcı Bildirimi vardır:

  • Yerel Bildirimler - Bunlar, kullanıcı cihazında yerel olarak yüklenen uygulamalar tarafından gönderilir.
  • Uzak Bildirimler - Uzak bir sunucudan gönderilir ve kullanıcıya sunulur veya uygulama içeriğinin arka plan güncelleştirmesini tetikler.

Daha fazla bilgi için lütfen Gelişmiş Kullanıcı Bildirimleri belgelerimize bakın.

Yeni kullanıcı bildirimi arabirimi

iOS 10'daki Kullanıcı Bildirimleri, Kilit Ekranında, cihazın üst kısmında veya Bildirim Merkezi'nde Başlık, Alt Başlık ve isteğe bağlı Medya Ekleri gibi daha fazla içerik sağlayan yeni bir kullanıcı arabirimi tasarımıyla sunulur.

iOS 10'da bir Kullanıcı Bildirimi nerede görüntülenirse görüntülensin, aynı görünüme ve aynı özelliklere ve işlevlere sahiptir.

iOS 8'de Apple, geliştiricinin Bir Bildirime Özel Eylemler ekleyebileceği ve kullanıcının uygulamayı başlatmak zorunda kalmadan Bildirim üzerinde işlem gerçekleştirmesine izin verdiği Eyleme Dönüştürülebilir Bildirimler'i kullanıma sundu. iOS 9'da Apple, kullanıcının bir Bildirime metin girişiyle yanıt vermesini sağlayan Hızlı Yanıt ile Eyleme Dönüştürülebilir Bildirimleri geliştirdi.

Kullanıcı Bildirimleri, iOS 10'daki kullanıcı deneyiminin daha ayrılmaz bir parçası olduğundan, Apple 3D Touch'ı desteklemek için Eyleme Dönüştürülebilir Bildirimler'i daha da genişletmiştir; burada kullanıcı bildirimle zengin etkileşim sağlamak için bir bildirime basılır ve özel bir kullanıcı arabirimi görüntülenir.

Özel Kullanıcı Bildirimi kullanıcı arabirimi görüntülendiğinde, kullanıcı Bildirime ekli eylemlerle etkileşim kurarsa, özel kullanıcı arabirimi nelerin değiştirildiğine ilişkin geri bildirim sağlamak üzere anında güncelleştirilebilir.

iOS 10'da yeni eklenen Kullanıcı Bildirimi KULLANıCı Arabirimi API'si, Xamarin.iOS uygulamasının bu yeni Kullanıcı Bildirimi kullanıcı arabirimi özelliklerinden kolayca yararlanmasını sağlar.

Medya ekleri ekleme

Kullanıcılar arasında paylaşılan en yaygın öğelerden biri fotoğraflardır, bu nedenle iOS 10, Bildirim içeriğinin geri kalanıyla birlikte kullanıcının kullanımına sunulacağı ve kullanıma sunulacağı bir Medya Öğesi (fotoğraf gibi) ekleme özelliğini doğrudan bir Bildirime ekledi.

Ancak, küçük bir görüntünün bile gönderilmesinde kullanılan boyutlar nedeniyle, bunu Bir Uzaktan Bildirim Yüküne eklemek pratik olmaz. Bu durumu işlemek için geliştirici, iOS 10'daki yeni Hizmet Uzantısı'nı kullanarak görüntüyü başka bir kaynaktan (CloudKit veri deposu gibi) indirebilir ve kullanıcıya görüntülenmeden önce bildirimin içeriğine ekleyebilir.

Uzaktan Bildirimin Bir Hizmet Uzantısı tarafından değiştirilmesi için yükü değiştirilebilir olarak işaretlenmelidir. Örneğin:

{
    aps : {
        alert : "New Photo Available",
        mutable-content: 1
    },
    my-attachment : "https://example.com/photo.jpg"
}

İşlemle ilgili aşağıdaki genel bakışa göz atın:

Medya Ekleri ekleme işlemi

Uzaktan Bildirim cihaza teslim edildikten sonra (APN'ler aracılığıyla), Hizmet Uzantısı istenen herhangi bir yolla (örneğin, ) NSURLSessiongerekli görüntüyü indirebilir ve görüntüyü aldıktan sonra Bildirimin içeriğini değiştirebilir ve kullanıcıya görüntüleyebilir.

Bu işlemin kodda nasıl işleneceğini gösteren bir örnek aşağıda verilmiştir:

using System;
using Foundation;
using UIKit;
using UserNotifications;

namespace MonkeyNotification
{
    public class NotificationService : UNNotificationServiceExtension
    {
        #region Constructors
        public NotificationService (IntPtr handle) : base(handle)
        {
        }
        #endregion

        #region Override Methods
        public override void DidReceiveNotificationRequest (UNNotificationRequest request, Action<UNNotificationContent> contentHandler)
        {
            // Get file URL
            var attachementPath = request.Content.UserInfo.ObjectForKey (new NSString ("my-attachment"));
            var url = new NSUrl (attachementPath.ToString ());

            // Download the file
            var localURL = new NSUrl ("PathToLocalCopy");

            // Create attachment
            var attachmentID = "image";
            var options = new UNNotificationAttachmentOptions ();
            NSError err;
            var attachment = UNNotificationAttachment.FromIdentifier (attachmentID, localURL, options , out err);

            // Modify contents
            var content = request.Content.MutableCopy() as UNMutableNotificationContent;
            content.Attachments = new UNNotificationAttachment [] { attachment };

            // Display notification
            contentHandler (content);
        }

        public override void TimeWillExpire ()
        {
            // Handle service timing out
        }
        #endregion
    }
}

APN'lerden Bildirim alındığında, görüntünün özel adresi içerikten okunur ve dosya sunucudan indirilir. Ardından benzersiz UNNotificationAttachement bir kimlik ve görüntünün yerel konumuyla (olarak) bir NSUrloluşturulur. Bildirim İçeriğinin değiştirilebilir bir kopyası oluşturulur ve Medya Ekleri eklenir. Son olarak Bildirim, çağrılarak contentHandlerkullanıcıya görüntülenir.

Bildirime ek eklendikten sonra, sistem dosyanın hareketini ve yönetimini devralır.

Yukarıda sunulan Uzaktan Bildirimlere ek olarak, Medya Ekleri, İçeriğiyle birlikte oluşturulduğu ve Bildirime eklendiği UNNotificationAttachement Yerel Bildirimler'den de desteklenir.

iOS 10'da bildirim, Görüntü (statik ve GIF), ses veya videonun Medya Eklerini destekler ve bildirim kullanıcıya sunulduğunda sistem bu tür ekler için otomatik olarak doğru özel kullanıcı arabirimini görüntüler.

Not

Sistem, uygulamanın Hizmet Uzantısını çalıştırırken her ikisine de katı sınırlar getirdiğinden, hem medya boyutunu hem de uzak sunucudan medya indirme süresini (veya Yerel Bildirimler için medyayı derlemek için) iyileştirmeye dikkat edilmelidir. Örneğin, bildirimde sunulmak üzere resmin ölçeği azaltılmış bir sürümünü veya küçük bir video klibi göndermeyi göz önünde bulundurun.

Özel kullanıcı arabirimleri oluşturma

Kullanıcı Bildirimleri için özel bir Kullanıcı Arabirimi oluşturmak için geliştiricinin uygulamanın çözümüne bir Bildirim İçeriği Uzantısı (iOS 10'da yeni) eklemesi gerekir.

Bildirim İçeriği Uzantısı, geliştiricinin Bildirim kullanıcı arabirimine kendi görünümlerini eklemesine ve istediği içeriği çizmesine olanak tanır. iOS 12'den başlayarak Bildirim İçeriği Uzantıları düğmeler ve kaydırıcılar gibi etkileşimli kullanıcı arabirimi denetimlerini destekler. Daha fazla bilgi için iOS 12'deki etkileşimli bildirimler belgelerine bakın.

Kullanıcı Bildirimi ile kullanıcı etkileşimini desteklemek için Özel Eylemler oluşturulmalı, sisteme kayıtlı olmalı ve sistemle zamanlanmadan önce Bildirime eklenmelidir. Bu eylemlerin işlenmesini işlemek için Bildirim İçeriği Uzantısı çağrılır. Özel Eylemler hakkında daha fazla ayrıntı için Gelişmiş Kullanıcı Bildirimleri belgesinin Bildirim Eylemleriyle Çalışma bölümüne bakın.

Kullanıcıya Özel kullanıcı arabirimine sahip bir Kullanıcı Bildirimi sunulduğunda, aşağıdaki öğelere sahip olur:

Özel Kullanıcı Arabirimi öğeleriyle Kullanıcı Bildirimi

Kullanıcı Özel Eylemlerle etkileşim kurarsa (Bildirim'in altında sunulur), Kullanıcı Arabirimi kullanıcıya belirli bir eylemi çağırdığında ne olduğu konusunda geri bildirim verecek şekilde güncelleştirilebilir.

Bildirim içeriği uzantısı ekleme

Xamarin.iOS uygulamasında Özel Kullanıcı Bildirimi kullanıcı arabirimi uygulamak için aşağıdakileri yapın:

  1. Uygulamanın çözümünü Mac için Visual Studio açın.

  2. Çözüm Bölmesi'nde Çözüm Adı'na sağ tıklayın ve Yeni Proje Ekle'yi>seçin.

  3. iOS>Uzantıları>Bildirim İçerik Uzantıları'nıseçin ve İleri düğmesine tıklayın:

    Bildirim İçeriği Uzantıları'nı seçin

  4. Uzantı için bir Ad girin ve İleri düğmesine tıklayın:

    Uzantı için bir Ad girin

  5. Gerekirse Proje Adını ve/veya Çözüm Adını ayarlayın ve Oluştur düğmesine tıklayın:

    Proje Adını ve/veya Çözüm Adını Ayarlama

Çözüme Bildirim İçeriği Uzantısı eklendiğinde Uzantının projesinde üç dosya oluşturulur:

  1. NotificationViewController.cs - Bu, Bildirim İçeriği Uzantısı için ana görünüm denetleyicisidir.
  2. MainInterface.storyboard- Geliştiricinin iOS Tasarım Aracı Bildirim İçeriği Uzantısı için görünür kullanıcı arabirimini yerleştirdiği yer.
  3. Info.plist - Bildirim İçeriği Uzantısının yapılandırmasını denetler.

Varsayılan NotificationViewController.cs dosya aşağıdaki gibi görünür:

using System;
using Foundation;
using UIKit;
using UserNotifications;
using UserNotificationsUI;

namespace MonkeyChatNotifyExtension
{
    public partial class NotificationViewController : UIViewController, IUNNotificationContentExtension
    {
        #region Constructors
        protected NotificationViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Do any required interface initialization here.
        }
        #endregion

        #region Public Methods
        [Export ("didReceiveNotification:")]
        public void DidReceiveNotification (UNNotification notification)
        {
            label.Text = notification.Request.Content.Body;

            // Grab content
            var content = notification.Request.Content;

        }
        #endregion
    }
}

Bildirim İçerik Uzantısı'nın DidReceiveNotification özel kullanıcı arabirimini içeriğini doldurabilmesi için Bildirim kullanıcı tarafından genişletildiğinde yöntemi çağrılır UNNotification. Yukarıdaki örnekte, görünüme bir Etiket eklenmiştir, adıyla label koda sunulur ve Bildirimin gövdesini görüntülemek için kullanılır.

Bildirim İçeriği Uzantısının kategorilerini ayarlama

Sistemin, yanıt verdiği belirli kategorilere göre uygulamanın Bildirim İçeriği Uzantısını nasıl bulacağı konusunda bilgilendirilmesi gerekir. Aşağıdakileri yapın:

  1. Düzenlemek üzere açmak için Çözüm Bölmesi'nde Info.plist Uzantının dosyasına çift tıklayın.

  2. Kaynak görünümüne geçin.

  3. NSExtension Anahtarı genişletin.

  4. Anahtarı, Uzantının UNNotificationExtensionCategory ait olduğu kategorinin değeriyle Dize türü olarak ekleyin (bu örnekte 'event-invite):

    UNNotificationExtensionCategory anahtarını ekleme

  5. Değişikliklerinizi kaydedin.

Bildirim İçeriği Uzantısı Kategorileri (UNNotificationExtensionCategory), Bildirim Eylemlerini kaydetmek için kullanılan kategori değerlerini kullanır. Uygulamanın birden çok kategori için aynı kullanıcı arabirimini kullanacağı durumda, dizi türüne geçin UNNotificationExtensionCategory ve gerekli tüm kategorileri sağlayın. Örneğin:

Varsayılan bildirim içeriğini gizleme

Özel Bildirim kullanıcı arabiriminin varsayılan Bildirim ile aynı içeriği görüntüleyeceği durumda (Başlık, Alt Başlık ve Gövde, Bildirim kullanıcı arabiriminin en altında otomatik olarak görüntülenir), anahtara Boole türü olarak eklenerek UNNotificationExtensionDefaultContentHidden uzantının Info.plist dosyasında değeriyle bu varsayılan bilgiler gizlenebilirYES:NSExtensionAttributes

Özel kullanıcı arabirimini tasarlama

Bildirim İçeriği Uzantısı'nın özel kullanıcı arabirimini tasarlamak için, dosyaya çift tıklayarak MainInterface.storyboard dosyayı iOS Tasarım Aracı düzenlemek üzere açın, istediğiniz arabirimi (ve gibi UILabelsUIImageViews) oluşturmak için ihtiyacınız olan öğeleri sürükleyin.

Not

iOS 12 itibarıyla Bildirim İçeriği Uzantısı düğmeler ve metin alanları gibi etkileşimli denetimler içerebilir. Daha fazla bilgi için iOS 12'deki etkileşimli bildirimler belgelerine bakın.

Kullanıcı arabirimi yerleştirildikten ve C# koduna gösterilen gerekli denetimler yapıldıktan sonra, düzenleme için dosyasını açın NotificationViewController.cs ve kullanıcı bildirimi genişlettiğinde DidReceiveNotification kullanıcı arabirimini doldurmak için yöntemini değiştirin. Örneğin:

using System;
using Foundation;
using UIKit;
using UserNotifications;
using UserNotificationsUI;

namespace MonkeyChatNotifyExtension
{
    public partial class NotificationViewController : UIViewController, IUNNotificationContentExtension
    {
        #region Constructors
        protected NotificationViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Do any required interface initialization here.
        }
        #endregion

        #region Public Methods
        [Export ("didReceiveNotification:")]
        public void DidReceiveNotification (UNNotification notification)
        {
            label.Text = notification.Request.Content.Body;

            // Grab content
            var content = notification.Request.Content;

            // Display content in the UILabels
            EventTitle.Text = content.Title;
            EventDate.Text = content.Subtitle;
            EventMessage.Text = content.Body;

            // Get location and display
            var location = content.UserInfo ["location"].ToString ();
            if (location != null) {
                Event.Location.Text = location;
            }

        }
        #endregion
    }
}

İçerik alanı boyutunu ayarlama

Kullanıcıya görüntülenen içerik alanının boyutunu ayarlamak için aşağıdaki kod yöntemindeki ViewDidLoad özelliğini istenen boyuta ayarlıyorPreferredContentSize. Bu boyut, iOS Tasarım Aracı Görünüm'e kısıtlamalar uygulanarak da ayarlanabilir; bunlar için en uygun yöntemi seçmek geliştiriciye bırakılır.

Bildirim İçeriği Uzantısı çağrılmadan önce Bildirim sistemi zaten çalıştığından, içerik alanı tam boyutlu olarak başlar ve kullanıcıya sunulduğunda istenen boyuta kadar animasyonlu olur.

Bu etkiyi Info.plist ortadan kaldırmak için Uzantı dosyasını düzenleyin ve anahtarın NSExtensionAttributesUNNotificationExtensionInitialContentSizeRatio anahtarını Istenen oranı temsil eden bir değerle Sayı yazacak şekilde ayarlayın. Örneğin:

Özel kullanıcı arabiriminde medya eklerini kullanma

Medya Ekleri (yukarıdaki Medya Ekleri Ekleme bölümünde görüldüğü gibi) Bildirim Yükü'ne dahil olduğundan, bunlara varsayılan Bildirim kullanıcı arabiriminde olduğu gibi Bildirim İçeriği Uzantısı'nda erişilebilir ve görüntülenebilir.

Örneğin, yukarıdaki Özel kullanıcı arabiriminde C# koduna açık bir UIImageView kullanıcı arabirimi varsa, bunu Medya Eki ile doldurmak için aşağıdaki kod kullanılabilir:

using System;
using Foundation;
using UIKit;
using UserNotifications;
using UserNotificationsUI;

namespace MonkeyChatNotifyExtension
{
    public partial class NotificationViewController : UIViewController, IUNNotificationContentExtension
    {
        #region Constructors
        protected NotificationViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Do any required interface initialization here.
        }
        #endregion

        #region Public Methods
        [Export ("didReceiveNotification:")]
        public void DidReceiveNotification (UNNotification notification)
        {
            label.Text = notification.Request.Content.Body;

            // Grab content
            var content = notification.Request.Content;

            // Display content in the UILabels
            EventTitle.Text = content.Title;
            EventDate.Text = content.Subtitle;
            EventMessage.Text = content.Body;

            // Get location and display
            var location = content.UserInfo ["location"].ToString ();
            if (location != null) {
                Event.Location.Text = location;
            }

            // Get Media Attachment
            if (content.Attachements.Length > 1) {
                var attachment = content.Attachments [0];
                if (attachment.Url.StartAccessingSecurityScopedResource ()) {
                    EventImage.Image = UIImage.FromFile (attachment.Url.Path);
                    attachment.Url.StopAccessingSecurityScopedResource ();
                }
            }
        }
        #endregion
    }
}

Medya Eki sistem tarafından yönetildiğinden, uygulamanın korumalı alanının dışındadır. Uzantının yöntemini çağırarak sisteme dosyaya erişmek istediğini bildirmesi StartAccessingSecurityScopedResource gerekir. Uzantı dosyayla tamamlandığında, bağlantısını serbest bırakmak için öğesini StopAccessingSecurityScopedResource çağırması gerekir.

Özel kullanıcı arabirimine özel eylemler ekleme

Özel eylem düğmeleri, Özel Bildirim kullanıcı arabirimine etkileşim eklemek için kullanılabilir. Özel eylemler hakkında daha fazla ayrıntı için Gelişmiş Kullanıcı Bildirimleri belgesinin Bildirim Eylemleriyle Çalışma bölümüne bakın.

Bildirim İçeriği Uzantısı, özel eylemlere ek olarak aşağıdaki yerleşik eylemlere de yanıt verebilir:

  • Varsayılan Eylem - Bu, kullanıcının bir bildirime dokunarak uygulamayı açması ve verilen bildirimin ayrıntılarını görüntülemesidir.
  • Eylemi Kapat - Kullanıcı belirli bir bildirimi kapattığında bu eylem uygulamaya gönderilir.

Bildirim İçeriği Uzantıları, kullanıcı Özel Eylemlerden birini çağırdığında kullanıcı Özel Eylemi Kabul Et düğmesine dokunduğunda kabul edilen tarihi gösterme gibi kullanıcı arabirimini de güncelleştirebilme özelliğine sahiptir. Buna ek olarak, Bildirim İçeriği Uzantıları sisteme Bildirim kullanıcı arabiriminin kapatılmasını geciktirerek kullanıcının Bildirim kapatılmadan önce eyleminin etkisini görmesini sağlayabilir.

Bu işlem, yöntemin DidReceiveNotification tamamlama işleyicisi içeren ikinci bir sürümü uygulanarak gerçekleştirilir. Örneğin:

using System;
using Foundation;
using UIKit;
using UserNotifications;
using UserNotificationsUI;
using CoreGraphics;

namespace myApp {
    public class NotificationViewController : UIViewController, UNNotificationContentExtension {

        public override void ViewDidLoad() {
            base.ViewDidLoad();

            // Adjust the size of the content area
            var size = View.Bounds.Size
            PreferredContentSize = new CGSize(size.Width, size.Width/2);
        }

        public void DidReceiveNotification(UNNotification notification) {

            // Grab content
            var content = notification.Request.Content;

            // Display content in the UILabels
            EventTitle.Text = content.Title;
            EventDate.Text = content.Subtitle;
            EventMessage.Text = content.Body;

            // Get location and display
            var location = Content.UserInfo["location"] as string;
            if (location != null) {
                Event.Location.Text = location;
            }

            // Get Media Attachment
            if (content.Attachements.Length > 1) {
                var attachment = content.Attachments[0];
                if (attachment.Url.StartAccessingSecurityScopedResource()) {
                    EventImage.Image = UIImage.FromFile(attachment.Url.Path);
                    attachment.Url.StopAccessingSecurityScopedResource();
                }
            }
        }

        [Export ("didReceiveNotificationResponse:completionHandler:")]
        public void DidReceiveNotification (UNNotificationResponse response, Action<UNNotificationContentExtensionResponseOption> completionHandler)
        {

            // Update UI when the user interacts with the
            // Notification
            Server.PostEventResponse += (response) {
                // Take action based on the response
                switch(response.ActionIdentifier){
                case "accept":
                    EventResponse.Text = "Going!";
                    EventResponse.TextColor = UIColor.Green;
                    break;
                case "decline":
                    EventResponse.Text = "Not Going.";
                    EventResponse.TextColor = UIColor.Red;
                    break;
                }

                // Close Notification
                completionHandler (UNNotificationContentExtensionResponseOption.Dismiss);
            };
        }
    }
}

İşleyiciyi Server.PostEventResponse Bildirim İçeriği Uzantısı yöntemine DidReceiveNotification ekleyerek Uzantının tüm özel eylemleri işlemesi gerekir . Uzantı, öğesini değiştirerek UNNotificationContentExtensionResponseOptionüzerindeki özel eylemleri içeren uygulamaya da iletebilir. Örneğin:

// Close Notification
completionHandler (UNNotificationContentExtensionResponseOption.DismissAndForwardAction);

Özel kullanıcı arabiriminde metin girişi eylemiyle çalışma

Uygulamanın tasarımına ve Bildirim'e bağlı olarak, kullanıcının Bildirime metin girmesini gerektiren zamanlar olabilir (örneğin, bir iletiyi yanıtlama). Bildirim İçeriği Uzantısı, standart bir bildirimde olduğu gibi yerleşik metin girişi eylemine erişebilir.

Örneğin:

using System;
using Foundation;
using UIKit;
using UserNotifications;
using UserNotificationsUI;

namespace MonkeyChatNotifyExtension
{
    public partial class NotificationViewController : UIViewController, IUNNotificationContentExtension
    {
        #region Computed Properties
        // Allow to take input
        public override bool CanBecomeFirstResponder {
            get { return true; }
        }

        // Return the custom created text input view with the
        // required buttons and return here
        public override UIView InputAccessoryView {
            get { return InputView; }
        }
        #endregion

        #region Constructors
        protected NotificationViewController (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Do any required interface initialization here.
        }
        #endregion

        #region Private Methods
        private UNNotificationCategory MakeExtensionCategory ()
        {

            // Create Accept Action
            ...

            // Create decline Action
            ...

            // Create Text Input Action
            var commentID = "comment";
            var commentTitle = "Comment";
            var textInputButtonTitle = "Send";
            var textInputPlaceholder = "Enter comment here...";
            var commentAction = UNTextInputNotificationAction.FromIdentifier (commentID, commentTitle, UNNotificationActionOptions.None, textInputButtonTitle, textInputPlaceholder);

            // Create category
            var categoryID = "event-invite";
            var actions = new UNNotificationAction [] { acceptAction, declineAction, commentAction };
            var intentIDs = new string [] { };
            var category = UNNotificationCategory.FromIdentifier (categoryID, actions, intentIDs, UNNotificationCategoryOptions.None);

            // Return new category
            return category;

        }
        #endregion

        #region Public Methods
        [Export ("didReceiveNotification:")]
        public void DidReceiveNotification (UNNotification notification)
        {
            label.Text = notification.Request.Content.Body;

            // Grab content
            var content = notification.Request.Content;

            // Display content in the UILabels
            EventTitle.Text = content.Title;
            EventDate.Text = content.Subtitle;
            EventMessage.Text = content.Body;

            // Get location and display
            var location = content.UserInfo ["location"].ToString ();
            if (location != null) {
                Event.Location.Text = location;
            }

            // Get Media Attachment
            if (content.Attachements.Length > 1) {
                var attachment = content.Attachments [0];
                if (attachment.Url.StartAccessingSecurityScopedResource ()) {
                    EventImage.Image = UIImage.FromFile (attachment.Url.Path);
                    attachment.Url.StopAccessingSecurityScopedResource ();
                }
            }
        }

        [Export ("didReceiveNotificationResponse:completionHandler:")]
        public void DidReceiveNotification (UNNotificationResponse response, Action<UNNotificationContentExtensionResponseOption> completionHandler)
        {

            // Is text input?
            if (response is UNTextInputNotificationResponse) {
                var textResponse = response as UNTextInputNotificationResponse;
                Server.Send (textResponse.UserText, () => {
                    // Close Notification
                    completionHandler (UNNotificationContentExtensionResponseOption.Dismiss);
                });
            }

            // Update UI when the user interacts with the
            // Notification
            Server.PostEventResponse += (response) {
                // Take action based on the response
                switch (response.ActionIdentifier) {
                case "accept":
                    EventResponse.Text = "Going!";
                    EventResponse.TextColor = UIColor.Green;
                    break;
                case "decline":
                    EventResponse.Text = "Not Going.";
                    EventResponse.TextColor = UIColor.Red;
                    break;
                }

                // Close Notification
                completionHandler (UNNotificationContentExtensionResponseOption.Dismiss);
            };
        }
        #endregion
    }
}

Bu kod yeni bir metin girişi eylemi oluşturur ve uzantının kategorisine () yöntemine MakeExtensionCategoryekler. Geçersiz kılma yönteminde DidReceive , metin giren kullanıcıyı aşağıdaki kodla işler:

// Is text input?
if (response is UNTextInputNotificationResponse) {
    var textResponse = response as UNTextInputNotificationResponse;
    Server.Send (textResponse.UserText, () => {
        // Close Notification
        completionHandler (UNNotificationContentExtensionResponseOption.Dismiss);
    });
}

Tasarım, Metin Giriş Alanı'na özel düğmeler eklemeyi çağırıyorsa, bunları eklemek için aşağıdaki kodu ekleyin:

// Allow to take input
public override bool CanBecomeFirstResponder {
    get {return true;}
}

// Return the custom created text input view with the
// required buttons and return here
public override UIView InputAccessoryView {
    get {return InputView;}
}

Açıklama eylemi kullanıcı tarafından tetiklendiğinde hem görünüm denetleyicisinin hem de özel metin girişi alanının etkinleştirilmesi gerekir:

// Update UI when the user interacts with the
// Notification
Server.PostEventResponse += (response) {
    // Take action based on the response
    switch(response.ActionIdentifier){
    ...
    case "comment":
        BecomeFirstResponder();
        TextField.BecomeFirstResponder();
        break;
    }

    // Close Notification
    completionHandler (UNNotificationContentExtensionResponseOption.Dismiss);

};

Özet

Bu makalede, bir Xamarin.iOS uygulamasında yeni Kullanıcı Bildirimi çerçevesinin kullanımına yönelik gelişmiş bir bakış ele alınmıştır. Hem Yerel hem de Uzak Bildirim'e Medya Ekleri eklemeyi ve özel Bildirim UI'leri oluşturmak için yeni Kullanıcı Bildirimi kullanıcı arabirimini kullanmayı kapsıyor.