Sdílet prostřednictvím


Pokročilá oznámení uživatelů v Xamarin.iOS

Architektura oznámení uživatelů pro iOS 10 nově umožňuje doručování a zpracování místních a vzdálených oznámení. Pomocí této architektury může aplikace nebo rozšíření aplikace naplánovat doručování místních oznámení zadáním sady podmínek, jako je umístění nebo čas dne.

Informace o oznámeních uživatelů

Nová architektura oznámení uživatelů umožňuje doručování a zpracování místních a vzdálených oznámení. Pomocí této architektury může aplikace nebo rozšíření aplikace naplánovat doručování místních oznámení zadáním sady podmínek, jako je umístění nebo čas dne.

Kromě toho může aplikace nebo rozšíření přijímat (a potenciálně upravovat) místní i vzdálená oznámení, která se doručují do zařízení s iOSem uživatele.

Nová architektura uživatelského rozhraní pro oznámení uživatelů umožňuje aplikaci nebo rozšíření aplikace přizpůsobit vzhled místních i vzdálených oznámení při jejich prezentování uživateli.

Tato architektura poskytuje následující způsoby, jak může aplikace poskytovat oznámení uživateli:

  • Vizuální výstrahy – kde se oznámení v horní části obrazovky zobrazí jako banner.
  • Zvuk a vibrace – může být přidruženo k oznámení.
  • Ikona aplikace Badging – kde ikona aplikace zobrazuje odznáček zobrazující, že je k dispozici nový obsah. Například počet nepřečtených e-mailových zpráv.

Kromě toho v závislosti na aktuálním kontextu uživatele existují různé způsoby, jak se zobrazí oznámení:

  • Pokud je zařízení odemknuté, oznámení se zobrazí v horní části obrazovky jako banner.
  • Pokud je zařízení uzamčené, oznámení se zobrazí na zamykací obrazovce uživatele.
  • Pokud uživatel zmeškal oznámení, může otevřít Centrum oznámení a zobrazit všechna dostupná a čekající oznámení tam.

Aplikace Xamarin.iOS má dva typy oznámení uživatelů, které může odesílat:

  • Místní oznámení – Tyto zprávy posílají aplikace nainstalované místně na zařízení uživatelů.
  • Vzdálená oznámení – Odesílají se ze vzdáleného serveru a zobrazí se uživateli nebo se aktivuje aktualizace obsahu aplikace na pozadí.

Další informace najdete v naší dokumentaci k rozšířeným oznámením uživatelů.

Nové uživatelské rozhraní pro oznámení

Oznámení uživatelů v iOSu 10 jsou prezentována s novým návrhem uživatelského rozhraní, který poskytuje další obsah, jako je název, podnadpis a volitelné přílohy médií, které lze prezentovat na zamykací obrazovce, jako banner v horní části zařízení nebo v Centru oznámení.

Bez ohledu na to, kde se v iOSu 10 zobrazuje oznámení uživatele, je prezentováno se stejným vzhledem a chováním a se stejnými funkcemi a funkcemi.

V iOSu 8 společnost Apple zavedla oznámení akcí, kde vývojář mohl k oznámení připojit vlastní akce a umožnit uživateli provádět akce s oznámením, aniž by musel aplikaci spustit. V iOSu 9 společnost Apple vylepšila oznámení s možností akce pomocí rychlé odpovědi, která uživateli umožní odpovědět na oznámení s textovou položkou.

Vzhledem k tomu, že uživatelská oznámení jsou nedílnou součástí uživatelského prostředí v iOSu 10, společnost Apple dále rozšířila oznámení s možností akce, aby podporovala 3D Touch, kde uživatel stiskne oznámení a vlastní uživatelské rozhraní se zobrazí, aby poskytoval bohatou interakci s oznámením.

Když se zobrazí vlastní uživatelské rozhraní pro oznámení uživatele, pokud uživatel komunikuje se všemi akcemi připojenými k oznámení, můžete vlastní uživatelské rozhraní okamžitě aktualizovat, aby poskytlo zpětnou vazbu ohledně toho, co se změnilo.

V iOSu 10 je rozhraní API uživatelského rozhraní pro oznámení uživatelů, které umožňuje aplikaci Xamarin.iOS snadno využít těchto nových funkcí uživatelského rozhraní pro oznámení uživatelů.

Přidání příloh médií

Jednou z nejběžnějších položek, které se sdílejí mezi uživateli, jsou fotky, takže iOS 10 přidal možnost připojit položku médií (například fotku) přímo k oznámení, kde se zobrazí a snadno zpřístupní uživateli spolu se zbytkem obsahu oznámení.

Vzhledem k velikostem, které jsou součástí odesílání i malého obrázku, se ale připojení k datové části vzdáleného oznámení stává nepraktické. Vývojář může tuto situaci vyřešit tak, že pomocí nového rozšíření služby v iOSu 10 stáhne obrázek z jiného zdroje (například úložiště dat CloudKit) a před zobrazením uživateli ho připojí k obsahu oznámení.

Aby rozšíření služby změnilo vzdálené oznámení, musí být jeho datová část označena jako proměnlivá. Příklad:

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

Podívejte se na následující přehled tohoto procesu:

Přidání procesu příloh médií

Jakmile se vzdálené oznámení doručí do zařízení (prostřednictvím služby APNs), rozšíření služby pak může stáhnout požadovaný obrázek jakýmkoli způsobem (například NSURLSession) a po přijetí obrázku může upravit obsah oznámení a zobrazit ho uživateli.

Následuje příklad zpracování tohoto procesu v kódu:

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

Při přijetí oznámení z APN se vlastní adresa obrázku načte z obsahu a soubor se stáhne ze serveru. Potom se UNNotificationAttachement vytvoří s jedinečným ID a místním umístěním image (jako ).NSUrl Vytvoří se proměnlivá kopie obsahu oznámení a přidají se přílohy médií. Nakonec se uživateli zobrazí oznámení voláním contentHandler.

Po přidání přílohy do oznámení systém převezme přesun a správu souboru.

Kromě výše uvedených vzdálených oznámení jsou přílohy médií podporovány také z místních oznámení, kde UNNotificationAttachement je vytvořen a připojen k oznámení spolu s jeho obsahem.

Oznámení v iOSu 10 podporují mediální přílohy obrázků (statické a GIF), zvuk nebo video a systém automaticky zobrazí správné vlastní uživatelské rozhraní pro každý z těchto typů příloh, když se oznámení zobrazí uživateli.

Poznámka:

Je třeba věnovat pozornost optimalizaci velikosti média i doby potřebné ke stažení média ze vzdáleného serveru (nebo sestavení média pro místní oznámení), protože systém při spuštění rozšíření služby aplikace ukládá přísné limity. Zvažte například odeslání zmenšené verze obrázku nebo malého klipu videa, které se zobrazí v oznámení.

Vytváření vlastních uživatelských rozhraní

Aby vývojář vytvořil vlastní uživatelské rozhraní pro oznámení uživatelů, musí do řešení aplikace přidat rozšíření obsahu oznámení (nové pro iOS 10).

Rozšíření obsahu oznámení umožňuje vývojáři přidat do uživatelského rozhraní oznámení vlastní zobrazení a vykreslit libovolný obsah. Počínaje iOSem 12 podporují rozšíření obsahu oznámení interaktivní ovládací prvky uživatelského rozhraní, jako jsou tlačítka a posuvníky. Další informace najdete v interaktivních oznámeních v dokumentaci k iOSu 12 .

Aby bylo možné podporovat interakci uživatelů s oznámením uživatele, měly by se vytvořit vlastní akce, zaregistrovat se v systému a připojit k oznámení před tím, než bude naplánováno v systému. Rozšíření obsahu oznámení bude volána pro zpracování těchto akcí. Další podrobnosti o vlastních akcích najdete v části Práce s akcemi oznámení v dokumentu Rozšířená oznámení uživatelů.

Když se uživateli zobrazí oznámení uživatele s vlastním uživatelským rozhraním, bude mít následující prvky:

Oznámení uživatele s vlastními prvky uživatelského rozhraní

Pokud uživatel komunikuje s vlastními akcemi (zobrazenými pod oznámením), uživatelské rozhraní může být aktualizováno, aby uživateli poskytlo zpětnou vazbu, jak se stalo při vyvolání dané akce.

Přidání rozšíření obsahu oznámení

Pokud chcete do aplikace Xamarin.iOS implementovat vlastní uživatelské rozhraní oznámení uživatele, postupujte takto:

  1. Otevřete řešení aplikace v Visual Studio pro Mac.

  2. Klikněte pravým tlačítkem na název řešení v oblasti řešení a vyberte Přidat>nový projekt.

  3. Vyberte rozšíření>oznámení o rozšířeních pro iOS>a klikněte na tlačítko Další:

    Výběr rozšíření obsahu oznámení

  4. Zadejte název rozšíření a klikněte na tlačítko Další:

    Zadejte název rozšíření.

  5. V případě potřeby upravte název projektu nebo název řešení a klikněte na tlačítko Vytvořit:

    Úprava názvu projektu nebo názvu řešení

Po přidání rozšíření obsahu oznámení do řešení se v projektu rozšíření vytvoří tři soubory:

  1. NotificationViewController.cs – Toto je hlavní kontroler zobrazení rozšíření obsahu oznámení.
  2. MainInterface.storyboard - Kde vývojář stanoví viditelné uživatelské rozhraní rozšíření obsahu oznámení v iOS Designeru.
  3. Info.plist – Řídí konfiguraci rozšíření obsahu oznámení.

Výchozí NotificationViewController.cs soubor vypadá takto:

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

Metoda DidReceiveNotification je volána při rozbalení Oznámení uživatelem tak, aby rozšíření obsahu oznámení může naplnit vlastní uživatelské rozhraní obsahem UNNotification. V příkladu výše byl do zobrazení přidán popisek, vystavený kódu s názvem label a slouží k zobrazení textu oznámení.

Nastavení kategorií rozšíření obsahu oznámení

Systém musí být informován o tom, jak najít rozšíření obsahu oznámení aplikace na základě konkrétních kategorií, na které reaguje. Postupujte následovně:

  1. Poklikejte na soubor rozšíření Info.plist v oblasti řešení a otevřete ho pro úpravy.

  2. Přepněte do zobrazení Zdroj .

  3. NSExtension Rozbalte klíč.

  4. UNNotificationExtensionCategory Přidejte klíč jako typ String s hodnotou kategorie, do které rozšíření patří (v tomto příkladu "event-invite):

    Přidání klíče UNNotificationExtensionCategory

  5. Uložte provedené změny.

Kategorie rozšíření obsahu oznámení (UNNotificationExtensionCategory) používají stejné hodnoty kategorií, které se používají k registraci akcí oznámení. V situaci, kdy aplikace bude používat stejné uživatelské rozhraní pro více kategorií, přepněte UNNotificationExtensionCategory na typ Pole a zadejte všechny požadované kategorie. Příklad:

Skrytí výchozího obsahu oznámení

V situaci, kdy uživatelské rozhraní vlastního oznámení bude zobrazovat stejný obsah jako výchozí oznámení (nadpis, podnadpis a text se automaticky zobrazí v dolní části uživatelského rozhraní oznámení), můžou být tyto výchozí informace skryty přidáním UNNotificationExtensionDefaultContentHidden klíče do NSExtensionAttributes klíče jako typu Boolean s hodnotou YES v souboru přípony Info.plist :

Návrh vlastního uživatelského rozhraní

Pokud chcete navrhnout vlastní uživatelské rozhraní rozšíření obsahu oznámení, poklikáním otevřete MainInterface.storyboard soubor pro úpravy v iOS Designeru, přetáhněte prvky, které potřebujete k sestavení požadovaného rozhraní (například UILabels a UIImageViews).

Poznámka:

Od iOS 12 může rozšíření obsahu oznámení obsahovat interaktivní ovládací prvky, jako jsou tlačítka a textová pole. Další informace najdete v interaktivních oznámeních v dokumentaci k iOSu 12 .

Jakmile je uživatelské rozhraní rozloženo a potřebné ovládací prvky vystavené kódu jazyka C#, otevřete NotificationViewController.cs pro úpravy a upravte metodu DidReceiveNotification tak, aby se uživatelské rozhraní naplnilo, když uživatel rozbalí oznámení. Příklad:

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

Nastavení velikosti oblasti obsahu

Chcete-li upravit velikost oblasti obsahu zobrazené uživateli, kód níže nastaví PreferredContentSize vlastnost v ViewDidLoad metodě na požadovanou velikost. Tuto velikost lze také upravit použitím omezení pro zobrazení v iOS Designeru, zůstává vývojáři ponechána, aby vybrali metodu, která je pro ně nejvhodnější.

Vzhledem k tomu, že systém oznámení je již spuštěn před vyvolání rozšíření obsahu oznámení, oblast obsahu začne mít plnou velikost a bude animované až na požadovanou velikost, když se zobrazí uživateli.

Chcete-li tento efekt odstranit, upravte Info.plist soubor pro příponu a nastavte UNNotificationExtensionInitialContentSizeRatio klíč NSExtensionAttributes klíče na typ Číslo s hodnotou představující požadovaný poměr. Příklad:

Použití příloh médií ve vlastním uživatelském rozhraní

Vzhledem k tomu, že přílohy médií (jak je vidět v části Přidat přílohy médií výše) jsou součástí datové části oznámení, dají se zobrazit a zobrazit v rozšíření obsahu oznámení stejně jako ve výchozím uživatelském rozhraní oznámení.

Pokud například vlastní uživatelské rozhraní obsahovalo UIImageView kód, který byl vystaven kódu jazyka C#, můžete ho použít k naplnění pomocí přílohy médií:

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

Vzhledem k tomu, že přílohu médií spravuje systém, je mimo sandbox aplikace. Rozšíření musí informovat systém, že chce přístup k souboru voláním StartAccessingSecurityScopedResource metody. Po dokončení rozšíření se souborem musí zavolat StopAccessingSecurityScopedResource , aby se uvolnilo jeho připojení.

Přidání vlastních akcí do vlastního uživatelského rozhraní

Tlačítka vlastních akcí se dají použít k přidání interaktivity do uživatelského rozhraní vlastních oznámení. Další podrobnosti o vlastních akcích najdete v části Práce s akcemi oznámení v dokumentu Rozšířená oznámení uživatelů.

Kromě vlastních akcí může rozšíření obsahu oznámení reagovat také na následující předdefinované akce:

  • Výchozí akce – Když uživatel klepne na oznámení, otevře aplikaci a zobrazí podrobnosti daného oznámení.
  • Zavřít akci – tato akce se odešle do aplikace, když uživatel zavře dané oznámení.

Rozšíření obsahu oznámení mají také možnost aktualizovat své uživatelské rozhraní, když uživatel vyvolá jednu z vlastních akcí, jako je například zobrazení data přijatého, když uživatel klepne na tlačítko Přijmout vlastní akci. Rozšíření obsahu oznámení navíc můžou systému sdělit, aby odpozdili zavření uživatelského rozhraní oznámení, aby uživatel viděl účinek své akce před zavřením oznámení.

To se provádí implementací druhé verze DidReceiveNotification metody, která zahrnuje obslužnou rutinu dokončení. Příklad:

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

Přidáním obslužné Server.PostEventResponse rutiny do DidReceiveNotification metody rozšíření obsahu oznámení musí rozšíření zpracovat všechny vlastní akce. Rozšíření může také předat vlastní akce do obsahující aplikace změnou UNNotificationContentExtensionResponseOption. Příklad:

// Close Notification
completionHandler (UNNotificationContentExtensionResponseOption.DismissAndForwardAction);

Práce s akcí zadávání textu ve vlastním uživatelském rozhraní

V závislosti na návrhu aplikace a oznámení můžou být někdy nutné, aby uživatel zadal text do oznámení (například odpovídání na zprávu). Rozšíření obsahu oznámení má přístup k předdefinované akci zadávání textu stejně jako standardní oznámení.

Příklad:

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

Tento kód vytvoří novou akci textového vstupu a přidá ji do kategorie rozšíření (v MakeExtensionCategorymetodě). DidReceive V metodě přepsání zpracovává uživatel, který zadává text s následujícím kódem:

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

Pokud návrh volá přidání vlastních tlačítek do textového vstupního pole, přidejte následující kód, který je přidá:

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

Když uživatel aktivuje akci komentáře, musí být aktivované jak kontroler zobrazení, tak vlastní pole textového vstupu:

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

};

Shrnutí

Tento článek se podrobně podíval na použití nové architektury oznámení uživatelů v aplikaci Xamarin.iOS. Zahrnoval přidání příloh médií k místnímu i vzdálenému oznámení a k vytvoření vlastních uživatelských rozhraní pro oznámení pomocí nového uživatelského rozhraní oznámení.