Share via


Notifiche utente avanzate in Xamarin.iOS

Novità di iOS 10, il framework di notifica utente consente il recapito e la gestione delle notifiche locali e remote. Usando questo framework, un'app o un'estensione dell'app può pianificare il recapito delle notifiche locali specificando un set di condizioni, ad esempio la posizione o l'ora del giorno.

Informazioni sulle notifiche utente

Il nuovo framework di notifica utente consente il recapito e la gestione delle notifiche locali e remote. Usando questo framework, un'app o un'estensione dell'app può pianificare il recapito delle notifiche locali specificando un set di condizioni, ad esempio la posizione o l'ora del giorno.

Inoltre, l'app o l'estensione possono ricevere (e potenzialmente modificare) le notifiche locali e remote man mano che vengono recapitate al dispositivo iOS dell'utente.

Il nuovo framework dell'interfaccia utente di notifica utente consente a un'app o all'estensione dell'app di personalizzare l'aspetto delle notifiche locali e remote quando vengono presentate all'utente.

Questo framework fornisce i modi seguenti in cui un'app può recapitare notifiche a un utente:

  • Avvisi visivi: in cui la notifica viene eseguito il roll down dalla parte superiore dello schermo come banner.
  • Audio e vibrazioni : può essere associato a una notifica.
  • Icona dell'app Badging - Dove l'icona dell'app visualizza una notifica che mostra che è disponibile il nuovo contenuto. Ad esempio il numero di messaggi di posta elettronica non letti.

Inoltre, a seconda del contesto corrente dell'utente, esistono diversi modi in cui verrà presentata una notifica:

  • Se il dispositivo è sbloccato, la notifica verrà roll down dalla parte superiore dello schermo come banner.
  • Se il dispositivo è bloccato, la notifica verrà visualizzata nella schermata di blocco dell'utente.
  • Se l'utente ha perso una notifica, può aprire il Centro notifiche e visualizzare eventuali notifiche disponibili in attesa.

Un'app Xamarin.iOS ha due tipi di notifiche utente che è in grado di inviare:

  • Notifiche locali: queste vengono inviate dalle app installate localmente nel dispositivo degli utenti.
  • Notifiche remote: vengono inviate da un server remoto e presentate all'utente o attiva un aggiornamento in background del contenuto dell'app.

Per altre informazioni, vedere la documentazione sulle notifiche utente avanzate.

Nuova interfaccia di notifica utente

Le notifiche utente in iOS 10 vengono presentate con una nuova progettazione dell'interfaccia utente che fornisce più contenuto, ad esempio titolo, sottotitolo e allegati multimediali facoltativi che possono essere presentati nella schermata di blocco, come banner nella parte superiore del dispositivo o nel Centro notifiche.

Indipendentemente dalla posizione in cui viene visualizzata una notifica utente in iOS 10, viene presentato con lo stesso aspetto e con le stesse funzionalità e funzionalità.

In iOS 8 Apple ha introdotto notifiche interattivi in cui lo sviluppatore potrebbe allegare azioni personalizzate a una notifica e consentire all'utente di intervenire su una notifica senza dover avviare l'app. In iOS 9 Apple ha migliorato le notifiche interattive con risposta rapida che consente all'utente di rispondere a una notifica con una voce di testo.

Poiché le notifiche utente sono una parte più integrante dell'esperienza utente in iOS 10, Apple ha ulteriormente ampliato Notifiche interattivi per supportare 3D Touch, in cui l'utente preme su una notifica e viene visualizzata un'interfaccia utente personalizzata per fornire un'interazione avanzata con la notifica.

Quando viene visualizzata l'interfaccia utente di notifica utente personalizzata, se l'utente interagisce con qualsiasi azione collegata alla notifica, l'interfaccia utente personalizzata può essere immediatamente aggiornata per fornire commenti e suggerimenti su ciò che è stato modificato.

Novità di iOS 10, l'API dell'interfaccia utente di notifica utente consente a un'app Xamarin.iOS di sfruttare facilmente queste nuove funzionalità dell'interfaccia utente di notifica utente.

Aggiunta di allegati multimediali

Uno degli elementi più comuni condivisi tra gli utenti è foto, quindi iOS 10 ha aggiunto la possibilità di collegare un elemento multimediale (ad esempio una foto) direttamente a una notifica, in cui verrà presentato e immediatamente disponibile per l'utente insieme al resto del contenuto della notifica.

Tuttavia, a causa delle dimensioni coinvolte nell'invio anche di un'immagine di piccole dimensioni, il collegamento a un payload di notifica remota diventa poco pratico. Per gestire questa situazione, lo sviluppatore può usare la nuova estensione del servizio in iOS 10 per scaricare l'immagine da un'altra origine (ad esempio un archivio dati CloudKit) e allegarla al contenuto della notifica prima che venga visualizzata all'utente.

Affinché una notifica remota venga modificata da un'estensione del servizio, il payload deve essere contrassegnato come modificabile. Ad esempio:

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

Esaminare la panoramica seguente del processo:

Aggiunta del processo allegati multimediali

Dopo che la notifica remota viene recapitata al dispositivo (tramite APN), l'estensione del servizio può quindi scaricare l'immagine richiesta tramite qualsiasi mezzo desiderato (ad esempio un ) NSURLSessione dopo aver ricevuto l'immagine, può modificare il contenuto della notifica e visualizzarlo all'utente.

Di seguito è riportato un esempio di come questo processo può essere gestito nel codice:

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

Quando la notifica viene ricevuta da APN, l'indirizzo personalizzato dell'immagine viene letto dal contenuto e il file viene scaricato dal server. UNNotificationAttachement Viene quindi creato un oggetto con un ID univoco e la posizione locale dell'immagine (come ).NSUrl Viene creata una copia modificabile del contenuto di notifica e vengono aggiunti allegati multimediali. Infine, la notifica viene visualizzata all'utente chiamando .contentHandler

Dopo l'aggiunta di un allegato a una notifica, il sistema acquisisce lo spostamento e la gestione del file.

Oltre alle notifiche remote presentate in precedenza, gli allegati multimediali sono supportati anche dalle notifiche locali, in cui UNNotificationAttachement viene creato e collegato alla notifica insieme al relativo contenuto.

Le notifiche in iOS 10 supportano allegati multimediali di immagini (GIF e statiche), audio o video e il sistema visualizzerà automaticamente l'interfaccia utente personalizzata corretta per ognuno di questi tipi di allegati quando viene presentata all'utente la notifica.

Nota

Prestare attenzione a ottimizzare le dimensioni dei supporti e il tempo necessario per scaricare il supporto dal server remoto (o per assemblare il supporto per le notifiche locali) perché il sistema impone limiti rigorosi sia quando si esegue l'estensione del servizio dell'app. Si consideri, ad esempio, di inviare una versione ridotta dell'immagine o una piccola clip di un video da presentare nella notifica.

Creazione di interfacce utente personalizzate

Per creare un'interfaccia utente personalizzata per le notifiche utente, lo sviluppatore deve aggiungere un'estensione del contenuto di notifica (nuova a iOS 10) alla soluzione dell'app.

L'estensione del contenuto di notifica consente allo sviluppatore di aggiungere le proprie visualizzazioni all'interfaccia utente di notifica e di disegnare qualsiasi contenuto desiderato. A partire da iOS 12, le estensioni del contenuto di notifica supportano controlli interattivi dell'interfaccia utente, ad esempio pulsanti e dispositivi di scorrimento. Per altre informazioni, vedere la documentazione relativa alle notifiche interattive in iOS 12 .

Per supportare l'interazione dell'utente con una notifica utente, è necessario creare azioni personalizzate, registrare il sistema e allegare alla notifica prima che venga pianificata con il sistema. L'estensione del contenuto di notifica verrà chiamata per gestire l'elaborazione di queste azioni. Per altri dettagli sulle azioni personalizzate, vedere la sezione Uso delle azioni di notifica del documento Notifiche utente avanzate.

Quando all'utente viene presentata una notifica utente con un'interfaccia utente personalizzata, l'utente avrà gli elementi seguenti:

Notifica utente con elementi dell'interfaccia utente personalizzati

Se l'utente interagisce con le azioni personalizzate (presentate sotto la notifica), l'interfaccia utente può essere aggiornata per fornire all'utente un feedback come quello che è successo quando ha richiamato una determinata azione.

Aggiunta di un'estensione del contenuto di notifica

Per implementare un'interfaccia utente di notifica utente personalizzata in un'app Xamarin.iOS, eseguire le operazioni seguenti:

  1. Aprire la soluzione dell'app in Visual Studio per Mac.

  2. Fare clic con il pulsante destro del mouse sul nome della soluzione nel riquadro della soluzione e scegliere Aggiungi>nuovo progetto.

  3. Selezionare estensioni per le notifiche delle estensioni> iOS>e fare clic sul pulsante Avanti:

    Selezionare Estensioni contenuto notifica

  4. Immettere un nome per l'estensione e fare clic sul pulsante Avanti :

    Immettere un nome per l'estensione

  5. Modificare il nome del progetto e/o il nome della soluzione, se necessario, e fare clic sul pulsante Crea:

    Modificare il nome del progetto e/o il nome della soluzione

Quando l'estensione del contenuto di notifica viene aggiunta alla soluzione, verranno creati tre file nel progetto dell'estensione:

  1. NotificationViewController.cs - Si tratta del controller di visualizzazione principale per l'estensione del contenuto di notifica.
  2. MainInterface.storyboard - Dove lo sviluppatore dispone l'interfaccia utente visibile per l'estensione del contenuto di notifica nella finestra di progettazione iOS.
  3. Info.plist - Controlla la configurazione dell'estensione del contenuto di notifica.

Il file predefinito NotificationViewController.cs è simile al seguente:

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

Il DidReceiveNotification metodo viene chiamato quando la notifica viene espansa dall'utente in modo che l'estensione del contenuto di notifica possa popolare l'interfaccia utente personalizzata con il contenuto di UNNotification. Per l'esempio precedente, un'etichetta è stata aggiunta alla visualizzazione, esposta al codice con il nome label e viene usata per visualizzare il corpo della notifica.

Impostazione delle categorie dell'estensione del contenuto di notifica

Il sistema deve essere informato su come trovare l'estensione del contenuto di notifica dell'app in base alle categorie specifiche a cui risponde. Effettua le operazioni seguenti:

  1. Fare doppio clic sul file dell'estensione nel riquadro della Info.plistsoluzione per aprirlo per la modifica.

  2. Passare alla visualizzazione Origine.

  3. Espandere il NSExtension tasto .

  4. Aggiungere la chiave come tipo String con il valore della categoria a cui appartiene l'estensione (in questo esempio 'event-invite):Add the UNNotificationExtensionCategory key as type String with the value of the category the Extension belongs to (in questo esempio 'event-invite):

    Aggiungere la chiave UNNotificationExtensionCategory

  5. Salva le modifiche.

Le categorie di estensioni del contenuto di notifica (UNNotificationExtensionCategory) usano gli stessi valori di categoria usati per registrare le azioni di notifica. Nella situazione in cui l'app userà la stessa interfaccia utente per più categorie, passare UNNotificationExtensionCategory al tipo Array e fornire tutte le categorie necessarie. Ad esempio:

Nascondere il contenuto di notifica predefinito

Nella situazione in cui l'interfaccia utente di notifica personalizzata visualizzerà lo stesso contenuto della notifica predefinita (titolo, sottotitolo e corpo visualizzato automaticamente nella parte inferiore dell'interfaccia utente di notifica), queste informazioni predefinite possono essere nascoste aggiungendo la UNNotificationExtensionDefaultContentHidden chiave alla NSExtensionAttributes chiave come tipo Boolean con un valore di YES nel file dell'estensione Info.plist :

Progettazione dell'interfaccia utente personalizzata

Per progettare l'interfaccia utente personalizzata dell'estensione contenuto di notifica, fare doppio clic sul MainInterface.storyboard file per aprirlo per la modifica in Progettazione iOS, trascinare gli elementi necessari per compilare l'interfaccia desiderata, ad esempio UILabels e UIImageViews.

Nota

A partire da iOS 12, un'estensione del contenuto di notifica può includere controlli interattivi, ad esempio pulsanti e campi di testo. Per altre informazioni, vedere la documentazione relativa alle notifiche interattive in iOS 12 .

Dopo che l'interfaccia utente è stata disposta e i controlli necessari esposti al codice C#, aprire per NotificationViewController.cs la modifica e modificare il DidReceiveNotification metodo per popolare l'interfaccia utente quando l'utente espande la notifica. Ad esempio:

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

Impostazione delle dimensioni dell'area del contenuto

Per regolare le dimensioni dell'area di contenuto visualizzata all'utente, il codice seguente imposta la PreferredContentSize proprietà nel ViewDidLoad metodo sulla dimensione desiderata. Questa dimensione può anche essere modificata applicando vincoli alla visualizzazione nella finestra di progettazione iOS, viene lasciata allo sviluppatore di selezionare il metodo che funziona meglio per loro.

Poiché il sistema di notifica è già in esecuzione prima che venga richiamata l'estensione del contenuto di notifica, l'area del contenuto inizierà a ridimensionare completamente e verrà animata fino alle dimensioni richieste quando viene presentata all'utente.

Per eliminare questo effetto, modificare il Info.plist file per l'estensione e impostare la UNNotificationExtensionInitialContentSizeRatio chiave della NSExtensionAttributes chiave su digitare Number con un valore che rappresenta il rapporto desiderato. Ad esempio:

Uso di allegati multimediali nell'interfaccia utente personalizzata

Poiché gli allegati multimediali (come illustrato nella sezione Aggiunta di allegati multimediali sopra) fanno parte del payload di notifica, possono essere accessibili e visualizzati nell'estensione del contenuto di notifica proprio come nell'interfaccia utente di notifica predefinita.

Ad esempio, se l'interfaccia utente personalizzata precedente includeva un UIImageView oggetto esposto al codice C#, è possibile usare il codice seguente per popolarlo da con l'allegato multimediale:

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

Poiché l'allegato multimediale è gestito dal sistema, si trova all'esterno della sandbox dell'app. L'estensione deve informare il sistema che vuole accedere al file chiamando il StartAccessingSecurityScopedResource metodo . Quando l'estensione viene eseguita con il file, deve chiamare per StopAccessingSecurityScopedResource rilasciare la connessione.

Aggiunta di azioni personalizzate a un'interfaccia utente personalizzata

I pulsanti di azione personalizzati possono essere usati per aggiungere interattività a un'interfaccia utente di notifica personalizzata. Per altre informazioni sulle azioni personalizzate, vedere la sezione Uso delle azioni di notifica del documento Notifiche utente avanzate.

Oltre alle azioni personalizzate, l'estensione del contenuto di notifica può rispondere anche alle azioni predefinite seguenti:

  • Azione predefinita: quando l'utente tocca una notifica per aprire l'app e visualizzare i dettagli della notifica specificata.
  • Ignora azione : questa azione viene inviata all'app quando l'utente ignora una determinata notifica.

Le estensioni del contenuto di notifica hanno anche la possibilità di aggiornare l'interfaccia utente quando l'utente richiama una delle azioni personalizzate, ad esempio la visualizzazione di una data come accettata quando l'utente tocca il pulsante Accetta azione personalizzata. Inoltre, le estensioni del contenuto di notifica possono indicare al sistema di ritardare la chiusura dell'interfaccia utente di notifica in modo che l'utente possa visualizzare l'effetto dell'azione prima della chiusura della notifica.

Questa operazione viene eseguita implementando una seconda versione del DidReceiveNotification metodo che include un gestore di completamento. Ad esempio:

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

Aggiungendo il Server.PostEventResponse gestore al DidReceiveNotification metodo dell'estensione del contenuto di notifica, l'estensione deve gestire tutte le azioni personalizzate. L'estensione può anche inoltrare le azioni personalizzate all'app contenitore modificando .UNNotificationContentExtensionResponseOption Ad esempio:

// Close Notification
completionHandler (UNNotificationContentExtensionResponseOption.DismissAndForwardAction);

Uso dell'azione di input di testo nell'interfaccia utente personalizzata

A seconda della progettazione dell'app e della notifica, potrebbe essere necessario che l'utente immetta testo nella notifica, ad esempio la risposta a un messaggio. Un'estensione del contenuto di notifica ha accesso all'azione di input di testo predefinita esattamente come avviee con una notifica standard.

Ad esempio:

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

Questo codice crea una nuova azione di input di testo e la aggiunge alla categoria dell'estensione (nel MakeExtensionCategorymetodo ). DidReceive Nel metodo di override gestisce l'utente immettendo testo con il codice seguente:

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

Se la progettazione chiama per aggiungere pulsanti personalizzati al campo input di testo, aggiungere il codice seguente per includerli:

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

Quando l'azione commento viene attivata dall'utente, è necessario attivare sia il controller di visualizzazione che il campo di input di testo personalizzato:

// 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);

};

Riepilogo

Questo articolo ha esaminato in modo avanzato l'uso del nuovo framework di notifica utente in un'app Xamarin.iOS. Sono stati illustrati l'aggiunta di allegati multimediali sia alla notifica locale che a quella remota e ha illustrato l'uso della nuova interfaccia utente di notifica per creare interfacce utente di notifica personalizzate.