Tlačítka akcí dynamického oznámení v Xamarin.iOS
V iOSu 12 můžou oznámení dynamicky přidávat, odebírat a aktualizovat související tlačítka akcí. Takové přizpůsobení umožňuje uživatelům poskytnout akce, které jsou přímo relevantní pro obsah oznámení a interakci uživatele s ním.
Ukázková aplikace: RedGreenNotifications
Fragmenty kódu v této příručce pocházejí z ukázkové aplikace, která ukazuje, jak pomocí Xamarin.iOS pracovat s tlačítky akcí oznámení v iOSu 12.
Tato ukázková aplikace odesílá dva typy místních oznámení: červená a zelená. Po odeslání oznámení použijte 3D Touch k zobrazení vlastního uživatelského rozhraní. Pak pomocí tlačítek akcí oznámení otočte obrázek, který se zobrazí. Při obměně obrázku se zobrazí tlačítko Obnovit otočení a podle potřeby zmizí.
Fragmenty kódu v této příručce pocházejí z této ukázkové aplikace.
Výchozí tlačítka akcí
Kategorie oznámení určuje výchozí tlačítka akcí.
Při spuštění aplikace vytvořte a zaregistrujte kategorie oznámení.
Například v ukázkové aplikaciFinishedLaunching
provede metoda AppDelegate
následující:
- Definuje jednu kategorii pro červená oznámení a druhou pro zelená oznámení.
- Zaregistruje tyto kategorie voláním
SetNotificationCategories
metodouUNUserNotificationCenter
- Připojí jeden
UNNotificationAction
do každé kategorie
Následující ukázkový kód ukazuje, jak to funguje:
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);
});
// ...
}
Na základě tohoto kódu všechna oznámení, jejichž Content.CategoryIdentifier
je "červená kategorie" nebo "zelená kategorie", ve výchozím nastavení zobrazí tlačítko akce Otočit o 20° .
Zpracování tlačítek akcí oznámení v aplikaci
UNUserNotificationCenter
Delegate
má vlastnost typu IUNUserNotificationCenterDelegate
.
V ukázkové aplikaci AppDelegate
se nastaví jako delegát centra oznámení uživatele v 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;
// ...
AppDelegate
Pak implementujeDidReceiveNotificationResponse
pro zpracování klepnutí na tlačítko akce:
[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();
}
Tato implementace DidReceiveNotificationResponse
nezpracuje tlačítko akce Otočit o 20° oznámení. Místo toho rozšíření obsahu oznámení klepne na toto tlačítko. Další část popisuje zpracování tlačítek akce oznámení.
Tlačítka akcí v rozšíření obsahu oznámení
Rozšíření obsahu oznámení obsahuje kontroler zobrazení, který definuje vlastní rozhraní pro oznámení.
Tento kontroler zobrazení může používat GetNotificationActions
metody a SetNotificationActions
metody v jeho zobrazení. ExtensionContext
pro přístup k tlačítkům akcí oznámení a jejich úpravě.
V ukázkové aplikaci změní kontroler zobrazení rozšíření obsahu oznámení tlačítka akcí pouze v případě, že reaguje na klepnutí na tlačítko již existující akce.
Poznámka:
Rozšíření obsahu oznámení může reagovat na tlačítko akce klepnutím v metodě kontroleru DidReceiveNotificationResponse
zobrazení deklarované jako součást IUNNotificationContentExtension.
I když sdílí název s metodou DidReceiveNotificationResponse
popsanou výše, jedná se o jinou metodu.
Jakmile rozšíření obsahu oznámení dokončí zpracování klepnutí na tlačítko, může zvolit, jestli má hlavní aplikace říct, aby zpracovávala stejné tlačítko. K tomu musí předat odpovídající hodnotu UNNotificationContentExtensionResponseOption obslužné rutině dokončení:
Dismiss
označuje, že by se mělo zavřít rozhraní oznámení a že hlavní aplikace nemusí zpracovávat klepnutí na tlačítko.DismissAndForwardAction
označuje, že by se mělo zavřít rozhraní oznámení a že hlavní aplikace by měla také zpracovat klepnutí na tlačítko.DoNotDismiss
označuje, že by se nemělo zavřít rozhraní oznámení a že hlavní aplikace nemusí zpracovávat klepnutí na tlačítko.
Metoda rozšíření DidReceiveNotificationResponse
obsahu určuje, na které tlačítko akce bylo klepnutí, otočí obrázek v rozhraní oznámení a zobrazí nebo skryje tlačítko akce Obnovit :
[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);
}
V tomto případě metoda předá UNNotificationContentExtensionResponseOption.DoNotDismiss
obslužné rutině dokončení. To znamená, že rozhraní oznámení zůstane otevřené.