Xamarin.iOS에서 동적 알림 실행 단추Dynamic notification action buttons in Xamarin.iOS

Ios 12에서 알림 수 동적으로 추가, 제거 및 해당 관련된 실행 단추를 업데이트 합니다.In iOS 12, notifications can dynamically add, remove, and update their associated action buttons. 이러한 사용자 지정을 통해 알림 콘텐츠 및 사용자의 상호 작용에 직접 관련 된 작업을 사용 하 여 사용자를 제공할 수 있습니다.Such customization makes it possible to provide users with actions that are directly relevant to the notification's content and the user's interaction with it.

샘플 앱: RedGreenNotificationsSample app: RedGreenNotifications

이 가이드의 코드 조각에서 제공 합니다 RedGreenNotifications Xamarin.iOS를 사용 하 여 iOS 12의에서 알림 실행 단추를 사용 하 여 작업 하는 방법을 보여 주는 샘플 앱입니다.The code snippets in this guide come from the RedGreenNotifications sample app, which demonstrates how to use Xamarin.iOS to work with notification action buttons in iOS 12.

이 샘플 앱은 두 가지 유형의 로컬 알림 보냅니다: 빨강, 녹색입니다.This sample app sends two types of local notifications: red and green. 앱 보내기 알림을 알게 된 후 해당 사용자 지정 사용자 인터페이스를 보려는 3D 터치를 사용 합니다.After having the app send a notification, use 3D Touch to view its custom user interface. 그런 다음 표시 되는 이미지를 회전 하려면 알림의 작업 단추를 사용 합니다.Then, use the notification's action buttons to rotate the image it displays. 이미지를 회전할 때를 회전 재설정 단추가 표시 되 고 필요에 따라 사라집니다.As the image rotates, a Reset rotation button appears and disappears as necessary.

이 샘플 앱에서이 가이드에서 코드 조각을 제공 됩니다.Code snippets in this guide come from this sample app.

기본 작업 단추Default action buttons

알림을 범주는 해당 기본 실행 단추를 결정합니다.A notification's category determines its default action buttons.

만들고 응용 프로그램을 시작 하는 동안에 알림 범주를 등록 합니다.Create and register notification categories while an application launches. 예를 들어 합니다 샘플 앱FinishedLaunching 메서드의 AppDelegate 다음을 수행:For example, in the sample app, the FinishedLaunching method of AppDelegate does the following:

  • 빨간색 알림에 대 한 하나의 범주 및 녹색 알림에 대 한 다른 정의Defines one category for red notifications and another for green notifications
  • 호출 하 여 이러한 범주를 등록 합니다 SetNotificationCategoriesRegisters these categories by calling the SetNotificationCategories 메서드 UNUserNotificationCentermethod of UNUserNotificationCenter
  • 단일 연결 UNNotificationActionAttaches a single UNNotificationAction 각 범주에to each category

다음 샘플 코드 작동 방식을 보여 줍니다.The following sample code shows how this works:

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

이 코드에서는 모든 알림 갖는 기반 Content.CategoryIdentifierBased on this code, any notification whose Content.CategoryIdentifier "빨간색-범주" 또는 "녹색 범주"는 기본적으로 표시 되는 20도 회전 작업 단추입니다.is "red-category" or "green-category" will, by default, show a Rotate 20° action button.

앱에 알림 작업 단추 처리In-app handling of notification action buttons

UNUserNotificationCenterDelegate 형식의 속성 IUNUserNotificationCenterDelegate 합니다.UNUserNotificationCenter has a Delegate property of type IUNUserNotificationCenterDelegate.

샘플 앱에서 AppDelegate 자체에 대 한 사용자 알림 센터의 대리자로 설정 FinishedLaunching:In the sample app, AppDelegate sets itself as the user notification center's delegate in 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 구현 DidReceiveNotificationResponseThen, AppDelegate implements DidReceiveNotificationResponse 실행 단추를 처리 하도록 다음을 탭 합니다.to handle action button taps:

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

이 구현의 DidReceiveNotificationResponse 알림의 처리 하지 않습니다 20도 회전 작업 단추입니다.This implementation of DidReceiveNotificationResponse does not handle the notification's Rotate 20° action button. 대신, 알림 콘텐츠 확장 탭이 단추를 처리합니다.Instead, the notification's content extension handles taps on this button. 다음 섹션에서는 추가 알림 작업 단추 처리를 설명합니다.The next section further discusses notification action button handling.

알림 콘텐츠 확장의 실행 단추Action buttons in the notification content extension

알림 콘텐츠 확장 알림에 대 한 사용자 지정 인터페이스를 정의 하는 뷰 컨트롤러를 포함 합니다.A notification content extension contains a view controller that defines the custom interface for a notification.

이 뷰 컨트롤러를 사용할 수는 GetNotificationActionsSetNotificationActions 메서드는 ExtensionContextThis view controller can use the GetNotificationActions and SetNotificationActions methods on its ExtensionContext 속성 액세스 및 수정 알림의 작업 단추입니다.property to access and modify the notification's action buttons.

샘플 앱에서 알림 콘텐츠 확장의 뷰 컨트롤러는 기존 작업 단추 탭에 응답 하는 경우에 실행 단추를 수정 합니다.In the sample app, the notification content extension's view controller modifies the action buttons only when responding to a tap on an already-existing action button.

참고

알림 콘텐츠 확장에서 해당 뷰 컨트롤러는 작업 단추 탭으로 응답할 수 있습니다 DidReceiveNotificationResponse 메서드를의 일부로 선언 IUNNotificationContentExtension합니다.A notification content extension can respond to an action button tap in its view controller's DidReceiveNotificationResponse method, declared as part of IUNNotificationContentExtension.

와 이름을 공유 하지만 합니다 DidReceiveNotificationResponse 메서드 위에서 설명한, 다른 메서드입니다.Though it shares a name with the DidReceiveNotificationResponse method described above, this is a different method.

알림 콘텐츠 확장 단추를 눌러 처리 완료 되 면 기본 응용 프로그램에는 동일한 단추 탭을 처리 하도록 지시를 여부를 선택할 수 있습니다.After a notification content extension finishes processing a button tap, it can choose whether or not to tell the main application to handle that same button tap. 이렇게 하려면 적절 한 값을 전달 해야 합니다 UNNotificationContentExtensionResponseOption 완료 처리기에:To do this, it must pass an appropriate value of UNNotificationContentExtensionResponseOption to its completion handler:

  • Dismiss 알림 인터페이스를 해제 해야, 및 기본 앱 단추 탭을 처리할 필요가 없습니다를 나타냅니다.Dismiss indicates that the notification interface should be dismissed, and that the main app does not need to handle the button tap.
  • DismissAndForwardAction 알림 인터페이스를 해제 해야, 및는 기본 앱도 처리 하는 단추 탭을 나타냅니다.DismissAndForwardAction indicates that the notification interface should be dismissed, and that the main app should also handle the button tap.
  • DoNotDismiss 알림 인터페이스를 해제 하지 해야, 및 기본 앱 단추 탭을 처리할 필요가 없습니다를 나타냅니다.DoNotDismiss indicates that the notification interface should not be dismissed, and that the main app does not need to handle the button tap.

콘텐츠 확장의 DidReceiveNotificationResponse 메서드는 작업 단추를 눌렀는지 확인, 알림 인터페이스를 표시 하거나 숨깁니다에서 이미지를 회전을 재설정 작업 단추:The content extension's DidReceiveNotificationResponse method determines which action button was tapped, rotates the image in the notification's interface, and shows or hides a Reset action button:

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

이 경우이 메서드를 전달 UNNotificationContentExtensionResponseOption.DoNotDismiss 완료 처리기에 있습니다.In this case, the method passes UNNotificationContentExtensionResponseOption.DoNotDismiss to its completion handler. 이 알림의 인터페이스 개방를 의미 합니다.This which means that the notification's interface will stay open.