Aracılığıyla paylaş


Xamarin.iOS'ta dinamik bildirim eylem düğmeleri

iOS 12'de bildirimler, ilişkili eylem düğmelerini dinamik olarak ekleyebilir, kaldırabilir ve güncelleştirebilir. Bu tür özelleştirmeler, kullanıcılara bildirimin içeriğiyle ve kullanıcının bu içerikle etkileşimiyle doğrudan ilgili eylemler sağlamayı mümkün kılar.

Örnek uygulama: RedGreenNotifications

Bu kılavuzdaki kod parçacıkları, iOS 12'de bildirim eylemi düğmeleriyle çalışmak için Xamarin.iOS'un nasıl kullanılacağını gösteren örnek bir uygulamadan gelir.

Bu örnek uygulama iki tür yerel bildirim gönderir: kırmızı ve yeşil. Uygulamanın bildirim göndermesini aldıktan sonra, özel kullanıcı arabirimini görüntülemek için 3B Touch'ı kullanın. Ardından, görüntülenen görüntüyü döndürmek için bildirimin eylem düğmelerini kullanın. Görüntü dönerken Döndürmeyi sıfırla düğmesi görünür ve gerektiğinde kaybolur.

Bu kılavuzdaki kod parçacıkları bu örnek uygulamadan gelir.

Varsayılan eylem düğmeleri

Bildirimin kategorisi, varsayılan eylem düğmelerini belirler.

Uygulama başlatılırken bildirim kategorileri oluşturun ve kaydedin. Örneğin, örnek uygulamadaFinishedLaunching yöntemi AppDelegate aşağıdakileri yapar:

  • Kırmızı bildirimler için bir kategori ve yeşil bildirimler için başka bir kategori tanımlar
  • Bu kategorileri kaydetmek için SetNotificationCategories yöntemi UNUserNotificationCenter
  • Tek bir ekler UNNotificationAction her kategoriye

Aşağıdaki örnek kod bunun nasıl çalıştığını gösterir:

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

Bu koda bağlı olarak, Content.CategoryIdentifier" kırmızı kategori" veya "yeşil kategori" varsayılan olarak 20° döndür eylem düğmesini gösterir.

Bildirim eylem düğmelerini uygulama içi işleme

UNUserNotificationCentertüründe IUNUserNotificationCenterDelegatebir Delegate özelliğine sahiptir.

Örnek uygulamada, AppDelegate içinde kullanıcı bildirim merkezinin temsilcisi FinishedLaunchingolarak kendisini ayarlar:

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

Ardından, AppDelegateDidReceiveNotificationResponse eylem düğmesine dokunmaları işlemek için:

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

bu uygulaması DidReceiveNotificationResponse bildirimin 20° döndür eylem düğmesini işlemez. Bunun yerine, bildirimin içerik uzantısı bu düğmeye dokunur. Sonraki bölümde bildirim eylemi düğme işlemesi ele alınmaktadır.

Bildirim içeriği uzantısındaki eylem düğmeleri

Bildirim içerik uzantısı, bildirim için özel arabirimi tanımlayan bir görünüm denetleyicisi içerir.

Bu görünüm denetleyicisi GetNotificationActions ve SetNotificationActions yöntemlerini ExtensionContext özelliğine gidin ve bildirimin eylem düğmelerine erişin ve bunları değiştirin.

Örnek uygulamada, bildirim içeriği uzantısının görünüm denetleyicisi eylem düğmelerini yalnızca zaten var olan bir eylem düğmesine dokunmaya yanıt verirken değiştirir.

Not

Bildirim içeriği uzantısı, IUNNotificationContentExtension'ın DidReceiveNotificationResponse bir parçası olarak bildirilen görünüm denetleyicisinin yöntemindeki bir eylem düğmesine dokunarak yanıt verebilir.

Yukarıda açıklanan yöntemle DidReceiveNotificationResponsebir ad paylaşıyor olsa da, bu farklı bir yöntemdir.

Bildirim içeriği uzantısı bir düğme dokunmasını işlemeyi tamamladıktan sonra ana uygulamaya aynı düğme dokunmasını işlemesini isteyip istemediğinizi seçebilir. Bunu yapmak için unNotificationContentExtensionResponseOption değerinin uygun bir değerini tamamlama işleyicisine geçirmesi gerekir:

  • Dismiss bildirim arabiriminin kapatılması gerektiğini ve ana uygulamanın düğme dokunmasını işlemesi gerekmediğini belirtir.
  • DismissAndForwardAction , bildirim arabiriminin kapatılması gerektiğini ve ana uygulamanın düğme dokunmasını da işlemesi gerektiğini belirtir.
  • DoNotDismiss bildirim arabiriminin kapatılmaması gerektiğini ve ana uygulamanın düğme dokunmasını işlemesi gerekmediğini belirtir.

İçerik uzantısının DidReceiveNotificationResponse yöntemi, hangi eylem düğmesine dokunulduğu belirler, bildirimin arabiriminde görüntüyü döndürür ve Bir Sıfırla eylem düğmesini gösterir veya gizler:

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

Bu durumda, yöntemi tamamlama işleyicisine geçer UNNotificationContentExtensionResponseOption.DoNotDismiss . Bu, bildirimin arabiriminin açık kalacağı anlamına gelir.