Share via


Interaktive Schaltflächen für dynamische Benachrichtigungen in Xamarin.iOS

In iOS 12 können Benachrichtigungen die zugehörigen Interaktiven Schaltflächen dynamisch hinzufügen, entfernen und aktualisieren. Durch eine solche Anpassung können Benutzer Aktionen bereitstellen, die für den Inhalt der Benachrichtigung und die Interaktion des Benutzers direkt relevant sind.

Beispiel-App: RedGreenNotifications

Die Codeausschnitte in diesem Leitfaden stammen aus einer Beispiel-App, die veranschaulicht, wie Xamarin.iOS zum Arbeiten mit Benachrichtigungsaktionsschaltflächen in iOS 12 verwendet wird.

Diese Beispiel-App sendet zwei Arten von lokalen Benachrichtigungen: Rot und Grün. Nachdem die App eine Benachrichtigung gesendet hat, verwenden Sie 3D Touch, um die benutzerdefinierte Benutzeroberfläche anzuzeigen. Verwenden Sie dann die Interaktiven Schaltflächen der Benachrichtigung, um das angezeigte Bild zu drehen. Wenn das Bild gedreht wird, wird eine Schaltfläche "Drehung zurücksetzen" angezeigt und bei Bedarf ausgeblendet.

Codeausschnitte in diesem Leitfaden stammen aus dieser Beispiel-App.

Standardaktionsschaltflächen

Die Kategorie einer Benachrichtigung bestimmt die Standardaktionsschaltflächen.

Erstellen und registrieren Sie Benachrichtigungskategorien, während eine Anwendung gestartet wird. In der Beispiel-App FinishedLaunchingführt die Methode AppDelegate z. B. folgende Aktionen aus:

  • Definiert eine Kategorie für rote Benachrichtigungen und eine andere für grüne Benachrichtigungen
  • Registriert diese Kategorien durch Aufrufen der SetNotificationCategories Methode von UNUserNotificationCenter
  • Fügt eine einzelne an UNNotificationAction zu jeder Kategorie

Der folgende Beispielcode zeigt, wie dies funktioniert:

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    // Request authorization to send notifications
    UNUserNotificationCenter center = UNUserNotificationCenter.Current;
    var options = UNAuthorizationOptions.Alert | UNAuthorizationOptions.Sound | UNAuthorizationOptions.Provisional | UNAuthorizationOptions.ProvidesAppNotificationSettings;
    center.RequestAuthorization(options, (bool success, NSError error) =>
    {
        // ...
        var rotateTwentyDegreesAction = UNNotificationAction.FromIdentifier("rotate-twenty-degrees-action", "Rotate 20°", UNNotificationActionOptions.None);

        var redCategory = UNNotificationCategory.FromIdentifier(
            "red-category",
            new UNNotificationAction[] { rotateTwentyDegreesAction },
            new string[] { },
            UNNotificationCategoryOptions.CustomDismissAction
        );

        var greenCategory = UNNotificationCategory.FromIdentifier(
            "green-category",
            new UNNotificationAction[] { rotateTwentyDegreesAction },
            new string[] { },
            UNNotificationCategoryOptions.CustomDismissAction
        );

        var set = new NSSet<UNNotificationCategory>(redCategory, greenCategory);
        center.SetNotificationCategories(set);
    });
    // ...
}

Basierend auf diesem Code, jede Benachrichtigung, deren Benachrichtigung Content.CategoryIdentifier ist "rot-kategorie" oder "grün-kategorie" zeigt standardmäßig eine Interaktive Schaltfläche "20° drehen" an.

In-App-Behandlung von Interaktiven Schaltflächen für Benachrichtigungen

UNUserNotificationCenter hat eine Delegate Eigenschaft vom Typ IUNUserNotificationCenterDelegate.

Legt sich in der Beispiel-App AppDelegate als Stellvertretung des Benutzerbenachrichtigungscenters in FinishedLaunching:

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    // Request authorization to send notifications
    UNUserNotificationCenter center = UNUserNotificationCenter.Current;
    var options = // ...
    center.RequestAuthorization(options, (bool success, NSError error) =>
    {
        center.Delegate = this;
        // ...

Implementiert dann AppDelegateDidReceiveNotificationResponse zum Behandeln von Schaltflächentippen für Aktionen:

[Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, System.Action completionHandler)
{
    if (response.IsDefaultAction)
    {
        Console.WriteLine("ACTION: Default");
    }
    if (response.IsDismissAction)
    {
        Console.WriteLine("ACTION: Dismiss");
    }
    else
    {
        Console.WriteLine($"ACTION: {response.ActionIdentifier}");
    }

    completionHandler();
        }

Diese Implementierung DidReceiveNotificationResponse behandelt die Interaktive Schaltfläche "20° drehen" der Benachrichtigung nicht. Stattdessen verarbeitet die Inhaltserweiterung der Benachrichtigung Tippen auf diese Schaltfläche. Im nächsten Abschnitt wird die Behandlung von Benachrichtigungsschaltflächen erläutert.

Interaktive Schaltflächen in der Inhaltserweiterung für Benachrichtigungen

Eine Benachrichtigungsinhaltserweiterung enthält einen Ansichtscontroller, der die benutzerdefinierte Schnittstelle für eine Benachrichtigung definiert.

Dieser Ansichtscontroller kann die GetNotificationActions zugehörigen Methoden und SetNotificationActions Methoden verwenden. ExtensionContext -Eigenschaft, um auf die Interaktiven Schaltflächen der Benachrichtigung zuzugreifen und sie zu ändern.

In der Beispiel-App ändert der Ansichtscontroller der Benachrichtigungsinhaltserweiterung die Interaktiven Schaltflächen nur, wenn auf ein Tippen auf eine bereits vorhandene Interaktive Schaltfläche reagiert wird.

Hinweis

Eine Benachrichtigungsinhaltserweiterung kann auf eine Interaktive Schaltfläche in der Methode des Ansichtscontrollers DidReceiveNotificationResponse reagieren, die als Teil von IUNNotificationContentExtension deklariert wird.

Obwohl sie einen Namen mit der DidReceiveNotificationResponse oben beschriebenen Methode teilt, ist dies eine andere Methode.

Nachdem eine Benachrichtigungsinhaltserweiterung die Verarbeitung eines Schaltflächentippens abgeschlossen hat, kann sie auswählen, ob die Standard Anwendung anweisen soll, dieselbe Schaltfläche zu tippen. Dazu muss ein entsprechender Wert von UNNotificationContentExtensionResponseOption an den Abschlusshandler übergeben werden:

  • Dismissgibt an, dass die Benachrichtigungsschnittstelle geschlossen werden soll und dass die Standard-App die Schaltfläche nicht behandeln muss.
  • DismissAndForwardActiongibt an, dass die Benachrichtigungsschnittstelle geschlossen werden soll und dass die Standard-App auch den Tippen auf die Schaltfläche behandeln soll.
  • DoNotDismissgibt an, dass die Benachrichtigungsschnittstelle nicht geschlossen werden soll und dass die Standard-App nicht mit dem Tippen auf die Schaltfläche umgehen muss.

Die Methode der DidReceiveNotificationResponse Inhaltserweiterung bestimmt, auf welche Interaktive Schaltfläche getippt wurde, dreht das Bild in der Benutzeroberfläche der Benachrichtigung und blendet eine Interaktive Schaltfläche zum Zurücksetzen ein oder aus:

[Export("didReceiveNotificationResponse:completionHandler:")]
public void DidReceiveNotificationResponse(UNNotificationResponse response, Action<UNNotificationContentExtensionResponseOption> completionHandler)
{
    var rotationAction = ExtensionContext.GetNotificationActions()[0];

    if (response.ActionIdentifier == "rotate-twenty-degrees-action")
    {
        rotationButtonTaps += 1;

        double radians = (20 * rotationButtonTaps) * (2 * Math.PI / 360.0);
        Xamagon.Transform = CGAffineTransform.MakeRotation((float)radians);

        // 9 rotations * 20 degrees = 180 degrees. No reason to
        // show the reset rotation button when the image is half
        // or fully rotated.
        if (rotationButtonTaps % 9 == 0)
        {
            ExtensionContext.SetNotificationActions(new UNNotificationAction[] { rotationAction });
        }
        else if (rotationButtonTaps % 9 == 1)
        {
            var resetRotationAction = UNNotificationAction.FromIdentifier("reset-rotation-action", "Reset rotation", UNNotificationActionOptions.None);
            ExtensionContext.SetNotificationActions(new UNNotificationAction[] { rotationAction, resetRotationAction });
        }
    }

    if (response.ActionIdentifier == "reset-rotation-action")
    {
        rotationButtonTaps = 0;

        double radians = (20 * rotationButtonTaps) * (2 * Math.PI / 360.0);
        Xamagon.Transform = CGAffineTransform.MakeRotation((float)radians);

        ExtensionContext.SetNotificationActions(new UNNotificationAction[] { rotationAction });
    }

    completionHandler(UNNotificationContentExtensionResponseOption.DoNotDismiss);
}

In diesem Fall übergibt UNNotificationContentExtensionResponseOption.DoNotDismiss die Methode an den Abschlusshandler. Dies bedeutet, dass die Schnittstelle der Benachrichtigung geöffnet bleibt.