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 FinishedLaunching
fü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 vonUNUserNotificationCenter
- 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 AppDelegate
DidReceiveNotificationResponse
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:
Dismiss
gibt an, dass die Benachrichtigungsschnittstelle geschlossen werden soll und dass die Standard-App die Schaltfläche nicht behandeln muss.DismissAndForwardAction
gibt an, dass die Benachrichtigungsschnittstelle geschlossen werden soll und dass die Standard-App auch den Tippen auf die Schaltfläche behandeln soll.DoNotDismiss
gibt 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.
Verwandte Links
- Benutzerbenachrichtigungsframework in Xamarin.iOS
- Deklarieren ihrer Aktionen erfordernden Benachrichtigungstypen
- UserNotifications (Apple)
- Neuerungen in Benutzerbenachrichtigungen (WWDC 2018)
- Bewährte Methoden und Neuerungen in Benutzerbenachrichtigungen (WWDC 2017)
- Generieren einer Remotebenachrichtigung (Apple)