Xamarin.iOS의 동적 알림 작업 단추
iOS 12에서 알림은 연결된 작업 단추를 동적으로 추가, 제거 및 업데이트할 수 있습니다. 이러한 사용자 지정을 통해 알림의 콘텐츠와 사용자의 상호 작용과 직접 관련된 작업을 사용자에게 제공할 수 있습니다.
샘플 앱: RedGreenNotifications
이 가이드의 코드 조각은 Xamarin.iOS를 사용하여 iOS 12의 알림 작업 단추를 사용하는 방법을 보여 주는 샘플 앱에서 제공됩니다.
이 샘플 앱은 빨간색과 녹색의 두 가지 유형의 로컬 알림을 보냅니다. 앱이 알림을 보내도록 한 후 3D Touch를 사용하여 사용자 지정 사용자 인터페이스를 봅니다. 그런 다음 알림의 작업 단추를 사용하여 표시되는 이미지를 회전합니다. 이미지가 회전 하면 회전 다시 설정 단추가 나타나고 필요에 따라 사라집니다.
이 가이드의 코드 조각은 이 샘플 앱에서 제공됩니다.
기본 작업 단추
알림의 범주에 따라 기본 작업 단추가 결정됩니다.
애플리케이션이 시작되는 동안 알림 범주를 만들고 등록합니다.
예를 들어 샘플 앱에서 메서드 AppDelegate
는 FinishedLaunching
다음을 수행합니다.
- 빨간색 알림에 대한 범주와 녹색 알림에 대한 범주를 정의합니다.
- 다음을 호출하여 이러한 범주를 등록합니다.
SetNotificationCategories
의 메서드UNUserNotificationCenter
- 단일 연결
UNNotificationAction
각 범주에
다음 샘플 코드는 작동 방식을 보여 줍니다.
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.CategoryIdentifier
가 "빨간색 범주" 또는 "녹색 범주"이면 기본적으로 20° 회전 동작 단추가 표시됩니다.
알림 작업 단추의 앱 내 처리
UNUserNotificationCenter
에는 형식IUNUserNotificationCenterDelegate
의 속성이 Delegate
있습니다.
샘플 앱 AppDelegate
에서 다음에서 사용자 알림 센터의 대리자로 자신을 설정합니다.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
구현합니다. DidReceiveNotificationResponse
작업 단추 탭을 처리하려면 다음을 수행합니다.
[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° 회전 동작 단추를 처리하지 않습니다. 대신 알림의 콘텐츠 확장이 이 단추의 탭을 처리합니다. 다음 섹션에서는 알림 작업 단추 처리에 대해 자세히 설명합니다.
알림 콘텐츠 확장의 작업 단추
알림 콘텐츠 확장에는 알림에 대한 사용자 지정 인터페이스를 정의하는 보기 컨트롤러가 포함되어 있습니다.
이 뷰 컨트롤러는 해당 뷰 컨트롤러에서 및 SetNotificationActions
메서드를 GetNotificationActions
사용할 수 있습니다.ExtensionContext
속성은 알림의 작업 단추에 액세스하고 수정합니다.
샘플 앱에서 알림 콘텐츠 확장의 보기 컨트롤러는 기존 작업 단추의 탭에 응답하는 경우에만 작업 단추를 수정합니다.
참고 항목
알림 콘텐츠 확장 프로그램은 IUNNotificationContentExtension의 일부로 선언된 뷰 컨트롤러의 DidReceiveNotificationResponse
메서드에서 작업 단추 탭에 응답할 수 있습니다.
위에서 설명한 메서드와 DidReceiveNotificationResponse
이름을 공유하지만 다른 메서드입니다.
알림 콘텐츠 확장 프로그램이 단추 탭 처리를 완료한 후 기본 애플리케이션에 동일한 단추 탭을 처리하도록 지시할지 여부를 선택할 수 있습니다. 이렇게 하려면 UNNotificationContentExtensionResponseOption의 적절한 값을 완료 처리기에 전달해야 합니다.
Dismiss
는 알림 인터페이스를 해제해야 하며 기본 앱이 단추 탭을 처리할 필요가 없음을 나타냅니다.DismissAndForwardAction
는 알림 인터페이스를 해제해야 하며 기본 앱도 단추 탭을 처리해야 했음을 나타냅니다.DoNotDismiss
는 알림 인터페이스를 해제해서는 안 되며 기본 앱이 단추 탭을 처리할 필요가 없음을 나타냅니다.
콘텐츠 확장의 DidReceiveNotificationResponse
메서드는 탭된 작업 단추를 결정하고, 알림 인터페이스에서 이미지를 회전하고, 다시 설정 작업 단추를 표시하거나 숨깁니다.
[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
. 이는 알림의 인터페이스가 계속 열려 있음을 의미합니다.