Partager via


Boutons d’action de notification dynamique dans Xamarin.iOS

Dans iOS 12, les notifications peuvent ajouter, supprimer et mettre à jour dynamiquement leurs boutons d’action associés. Cette personnalisation permet de fournir aux utilisateurs des actions directement pertinentes pour le contenu de la notification et l’interaction de l’utilisateur avec celui-ci.

Exemple d’application : RedGreenNotifications

Les extraits de code de ce guide proviennent d’un exemple d’application, qui montre comment utiliser Xamarin.iOS pour utiliser des boutons d’action de notification dans iOS 12.

Cet exemple d’application envoie deux types de notifications locales : rouge et vert. Après avoir envoyé une notification à l’application, utilisez 3D Touch pour afficher son interface utilisateur personnalisée. Ensuite, utilisez les boutons d’action de la notification pour faire pivoter l’image qu’elle affiche. Lorsque l’image pivote, un bouton de rotation de réinitialisation s’affiche et disparaît si nécessaire.

Les extraits de code de ce guide proviennent de cet exemple d’application.

Boutons d’action par défaut

La catégorie d’une notification détermine ses boutons d’action par défaut.

Créez et inscrivez des catégories de notification pendant le lancement d’une application. Par exemple, dans l’exemple d’application, la FinishedLaunching méthode de AppDelegate procédez comme suit :

  • Définit une catégorie pour les notifications rouges et une autre pour les notifications vertes
  • Inscrit ces catégories en appelant le SetNotificationCategories méthode de UNUserNotificationCenter
  • Attache un seul UNNotificationAction à chaque catégorie

L’exemple de code suivant montre comment cela fonctionne :

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);
    });
    // ...
}

En fonction de ce code, toute notification dont Content.CategoryIdentifier est « red-category » ou « green-category » affiche par défaut un bouton d’action Pivoter de 20° .

Gestion dans l’application des boutons d’action de notification

UNUserNotificationCenter a une Delegate propriété de type IUNUserNotificationCenterDelegate.

Dans l’exemple d’application, AppDelegate définit lui-même comme délégué du centre de notification utilisateur dans 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;
        // ...

Ensuite, AppDelegate implémente DidReceiveNotificationResponse pour gérer les appuis du bouton d’action :

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

Cette implémentation DidReceiveNotificationResponse ne gère pas le bouton d’action Rotation 20° de la notification. Au lieu de cela, l’extension de contenu de la notification gère les appuis sur ce bouton. La section suivante décrit plus en détail la gestion des boutons d’action de notification.

Boutons d’action dans l’extension de contenu de notification

Une extension de contenu de notification contient un contrôleur de vue qui définit l’interface personnalisée d’une notification.

Ce contrôleur d’affichage peut utiliser les méthodes et SetNotificationActions les GetNotificationActions méthodes sur sonExtensionContext pour accéder aux boutons d’action de la notification et les modifier.

Dans l’exemple d’application, le contrôleur d’affichage de l’extension de contenu de notification modifie les boutons d’action uniquement lors de la réponse à un appui sur un bouton d’action déjà existant.

Remarque

Une extension de contenu de notification peut répondre à une touche de bouton d’action dans la méthode de son contrôleur d’affichageDidReceiveNotificationResponse, déclarée dans le cadre d’IUNNotificationContentExtension.

Bien qu’il partage un nom avec la DidReceiveNotificationResponse méthode décrite ci-dessus, il s’agit d’une autre méthode.

Une fois qu’une extension de contenu de notification a terminé de traiter un appui sur un bouton, il peut choisir s’il faut indiquer à l’application principale de gérer ce même appui sur le bouton. Pour ce faire, il doit passer une valeur appropriée de UNNotificationContentExtensionResponseOption à son gestionnaire d’achèvement :

  • Dismiss indique que l’interface de notification doit être ignorée et que l’application principale n’a pas besoin de gérer l’appui du bouton.
  • DismissAndForwardAction indique que l’interface de notification doit être ignorée et que l’application principale doit également gérer l’appui du bouton.
  • DoNotDismiss indique que l’interface de notification ne doit pas être ignorée et que l’application principale n’a pas besoin de gérer l’appui du bouton.

La méthode de l’extension de DidReceiveNotificationResponse contenu détermine le bouton d’action qui a été tapé, fait pivoter l’image dans l’interface de la notification et affiche ou masque un bouton d’action Réinitialiser :

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

Dans ce cas, la méthode passe UNNotificationContentExtensionResponseOption.DoNotDismiss à son gestionnaire d’achèvement. Cela signifie que l’interface de la notification reste ouverte.