Udostępnij za pośrednictwem


Przyciski akcji powiadomienia dynamicznego w środowisku Xamarin.iOS

W systemie iOS 12 powiadomienia mogą dynamicznie dodawać, usuwać i aktualizować skojarzone przyciski akcji. Takie dostosowanie umożliwia udostępnianie użytkownikom akcji, które są bezpośrednio istotne dla zawartości powiadomienia i interakcji użytkownika z nią.

Przykładowa aplikacja: RedGreenNotifications

Fragmenty kodu w tym przewodniku pochodzą z przykładowej aplikacji, która pokazuje, jak używać platformy Xamarin.iOS do pracy z przyciskami akcji powiadomień w systemie iOS 12.

Ta przykładowa aplikacja wysyła dwa typy powiadomień lokalnych: czerwony i zielony. Po wysłaniu powiadomienia przez aplikację użyj funkcji 3D Touch, aby wyświetlić swój niestandardowy interfejs użytkownika. Następnie użyj przycisków akcji powiadomienia, aby obrócić wyświetlany obraz. Gdy obraz się obraca, zostanie wyświetlony przycisk Resetuj obrót i zniknie w razie potrzeby.

Fragmenty kodu w tym przewodniku pochodzą z tej przykładowej aplikacji.

Domyślne przyciski akcji

Kategoria powiadomienia określa domyślne przyciski akcji.

Tworzenie i rejestrowanie kategorii powiadomień podczas uruchamiania aplikacji. Na przykład w przykładowej aplikacjiFinishedLaunching metoda AppDelegate wykonuje następujące czynności:

  • Definiuje jedną kategorię dla powiadomień czerwonych, a drugą dla zielonych powiadomień
  • Rejestruje te kategorie, wywołując SetNotificationCategories metoda UNUserNotificationCenter
  • Dołącza pojedyncze UNNotificationAction do każdej kategorii

Poniższy przykładowy kod pokazuje, jak to działa:

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 podstawie tego kodu każde powiadomienie, którego Content.CategoryIdentifier wartość to "red-category" lub "green-category" domyślnie będzie pokazywać przycisk akcji Obróć 20° .

Obsługa przycisków akcji powiadomienia w aplikacji

UNUserNotificationCenterDelegate ma właściwość typu IUNUserNotificationCenterDelegate.

W przykładowej aplikacji AppDelegate ustawia się jako pełnomocnik centrum powiadomień użytkownika w programie 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 Następnie implementujeDidReceiveNotificationResponse aby obsłużyć naciśnięcia przycisku akcji:

[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();
        }

Ta implementacja DidReceiveNotificationResponse nie obsługuje przycisku akcji Obróć 20° powiadomienia. Zamiast tego rozszerzenie zawartości powiadomienia obsługuje naciśnięcia tego przycisku. W następnej sekcji omówiono obsługę przycisków akcji powiadomień.

Przyciski akcji w rozszerzeniu zawartości powiadomienia

Rozszerzenie zawartości powiadomienia zawiera kontroler widoku, który definiuje interfejs niestandardowy dla powiadomienia.

Ten kontroler widoku może używać GetNotificationActions metod i SetNotificationActionsExtensionContext właściwość, aby uzyskać dostęp do przycisków akcji powiadomienia i zmodyfikować je.

W przykładowej aplikacji kontroler widoku rozszerzenia zawartości powiadomień modyfikuje przyciski akcji tylko wtedy, gdy odpowiada na naciśnięcie już istniejącego przycisku akcji.

Uwaga

Rozszerzenie zawartości powiadomienia może odpowiedzieć na naciśnięcie przycisku akcji w metodzie kontrolera DidReceiveNotificationResponse widoku, zadeklarowane jako część IUNNotificationContentExtension.

Mimo że udostępnia nazwę metodzie opisanej DidReceiveNotificationResponsepowyżej, jest to inna metoda.

Po zakończeniu przetwarzania naciśnięcia przycisku przez rozszerzenie zawartości powiadomienia można wybrać, czy aplikacja główna ma obsługiwać to samo naciśnięcie przycisku. Aby to zrobić, należy przekazać odpowiednią wartość unNotificationContentExtensionResponseOption do procedury obsługi uzupełniania:

  • Dismiss wskazuje, że interfejs powiadomień powinien zostać odrzucony i że główna aplikacja nie musi obsługiwać naciśnięcia przycisku.
  • DismissAndForwardAction wskazuje, że interfejs powiadomień powinien zostać odrzucony, a główna aplikacja powinna również obsługiwać naciśnięcie przycisku.
  • DoNotDismiss wskazuje, że interfejs powiadomień nie powinien zostać odrzucony i że główna aplikacja nie musi obsługiwać naciśnięcia przycisku.

Metoda rozszerzenia DidReceiveNotificationResponse zawartości określa, który przycisk akcji został naciśnięty, obraca obraz w interfejsie powiadomienia i pokazuje lub ukrywa przycisk akcji Resetuj :

[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);
}

W takim przypadku metoda przechodzi UNNotificationContentExtensionResponseOption.DoNotDismiss do procedury obsługi uzupełniania. Oznacza to, że interfejs powiadomienia pozostanie otwarty.