Sdílet prostřednictvím


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 metodou UNUserNotificationCenter
  • 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

UNUserNotificationCenterDelegate 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 DidReceiveNotificationResponsepopsanou 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é.