Freigeben über


Interaktive Benachrichtigungsbenutzeroberflächen in Xamarin.iOS

Benachrichtigungsinhaltserweiterungen, eingeführt in iOS 10, ermöglichen das Erstellen benutzerdefinierter Benutzeroberflächen für Benachrichtigungen. Ab iOS 12 können Benachrichtigungsbenutzeroberflächen interaktive Elemente wie Schaltflächen und Schieberegler enthalten.

Benachrichtigungsinhaltserweiterung Info.plist Datei

In der Beispiel-App enthält die Datei "Info.plist " im Projekt "RedGreenNotificationsContentExtension " die folgende Konfiguration:

<!-- ... -->
<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>UNNotificationExtensionCategory</key>
        <array>
            <string>red-category</string>
            <string>green-category</string>
        </array>
        <key>UNNotificationExtensionUserInteractionEnabled</key>
        <true/>
        <key>UNNotificationExtensionDefaultContentHidden</key>
        <true/>
        <key>UNNotificationExtensionInitialContentSizeRatio</key>
        <real>0.6</real>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.usernotifications.content-extension</string>
    <key></key>
    <true/>
</dict>
<!-- ... -->

Beachten Sie die folgenden Funktionen:

  • Das UNNotificationExtensionCategory Array gibt den Typ der Benachrichtigungskategorien an, die die Inhaltserweiterung behandelt.
  • Um interaktive Inhalte zu unterstützen, legt die Benachrichtigungsinhaltserweiterung den UNNotificationExtensionUserInteractionEnabled Schlüssel auf true.
  • Der UNNotificationExtensionInitialContentSizeRatio Schlüssel gibt das anfängliche Höhen-/Breitenverhältnis für die Schnittstelle der Inhaltserweiterung an.

Interaktive Benutzeroberfläche

MainInterface.storyboard, das die Schnittstelle für eine Benachrichtigungsinhaltserweiterung definiert, ist ein Standard-Storyboard, das einen einzelnen Ansichtscontroller enthält. In der Beispiel-App ist der Ansichtscontroller vom Typ NotificationViewControllerund enthält eine Bildansicht, drei Schaltflächen und einen Schieberegler. Das Storyboard ordnet diese Steuerelemente den in NotificationViewController.cs definierten Handlern zu:

  • Der Schaltflächenhandler "App starten" ruft die PerformNotificationDefaultAction Aktionsmethode auf ExtensionContext, für die die App gestartet wird:

    partial void HandleLaunchAppButtonTap(UIButton sender)
    {
        ExtensionContext.PerformNotificationDefaultAction();
    }
    

    In der App kann das Benutzerbenachrichtigungscenter Delegate (in der Beispiel-App) AppDelegateauf die Interaktion in der DidReceiveNotificationResponse Methode reagieren:

    [Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
    public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, System.Action completionHandler)
    {
        if (response.IsDefaultAction)
        {
            Console.WriteLine("ACTION: Default");
            // ...
    
  • Der Schaltflächenhandler "Benachrichtigung schließen" wird aufgerufen DismissNotificationContentExtensionExtensionContext, bei dem die Benachrichtigung geschlossen wird:

    partial void HandleDismissNotificationButtonTap(UIButton sender)
    {
        ExtensionContext.DismissNotificationContentExtension();
    }
    
  • Der Schaltflächenhandler "Benachrichtigung entfernen" schließt die Benachrichtigung und entfernt sie aus dem Benachrichtigungscenter:

    partial void HandleRemoveNotificationButtonTap(UIButton sender)
    {
        ExtensionContext.DismissNotificationContentExtension();
        UNUserNotificationCenter.Current.RemoveDeliveredNotifications(new string[] { notification.Request.Identifier });
    }
    
  • Die Methode, mit der Wertänderungen auf dem Schieberegler behandelt werden, aktualisiert das Alpha des Bilds, das auf der Benutzeroberfläche der Benachrichtigung angezeigt wird:

    partial void HandleSliderValueChanged(UISlider sender)
    {
        Xamagon.Alpha = sender.Value;
    }