Erweiterte Benutzerbenachrichtigungen in Xamarin.iOS

Das Benutzerbenachrichtigungsframework ist neu in iOS 10 und ermöglicht die Übermittlung und Verarbeitung von lokalen und Remotebenachrichtigungen. Mithilfe dieses Frameworks kann eine App oder App-Erweiterung die Übermittlung lokaler Benachrichtigungen planen, indem eine Reihe von Bedingungen angegeben wird, z. B. Standort oder Tageszeit.

Informationen zu Benutzerbenachrichtigungen

Das neue Benutzerbenachrichtigungsframework ermöglicht die Übermittlung und Verarbeitung von lokalen und Remotebenachrichtigungen. Mithilfe dieses Frameworks kann eine App oder App-Erweiterung die Übermittlung lokaler Benachrichtigungen planen, indem eine Reihe von Bedingungen angegeben wird, z. B. Standort oder Tageszeit.

Darüber hinaus kann die App oder Erweiterung sowohl lokale als auch Remotebenachrichtigungen empfangen (und möglicherweise ändern), wenn sie an das iOS-Gerät des Benutzers übermittelt werden.

Das neue Benutzerbenachrichtigungs-Benutzeroberflächenframework ermöglicht es einer App oder App-Erweiterung, die Darstellung von lokalen und Remotebenachrichtigungen anzupassen, wenn sie dem Benutzer angezeigt werden.

Dieses Framework bietet die folgenden Möglichkeiten, wie eine App Benachrichtigungen an einen Benutzer übermitteln kann:

  • Visuelle Warnungen : Hier wird ein Rolldown der Benachrichtigung vom oberen Bildschirmrand als Banner ausgeführt.
  • Sound und Vibrationen : Kann einer Benachrichtigung zugeordnet werden.
  • App-Symbol badging : Das Symbol der App zeigt ein Signal an, das anzeigt, dass neue Inhalte verfügbar sind. Beispielsweise die Anzahl der ungelesenen E-Mail-Nachrichten.

Darüber hinaus gibt es je nach aktuellem Kontext des Benutzers verschiedene Möglichkeiten, wie eine Benachrichtigung angezeigt wird:

  • Wenn das Gerät entsperrt ist, wird die Benachrichtigung als Banner vom oberen Bildschirmrand heruntergerollt.
  • Wenn das Gerät gesperrt ist, wird die Benachrichtigung auf dem Sperrbildschirm des Benutzers angezeigt.
  • Wenn der Benutzer eine Benachrichtigung verpasst hat, kann er das Benachrichtigungscenter öffnen und dort alle verfügbaren, wartende Benachrichtigungen anzeigen.

Eine Xamarin.iOS-App verfügt über zwei Arten von Benutzerbenachrichtigungen, die sie senden kann:

  • Lokale Benachrichtigungen : Diese werden von Apps gesendet, die lokal auf dem Benutzergerät installiert sind.
  • Remotebenachrichtigungen : Werden von einem Remoteserver gesendet und entweder dem Benutzer angezeigt oder lösen eine Hintergrundaktualisierung des App-Inhalts aus.

Weitere Informationen finden Sie in der Dokumentation zu erweiterten Benutzerbenachrichtigungen .

Die neue Benutzeroberfläche für Benachrichtigungen

Benutzerbenachrichtigungen in iOS 10 werden mit einem neuen Ui-Design präsentiert, das mehr Inhalte wie titel, Untertitel und optionale Medienanlagen bereitstellt, die auf dem Sperrbildschirm, als Banner am oberen Rand des Geräts oder im Info-Center angezeigt werden können.

Unabhängig davon, wo eine Benutzerbenachrichtigung in iOS 10 angezeigt wird, wird sie mit dem gleichen Aussehen und Verhalten und mit den gleichen Funktionen und Funktionen angezeigt.

In iOS 8 hat Apple aktionenfähige Benachrichtigungen eingeführt, bei denen entwickler benutzerdefinierte Aktionen an eine Benachrichtigung anfügen und es dem Benutzer ermöglichen können, Aktionen für eine Benachrichtigung zu ergreifen, ohne die App starten zu müssen. In iOS 9 hat Apple aktionenfähige Benachrichtigungen mit schneller Antwort verbessert, die es dem Benutzer ermöglicht, auf eine Benachrichtigung mit Texteingabe zu reagieren.

Da Benutzerbenachrichtigungen in iOS 10 integraler Bestandteil der Benutzererfahrung sind, hat Apple aktionenfähige Benachrichtigungen weiter erweitert, um 3D Touch zu unterstützen, bei dem der Benutzer auf eine Benachrichtigung klickt und eine benutzerdefinierte Benutzeroberfläche angezeigt wird, um eine umfassende Interaktion mit der Benachrichtigung zu ermöglichen.

Wenn die benutzerdefinierte Benutzeroberfläche für Benutzerbenachrichtigungen angezeigt wird und der Benutzer mit aktionen interagiert, die an die Benachrichtigung angefügt sind, kann die benutzerdefinierte Benutzeroberfläche sofort aktualisiert werden, um Feedback zu den Änderungen zu geben.

Neu in iOS 10, ermöglicht die Benutzerbenachrichtigungs-UI-API einer Xamarin.iOS-App das einfache Nutzen dieser neuen Benutzerbenachrichtigungs-UI-Features.

Hinzufügen von Medienanlagen

Eines der häufigsten Elemente, die von Benutzern freigegeben werden, sind Fotos. Daher hat iOS 10 die Möglichkeit hinzugefügt, ein Medienelement (z. B. ein Foto) direkt an eine Benachrichtigung anzufügen, wo es angezeigt und dem Benutzer zusammen mit dem restlichen Inhalt der Benachrichtigung zur Verfügung gestellt wird.

Aufgrund der Größe, die mit dem Senden eines kleinen Bilds verbunden ist, ist das Anfügen an eine Remotebenachrichtigungsnutzlast jedoch unpraktisch. Um diese Situation zu bewältigen, kann der Entwickler die neue Diensterweiterung in iOS 10 verwenden, um das Image aus einer anderen Quelle (z. B. einem CloudKit-Datenspeicher) herunterzuladen und es an den Inhalt der Benachrichtigung anzufügen, bevor es dem Benutzer angezeigt wird.

Damit eine Remotebenachrichtigung von einer Diensterweiterung geändert werden kann, muss deren Nutzlast als veränderlich gekennzeichnet werden. Beispiel:

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

Sehen Sie sich die folgende Übersicht über den Prozess an:

Hinzufügen von Medienanlagenprozess

Sobald die Remotebenachrichtigung an das Gerät übermittelt wurde (über APNs), kann die Diensterweiterung das erforderliche Bild auf beliebige Weise herunterladen (z. B. ein NSURLSession), und nachdem sie das Bild empfangen hat, kann sie den Inhalt der Benachrichtigung ändern und es dem Benutzer anzeigen.

Im Folgenden finden Sie ein Beispiel dafür, wie dieser Prozess im Code behandelt werden kann:

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

Wenn die Benachrichtigung von APNs empfangen wird, wird die benutzerdefinierte Adresse des Images aus dem Inhalt gelesen, und die Datei wird vom Server heruntergeladen. Anschließend wird ein UNNotificationAttachement mit einer eindeutigen ID und dem lokalen Speicherort des Images (als NSUrl) erstellt. Es wird eine veränderliche Kopie des Benachrichtigungsinhalts erstellt, und Medienanlagen werden hinzugefügt. Schließlich wird die Benachrichtigung dem Benutzer durch Aufrufen von contentHandlerangezeigt.

Nachdem einer Benachrichtigung eine Anlage hinzugefügt wurde, übernimmt das System die Verschiebung und Verwaltung der Datei.

Zusätzlich zu den oben dargestellten Remotebenachrichtigungen werden Medienanlagen auch von lokalen Benachrichtigungen unterstützt, bei denen erstellt UNNotificationAttachement und zusammen mit dem Inhalt an die Benachrichtigung angefügt wird.

Benachrichtigungen in iOS 10 unterstützen Medienanlagen von Bildern (statisch und GIFs), Audio oder Video, und das System zeigt automatisch die richtige benutzerdefinierte Benutzeroberfläche für jede dieser Arten von Anlagen an, wenn die Benachrichtigung dem Benutzer angezeigt wird.

Hinweis

Es sollte darauf geachtet werden, sowohl die Mediengröße als auch die Zeit zu optimieren, die zum Herunterladen der Medien vom Remoteserver benötigt wird (oder um die Medien für lokale Benachrichtigungen zusammenzustellen), da das System beim Ausführen der Diensterweiterung der App strenge Grenzwerte festlegt. Sie können beispielsweise eine herunterskalierte Version des Bilds oder einen kleinen Clip eines Videos senden, das in der Benachrichtigung dargestellt werden soll.

Erstellen benutzerdefinierter Benutzeroberflächen

Um eine benutzerdefinierte Benutzeroberfläche für die Benutzerbenachrichtigungen zu erstellen, muss der Entwickler der App-Lösung eine Benachrichtigungsinhaltserweiterung (neu in iOS 10) hinzufügen.

Die Benachrichtigungsinhaltserweiterung ermöglicht es entwicklern, der Benutzeroberfläche für Benachrichtigungen eigene Ansichten hinzuzufügen und alle gewünschten Inhalte zu zeichnen. Ab iOS 12 unterstützen Benachrichtigungsinhaltserweiterungen interaktive Ui-Steuerelemente wie Schaltflächen und Schieberegler. Weitere Informationen finden Sie in der Dokumentation zu interaktiven Benachrichtigungen in iOS 12 .

Zur Unterstützung der Benutzerinteraktion mit einer Benutzerbenachrichtigung sollten benutzerdefinierte Aktionen erstellt, beim System registriert und an die Benachrichtigung angefügt werden, bevor sie mit dem System geplant wird. Die Benachrichtigungsinhaltserweiterung wird aufgerufen, um die Verarbeitung dieser Aktionen zu verarbeiten. Weitere Informationen zu benutzerdefinierten Aktionen finden Sie im Abschnitt Arbeiten mit Benachrichtigungsaktionen des Dokuments Erweiterte Benutzerbenachrichtigungen .

Wenn dem Benutzer eine Benutzerbenachrichtigung mit einer benutzerdefinierten Benutzeroberfläche angezeigt wird, enthält sie die folgenden Elemente:

Eine Benutzerbenachrichtigung mit benutzerdefinierten UI-Elementen

Wenn der Benutzer mit den benutzerdefinierten Aktionen interagiert (die unterhalb der Benachrichtigung angezeigt werden), kann die Benutzeroberfläche aktualisiert werden, um dem Benutzer Feedback zu geben, was passiert ist, als er eine bestimmte Aktion aufgerufen hat.

Hinzufügen einer Benachrichtigungsinhaltserweiterung

Gehen Sie wie folgt vor, um eine benutzerdefinierte Benutzerbenachrichtigungsbenutzeroberfläche in einer Xamarin.iOS-App zu implementieren:

  1. Öffnen Sie die Lösung der App in Visual Studio für Mac.

  2. Klicken Sie im Projektmappenpad mit der rechten Maustaste auf den Projektmappennamen, und wählen SieAdd New Project (Neues Projekt hinzufügen>) aus.

  3. Wählen SieBenachrichtigungsinhaltserweiterungen für iOS-Erweiterungen>> aus, und klicken Sie auf die Schaltfläche Weiter:

    Wählen Sie Benachrichtigungsinhaltserweiterungen aus.

  4. Geben Sie einen Namen für die Erweiterung ein, und klicken Sie auf die Schaltfläche Weiter :

    Geben Sie einen Namen für die Erweiterung ein.

  5. Passen Sie den Projektnamen und/oder projektmappennamen bei Bedarf an, und klicken Sie auf die Schaltfläche Erstellen :

    Anpassen des Projektnamens und/oder des Projektmappennamens

Wenn der Projektmappe die Benachrichtigungsinhaltserweiterung hinzugefügt wird, werden drei Dateien im Projekt der Erweiterung erstellt:

  1. NotificationViewController.cs– Dies ist der Standard Ansichtscontroller für die Benachrichtigungsinhaltserweiterung.
  2. MainInterface.storyboard– Hier legt der Entwickler die sichtbare Benutzeroberfläche für die Benachrichtigungsinhaltserweiterung im iOS-Designer bereit.
  3. Info.plist – Steuert die Konfiguration der Benachrichtigungsinhaltserweiterung.

Die Standarddatei NotificationViewController.cs sieht wie folgt aus:

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

Die DidReceiveNotification -Methode wird aufgerufen, wenn die Benachrichtigung vom Benutzer erweitert wird, sodass die Benachrichtigungsinhaltserweiterung die benutzerdefinierte Benutzeroberfläche mit dem Inhalt des auffüllen UNNotificationkann. Im obigen Beispiel wurde der Ansicht eine Bezeichnung hinzugefügt, die code mit dem Namen label verfügbar gemacht wird und zum Anzeigen des Textkörpers der Benachrichtigung verwendet wird.

Festlegen der Kategorien der Benachrichtigungsinhaltserweiterung

Das System muss darüber informiert werden, wie die Benachrichtigungsinhaltserweiterung der App basierend auf den spezifischen Kategorien gefunden werden kann, auf die es antwortet. Gehen Sie folgendermaßen vor:

  1. Doppelklicken Sie im ProjektmappenpadInfo.plist auf die Datei der Erweiterung, um sie zur Bearbeitung zu öffnen.

  2. Wechseln Sie zur Ansicht Quelle.

  3. Erweitern Sie den NSExtension Schlüssel.

  4. Fügen Sie den UNNotificationExtensionCategory Schlüssel als Typ String mit dem Wert der Kategorie hinzu, zu der die Erweiterung gehört (in diesem Beispiel "event-invite):

    Hinzufügen des UNNotificationExtensionCategory-Schlüssels

  5. Speichern Sie die Änderungen.

Benachrichtigungsinhaltserweiterungskategorien (UNNotificationExtensionCategory) verwenden dieselben Kategoriewerte, die zum Registrieren von Benachrichtigungsaktionen verwendet werden. Wenn die App dieselbe Benutzeroberfläche für mehrere Kategorien verwendet, wechseln Sie UNNotificationExtensionCategory zum Typ Array , und geben Sie alle erforderlichen Kategorien an. Beispiel:

Ausblenden des Standardbenachrichtigungsinhalts

In der Situation, in der die benutzerdefinierte Benachrichtigungsbenutzeroberfläche denselben Inhalt wie die Standardbenachrichtigung (Titel, Untertitel und Text automatisch am unteren Rand der Benachrichtigungsbenutzeroberfläche Info.plist angezeigt) anzeigt, können diese Standardinformationen ausgeblendet werden, indem Sie dem NSExtensionAttributes Schlüssel den UNNotificationExtensionDefaultContentHidden Wert Boolean mit dem Wert in YES der Datei der Erweiterung hinzufügen:

Entwerfen der benutzerdefinierten Benutzeroberfläche

Um die benutzerdefinierte Benutzeroberfläche der Benachrichtigungsinhaltserweiterung zu entwerfen, doppelklicken Sie auf die MainInterface.storyboard Datei, um sie für die Bearbeitung in der iOS-Designer zu öffnen. Ziehen Sie die Elemente ein, die Sie zum Erstellen der gewünschten Schnittstelle benötigen (zUILabels. B. und UIImageViews).

Hinweis

Ab iOS 12 kann eine Benachrichtigungsinhaltserweiterung interaktive Steuerelemente wie Schaltflächen und Textfelder enthalten. Weitere Informationen finden Sie in der Dokumentation zu interaktiven Benachrichtigungen in iOS 12 .

Nachdem die Benutzeroberfläche erstellt wurde und die erforderlichen Steuerelemente für C#-Code verfügbar gemacht wurden, öffnen Sie die für die NotificationViewController.cs Bearbeitung, und ändern Sie die Methode, um die DidReceiveNotification Benutzeroberfläche aufzufüllen, wenn der Benutzer die Benachrichtigung erweitert. Beispiel:

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

Festlegen der Inhaltsbereichsgröße

Um die Größe des dem Benutzer angezeigten Inhaltsbereichs anzupassen, legt der folgende Code die PreferredContentSize Eigenschaft in der ViewDidLoad -Methode auf die gewünschte Größe fest. Diese Größe kann auch angepasst werden, indem Sie Einschränkungen auf die Ansicht in der iOS-Designer es dem Entwickler überlassen ist, die Methode zu wählen, die für sie am besten geeignet ist.

Da das Benachrichtigungssystem bereits ausgeführt wird, bevor die Benachrichtigungsinhaltserweiterung aufgerufen wird, beginnt der Inhaltsbereich in voller Größe und wird auf die angeforderte Größe animiert, wenn er dem Benutzer angezeigt wird.

Um diesen Effekt zu vermeiden, bearbeiten Sie die Info.plist Datei für die Erweiterung, und legen Sie den UNNotificationExtensionInitialContentSizeRatio Schlüssel des NSExtensionAttributes Schlüssels auf den Typ Number mit einem Wert fest, der das gewünschte Verhältnis darstellt. Beispiel:

Verwenden von Medienanlagen in der benutzerdefinierten Benutzeroberfläche

Da Medienanlagen (siehe oben im Abschnitt Hinzufügen von Medienanlagen ) Teil der Benachrichtigungsnutzlast sind, kann auf sie zugegriffen und in der Benachrichtigungsinhaltserweiterung genauso angezeigt werden, wie sie sich auf der Standardbenachrichtigungsbenutzeroberfläche befinden würden.

Wenn die benutzerdefinierte Benutzeroberfläche oben beispielsweise eine UIImageView enthält, die C#-Code verfügbar gemacht wurde, kann der folgende Code verwendet werden, um sie mit der Medienanlage aufzufüllen:

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

Da die Medienanlage vom System verwaltet wird, befindet sie sich außerhalb der Sandbox der App. Die Erweiterung muss das System über den Zugriff auf die Datei informieren, indem die StartAccessingSecurityScopedResource -Methode aufgerufen wird. Wenn die Erweiterung mit der Datei abgeschlossen ist, muss sie aufrufen, um die StopAccessingSecurityScopedResource Verbindung zu lösen.

Hinzufügen benutzerdefinierter Aktionen zu einer benutzerdefinierten Benutzeroberfläche

Benutzerdefinierte Aktionsschaltflächen können verwendet werden, um einer benutzerdefinierten Benachrichtigungsbenutzeroberfläche Interaktivität hinzuzufügen. Weitere Informationen zu benutzerdefinierten Aktionen finden Sie im Abschnitt Arbeiten mit Benachrichtigungsaktionen des Dokuments Erweiterte Benutzerbenachrichtigungen .

Zusätzlich zu den benutzerdefinierten Aktionen kann die Benachrichtigungsinhaltserweiterung auch auf die folgenden integrierten Aktionen reagieren:

  • Standardaktion : Der Benutzer tippt auf eine Benachrichtigung, um die App zu öffnen und die Details der angegebenen Benachrichtigung anzuzeigen.
  • Aktion schließen : Diese Aktion wird an die App gesendet, wenn der Benutzer eine bestimmte Benachrichtigung verwirbt.

Benachrichtigungsinhaltserweiterungen können auch ihre Benutzeroberfläche aktualisieren, wenn der Benutzer eine der benutzerdefinierten Aktionen aufruft, z. B. ein Datum als akzeptiert anzeigt, wenn der Benutzer auf die Schaltfläche Benutzerdefinierte Aktion akzeptieren tippt. Darüber hinaus können die Benachrichtigungsinhaltserweiterungen das System anweisen, die Kündigung der Benachrichtigungsbenutzeroberfläche zu verzögern, damit der Benutzer die Auswirkungen seiner Aktion sehen kann, bevor die Benachrichtigung geschlossen wird.

Dazu wird eine zweite Version der Methode implementiert, die DidReceiveNotification einen Vervollständigungshandler enthält. Beispiel:

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

Durch Hinzufügen des Server.PostEventResponse Handlers DidReceiveNotification zur Methode der Benachrichtigungsinhaltserweiterung muss die Erweiterung alle benutzerdefinierten Aktionen verarbeiten. Die Erweiterung kann die benutzerdefinierten Aktionen auch an die enthaltende App weiterleiten, indem sie ändert UNNotificationContentExtensionResponseOption. Beispiel:

// Close Notification
completionHandler (UNNotificationContentExtensionResponseOption.DismissAndForwardAction);

Arbeiten mit der Texteingabeaktion in der benutzerdefinierten Benutzeroberfläche

Abhängig vom Design der App und der Benachrichtigung kann es vorkommen, dass der Benutzer Text in die Benachrichtigung eingeben muss (z. B. das Antworten auf eine Nachricht). Eine Benachrichtigungsinhaltserweiterung hat wie eine Standardbenachrichtigung Zugriff auf die integrierte Texteingabeaktion.

Beispiel:

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

Dieser Code erstellt eine neue Texteingabeaktion und fügt sie der Extension-Kategorie (in der MakeExtensionCategory) -Methode hinzu. In der DidReceive Überschreibungsmethode verarbeitet sie den Benutzer, der Text mit dem folgenden Code eingibt:

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

Wenn der Entwurf das Hinzufügen benutzerdefinierter Schaltflächen zum Texteingabefeld erfordert, fügen Sie den folgenden Code hinzu, um sie einzuschließen:

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

Wenn die Kommentaraktion vom Benutzer ausgelöst wird, müssen sowohl der Ansichtscontroller als auch das benutzerdefinierte Texteingabefeld aktiviert werden:

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

};

Zusammenfassung

In diesem Artikel erfahren Sie mehr über die Verwendung des neuen Benutzerbenachrichtigungsframeworks in einer Xamarin.iOS-App. Es wurde das Hinzufügen von Medienanlagen sowohl zu lokalen als auch zu Remotebenachrichtigungen behandelt, und es wurde mithilfe der neuen Benutzerbenachrichtigungsbenutzeroberfläche zum Erstellen benutzerdefinierter Benachrichtigungs-UIs behandelt.