콘텐츠로 이동

Apple 로컬 푸시 알림 Add-on

macOS에서 앱이 로컬 푸시 알림을 직접 예약하고 관리하는 Add-on입니다. Apple UserNotifications 프레임워크의 UNUserNotificationCenter를 감싸 알림 권한 요청, 알림 유형 등록, 시간 간격이나 날짜 기준 예약, 예약 취소, 전달된 알림 삭제, 예약 대기 중인 알림과 전달된 알림 조회, 앱 아이콘 배지 설정을 제공합니다. 알림 내용은 가공하지 않고 OS에 그대로 전달합니다.

로컬 푸시 알림은 Hive Axyl 서버를 거치지 않으므로 Push 모듈 없이 이 Add-on만 등록해 사용합니다. 이 Add-on은 macOS만 지원하므로, iOS와 Android에서는 Unity Mobile Notifications 패키지로 로컬 푸시 알림을 구현합니다.

모듈 정보

항목 값
패키지 com.com2usplatform.hiveaxyl.push.addon.applenotification
인터페이스 ILocalNotificationApplePlugin
네임스페이스 Hive.Axyl.Push.Addon.AppleNotification
등록 메서드 AddAppleNotification()
지원 플랫폼 macOS
최소 사양 macOS 15+, Unity 6000.0+
사전 준비

로컬 푸시 알림을 예약하는 데는 별도의 기능 설정이나 엔타이틀먼트가 필요하지 않습니다. 엔타이틀먼트는 앱이 사용할 Apple 기능을 서명에 선언하는 값입니다. 다만 알림의 InterruptionLevel을 TimeSensitive나 Critical로 지정하려면 UNContentInterruptionLevel에 적힌 엔타이틀먼트가 필요합니다.

델리게이트는 알림 표시나 알림 탭 같은 이벤트가 생겼을 때 OS가 호출하는 앱의 객체입니다. Add-on은 앱의 UNUserNotificationCenterDelegate를 설치하거나 대신하지 않으므로, 앱의 델리게이트가 알림 콜백을 OS 콜백 전달 메서드로 넘겨야 알림 이벤트가 발생합니다.

등록과 획득

HiveBootstrap.Initialize의 등록 단계에서 등록한 뒤 HiveCore.TryResolve<T>()로 가져옵니다.

using Hive.Axyl.Core;
using Hive.Axyl.Core.Unity;   // HiveBootstrap
using Hive.Axyl.Push.Addon.AppleNotification;

HiveBootstrap.Initialize(config, builder =>
{
    builder.AddAppleNotification();
});

if (HiveCore.TryResolve<ILocalNotificationApplePlugin>(out var localNotification))
{
    // macOS 빌드에서만 실행되는 코드
}
Unity 에디터에서는 등록되지 않습니다

이 Add-on은 macOS로 빌드한 플레이어에서만 등록됩니다. Unity 에디터에서는 macOS에서 실행해도 등록되지 않으므로, HiveCore.Resolve<T>()를 쓰면 RegistrationNotFoundException이 발생합니다. 반드시 TryResolve<T>()로 확인한 뒤 사용하세요.

메서드 요약

모든 메서드는 마지막 파라미터로 CancellationToken ct = default를 받습니다. 호출 규약은 호출 컨텍스트를 참조하세요.

메서드 설명
RequestPermissionAsync() 알림 권한을 요청합니다.
RegisterCategoryAsync() 알림 유형과 액션 버튼을 등록합니다.
ScheduleTimeIntervalAsync() 지정한 시간이 지난 뒤 표시할 알림을 예약합니다.
ScheduleCalendarAsync() 지정한 날짜와 시각에 표시할 알림을 예약합니다.
CancelPendingAsync() 예약 대기 중인 알림을 취소합니다.
CancelDeliveredAsync() 알림 센터에 전달된 알림을 지웁니다.
ListPendingAsync() 예약 대기 중인 알림 목록을 조회합니다.
ListDeliveredAsync() 알림 센터에 남아 있는 알림 목록을 조회합니다.
SetBadgeCountAsync() 앱 아이콘 배지 숫자를 설정합니다.

앱의 델리게이트가 OS 콜백을 넘길 때 호출하는 메서드는 OS 콜백 전달 메서드에서 따로 설명합니다.

메서드

RequestPermissionAsync

UNUserNotificationCenter.requestAuthorization(options:)로 알림 권한을 요청합니다. 시스템 권한 대화 상자는 처음 호출할 때만 표시되고, 이후에는 앱 사용자가 이전에 선택한 결과를 반환합니다.

앱 사용자가 권한을 거부하면 Failure가 아니라 Data.Granted가 false인 Success가 반환됩니다. macOS는 앱의 알림이 꺼진 뒤부터 권한 요청을 오류로 끝내지만, Add-on이 이 경우도 Granted가 false인 Success로 반환합니다. 거부는 Granted로 처리하세요.

알림 권한은 앱 전체에 하나이므로 Apple Push Notification service 푸시 알림 Add-on과 공유합니다. 두 Add-on 중 어느 쪽으로 권한을 받아도 양쪽에 적용되므로, 한 곳에서만 요청하세요.

Task<LocalNotificationAppleServiceRequestPermissionResult> RequestPermissionAsync(IReadOnlyList<UNLocalAuthorizationOption> options, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
options IReadOnlyList<UNLocalAuthorizationOption> Required 요청할 권한 옵션 목록입니다. 빈 목록이면 아무 옵션도 요청하지 않습니다.
항목 값
응답 RequestPermissionResponse

결과 케이스 — LocalNotificationAppleServiceRequestPermissionResult

결과 케이스 와이어 코드 설명
Success — 권한 요청을 마쳤습니다. 허용 여부는 Data.Granted에서 확인합니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

발생 예외

예외 발생 조건
ArgumentNullException options가 null인 경우

RegisterCategoryAsync

UNUserNotificationCenter.setNotificationCategories(_:)로 알림 유형을 등록합니다. 알림 유형은 알림에 표시할 액션 버튼과 동작 옵션을 묶은 단위이며, 알림을 예약할 때 NotificationContent.CategoryIdentifier로 지정합니다. 앱 사용자가 액션 버튼을 선택하면 그 액션의 식별자가 NotificationOpened 이벤트로 전달됩니다.

호출할 때마다 등록된 알림 유형 전체가 요청한 목록으로 교체됩니다. 앱이 사용하는 알림 유형을 앱 초기화 단계에서 한 번에 모두 넘기세요.

Task<LocalNotificationAppleServiceRegisterCategoryResult> RegisterCategoryAsync(IReadOnlyList<CategorySpec> categories, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
categories IReadOnlyList<CategorySpec> Required 등록할 알림 유형 전체 목록입니다.
항목 값
응답 RegisterCategoryResponse

결과 케이스 — LocalNotificationAppleServiceRegisterCategoryResult

결과 케이스 와이어 코드 설명
Success — 알림 유형을 등록했습니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

발생 예외

예외 발생 조건
ArgumentNullException categories가 null인 경우
ArgumentException categories에 null 항목이 있거나, Identifier가 비어 있는 항목이 있는 경우

ScheduleTimeIntervalAsync

UNTimeIntervalNotificationTrigger로 지정한 시간이 지난 뒤 표시할 알림을 예약합니다. repeats가 true이면 같은 간격으로 알림을 반복합니다.

알림 권한이 없어도 예약은 Success로 끝나지만, OS가 알림을 표시하지 않습니다. 예약 대기 알림이 64개를 넘어도 예약은 Success로 끝나지만 OS가 일부 알림을 제외하며, 어떤 알림이 제외될지는 보장되지 않습니다. 예약 대기 알림을 64개 미만으로 유지하세요.

Task<LocalNotificationAppleServiceScheduleTimeIntervalResult> ScheduleTimeIntervalAsync(string notificationId, NotificationContent content, TimeSpan interval, bool repeats, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
notificationId string Required 앱이 정하는 알림 식별자입니다. 예약을 취소하거나 목록에서 알림을 찾을 때 이 값을 사용합니다.
content NotificationContent Required 표시할 알림 내용입니다.
interval TimeSpan Required 알림을 표시할 때까지 기다릴 시간입니다. 0보다 커야 하며, repeats가 true이면 60초 이상이어야 합니다.
repeats bool Required true이면 interval 간격으로 알림을 반복합니다.
항목 값
응답 ScheduleTimeIntervalResponse

결과 케이스 — LocalNotificationAppleServiceScheduleTimeIntervalResult

결과 케이스 와이어 코드 설명
Success — 알림을 예약했습니다. 예약한 알림 식별자는 Data.NotificationId에 담깁니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

발생 예외

예외 발생 조건
ArgumentNullException notificationId 또는 content가 null인 경우
ArgumentException notificationId가 빈 문자열이거나, interval이 0 이하이거나, repeats가 true인데 interval이 60초 미만인 경우

호출 예시

using System;
using Hive.Axyl.Push.Addon.AppleNotification;

var result = await localNotification.ScheduleTimeIntervalAsync(
    "notice-1",
    new NotificationContent
    {
        Title = "{title}",
        Body  = "{body}",
        Sound = "default",   // 기본 알림음
    },
    TimeSpan.FromMinutes(30),
    repeats: false);

if (result is LocalNotificationAppleServiceScheduleTimeIntervalResult.Success success)
{
    string notificationId = success.Data.NotificationId;   // 예약을 취소할 때 사용
}

ScheduleCalendarAsync

UNCalendarNotificationTrigger로 날짜와 시각 조건에 맞을 때 표시할 알림을 예약합니다. DateComponents에 지정한 필드가 모두 일치하는 시각에 알림이 표시되며, repeats가 true이면 지정한 필드 조합에 따라 매일, 매주, 매월, 매년 반복합니다.

Add-on은 날짜 조건을 검사하거나 바꾸지 않고 OS에 그대로 넘깁니다. 이미 지난 날짜를 repeats가 false인 상태로 예약하면 Success로 끝나지만 알림은 표시되지 않습니다. repeats가 true일 때 Year를 지정하면 반복될 수 없는 시각인데도 macOS가 알림을 끝없이 다시 표시하므로, 반복 예약에서는 Year를 지정하지 마세요.

예약 대기 알림 개수 제한은 ScheduleTimeIntervalAsync()와 같습니다.

Task<LocalNotificationAppleServiceScheduleCalendarResult> ScheduleCalendarAsync(string notificationId, NotificationContent content, DateComponents dateComponents, bool repeats, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
notificationId string Required 앱이 정하는 알림 식별자입니다. 예약을 취소하거나 목록에서 알림을 찾을 때 이 값을 사용합니다.
content NotificationContent Required 표시할 알림 내용입니다.
dateComponents DateComponents Required 알림을 표시할 날짜와 시각 조건입니다.
repeats bool Required true이면 dateComponents 조건이 다시 맞을 때마다 알림을 표시합니다.
항목 값
응답 ScheduleCalendarResponse

결과 케이스 — LocalNotificationAppleServiceScheduleCalendarResult

결과 케이스 와이어 코드 설명
Success — 알림을 예약했습니다. 예약한 알림 식별자는 Data.NotificationId에 담깁니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

발생 예외

예외 발생 조건
ArgumentNullException notificationId, content, dateComponents 중 하나가 null인 경우
ArgumentException notificationId가 빈 문자열인 경우

호출 예시

매주 월요일 오전 9시에 알림을 표시하는 예시입니다. 반복 예약이므로 Year를 지정하지 않습니다.

using Hive.Axyl.Push.Addon.AppleNotification;

var result = await localNotification.ScheduleCalendarAsync(
    "weekly-notice",
    new NotificationContent
    {
        Title = "{title}",
        Body  = "{body}",
    },
    new DateComponents
    {
        Weekday = 2,   // 1은 일요일, 2는 월요일
        Hour    = 9,
        Minute  = 0,
    },
    repeats: true);

CancelPendingAsync

removePendingNotificationRequests(withIdentifiers:)로 아직 표시되지 않은 예약 대기 알림을 취소합니다. 요청한 식별자의 예약이 없어도 Success로 끝납니다.

Task<LocalNotificationAppleServiceCancelPendingResult> CancelPendingAsync(string notificationId, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
notificationId string Required 취소할 알림을 예약할 때 지정한 식별자입니다.
항목 값
응답 CancelPendingResponse

결과 케이스 — LocalNotificationAppleServiceCancelPendingResult

결과 케이스 와이어 코드 설명
Success — 예약을 취소했거나 취소할 예약이 없습니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

발생 예외

예외 발생 조건
ArgumentNullException notificationId가 null인 경우

CancelDeliveredAsync

removeDeliveredNotifications(withIdentifiers:)로 알림 센터에 표시된 알림을 지웁니다. 요청한 식별자의 알림이 없어도 Success로 끝납니다.

Task<LocalNotificationAppleServiceCancelDeliveredResult> CancelDeliveredAsync(string notificationId, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
notificationId string Required 지울 알림을 예약할 때 지정한 식별자입니다.
항목 값
응답 CancelDeliveredResponse

결과 케이스 — LocalNotificationAppleServiceCancelDeliveredResult

결과 케이스 와이어 코드 설명
Success — 알림을 지웠거나 지울 알림이 없습니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

발생 예외

예외 발생 조건
ArgumentNullException notificationId가 null인 경우

ListPendingAsync

getPendingNotificationRequests로 예약 대기 중인 알림 목록을 조회합니다. 알림마다 식별자, 예약 방식, 다음 표시 시각만 반환합니다.

Task<LocalNotificationAppleServiceListPendingResult> ListPendingAsync(CancellationToken ct = default)
항목 값
응답 ListPendingResponse

결과 케이스 — LocalNotificationAppleServiceListPendingResult

결과 케이스 와이어 코드 설명
Success — 조회에 성공했습니다. 예약 대기 알림이 없으면 Data.Requests가 비어 있습니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

ListDeliveredAsync

getDeliveredNotifications로 알림 센터에 남아 있는 알림 목록을 조회합니다. 알림마다 식별자와 전달 시각만 반환합니다.

Task<LocalNotificationAppleServiceListDeliveredResult> ListDeliveredAsync(CancellationToken ct = default)
항목 값
응답 ListDeliveredResponse

결과 케이스 — LocalNotificationAppleServiceListDeliveredResult

결과 케이스 와이어 코드 설명
Success — 조회에 성공했습니다. 알림 센터에 남은 알림이 없으면 Data.Notifications가 비어 있습니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

SetBadgeCountAsync

UNUserNotificationCenter.setBadgeCount(_:)로 앱 아이콘 배지 숫자를 설정합니다. 0을 지정하면 배지를 지웁니다. 앱 사용자가 알림을 탭해도 배지는 지워지지 않으므로, 배지를 지울 시점에 0으로 호출하세요.

앱 아이콘 배지는 앱 전체에 하나이므로 Apple Push Notification service 푸시 알림 Add-on과 공유합니다. 알림 내용의 NotificationContent.Badge 값과 별개로, 이 메서드는 현재 앱 아이콘 배지를 바로 바꿉니다.

Task<LocalNotificationAppleServiceSetBadgeCountResult> SetBadgeCountAsync(int count, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
count int Required 앱 아이콘에 표시할 배지 숫자입니다. 0이면 배지를 지웁니다. SDK는 값을 검증하지 않고 OS에 그대로 전달하며, 음수를 넣었을 때의 OS 동작은 정해져 있지 않으므로 0 이상의 값을 넣으세요.
항목 값
응답 SetBadgeCountResponse

결과 케이스 — LocalNotificationAppleServiceSetBadgeCountResult

결과 케이스 와이어 코드 설명
Success — 배지를 설정했습니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

OS 콜백 전달 메서드

앱의 델리게이트가 macOS의 알림 콜백을 Add-on에 넘길 때 호출하는 메서드입니다. Add-on은 앱의 UNUserNotificationCenterDelegate를 설치하거나 가로채지 않으므로, 델리게이트가 이 메서드를 호출해야 이벤트가 발생합니다. 각 메서드는 아래 표의 콜백에서 호출합니다.

호출 시점 메서드 호출 결과
userNotificationCenter(_:willPresent:withCompletionHandler:) NotifyWillPresentNotificationAsync() NotificationPresented 이벤트가 발생합니다.
userNotificationCenter(_:didReceive:withCompletionHandler:) NotifyDidReceiveResponseAsync() NotificationOpened 이벤트가 발생합니다.

앱의 델리게이트 하나가 원격 푸시 알림과 로컬 푸시 알림을 모두 받습니다. Add-on은 받은 알림이 자신이 예약한 알림인지 판단하지 않으므로, 앱이 알림을 구분해 알맞은 Add-on에 넘겨야 합니다. 요청의 트리거가 UNPushNotificationTrigger인 원격 푸시 알림은 Apple Push Notification service 푸시 알림 Add-on으로 넘기고, 나머지 로컬 푸시 알림은 이 Add-on으로 넘기세요. 이 Add-on으로 예약하지 않은 로컬 푸시 알림까지 구분해야 한다면, 예약할 때 notificationId에 앱이 정한 접두사를 붙이거나 예약한 식별자 목록을 보관해 알림 식별자로 확인하세요.

NotifyWillPresentNotificationAsync

userNotificationCenter(_:willPresent:withCompletionHandler:)에서 앱이 포그라운드에 있을 때 표시될 로컬 푸시 알림을 Add-on에 넘깁니다. Add-on은 NotificationPresented 이벤트를 발생시킵니다.

이 메서드는 알림 표시 방식을 정하지 않습니다. 배너, 알림음, 배지 같은 포그라운드 표시 옵션은 앱의 willPresent 델리게이트가 OS의 completionHandler에 직접 전달하며, 응답의 PresentationOptions는 항상 비어 있습니다.

Task<LocalNotificationAppleServiceNotifyWillPresentNotificationResult> NotifyWillPresentNotificationAsync(NotificationPayload notification, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
notification NotificationPayload Required 콜백으로 받은 UNNotification의 식별자와 내용을 담은 알림입니다.
항목 값
응답 NotifyWillPresentNotificationResponse

결과 케이스 — LocalNotificationAppleServiceNotifyWillPresentNotificationResult

결과 케이스 와이어 코드 설명
Success — 알림을 전달했습니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

발생 예외

예외 발생 조건
ArgumentNullException notification이 null인 경우

NotifyDidReceiveResponseAsync

userNotificationCenter(_:didReceive:withCompletionHandler:)에서 앱 사용자가 탭하거나 닫은 로컬 푸시 알림과 선택한 액션을 Add-on에 넘깁니다. 알림을 닫은 응답은 CustomDismissAction 옵션으로 등록한 알림 유형에서만 전달됩니다. Add-on은 NotificationOpened 이벤트를 발생시킵니다.

Task<LocalNotificationAppleServiceNotifyDidReceiveResponseResult> NotifyDidReceiveResponseAsync(NotificationPayload notification, string actionIdentifier, CancellationToken ct = default)
파라미터 타입 필수 여부 설명
notification NotificationPayload Required 콜백으로 받은 UNNotificationResponse.notification의 식별자와 내용을 담은 알림입니다.
actionIdentifier string Required 콜백으로 받은 UNNotificationResponse.actionIdentifier 값입니다. 가공하지 않고 넣습니다.
항목 값
응답 NotifyDidReceiveResponseResponse

결과 케이스 — LocalNotificationAppleServiceNotifyDidReceiveResponseResult

결과 케이스 와이어 코드 설명
Success — 알림과 액션을 전달했습니다.
UnknownOutcome UNKNOWN 이 SDK 버전이 알지 못하는 새 결과입니다.
Failure FAILURE 호출을 마치지 못했습니다. Problem의 HiveError로 원인을 확인합니다.

발생 예외

예외 발생 조건
ArgumentNullException notification 또는 actionIdentifier가 null인 경우

이벤트

두 이벤트 모두 엔진 메인 스레드에서 호출되므로 핸들러 안에서 엔진 API를 사용해도 됩니다.

NotificationPresented

앱이 포그라운드에 있을 때 로컬 푸시 알림이 표시되기 직전에, 앱의 델리게이트가 NotifyWillPresentNotificationAsync()로 알림을 넘기면 발생합니다. 델리게이트가 넘긴 알림을 가공하지 않고 전달합니다.

event Action<NotificationPayload> NotificationPresented
파라미터 타입 설명
— NotificationPayload 포그라운드에서 표시된 알림입니다.

NotificationOpened

앱 사용자가 로컬 푸시 알림이나 알림의 액션을 탭하거나 CustomDismissAction 옵션으로 등록한 알림 유형의 알림을 닫아, 앱의 델리게이트가 NotifyDidReceiveResponseAsync()로 넘기면 발생합니다. 탭한 알림과 선택한 액션을 함께 전달합니다.

event Action<LocalNotificationOpened> NotificationOpened
파라미터 타입 설명
— LocalNotificationOpened 탭한 알림과 선택한 액션입니다.

데이터 타입

ActionSpec

알림에 표시할 액션 버튼인 UNNotificationAction의 설정입니다.

필드 타입 필수 여부 설명
Identifier string Required 액션 식별자입니다. 앱 사용자가 이 액션을 선택하면 LocalNotificationOpened.ActionIdentifier로 전달됩니다.
Title string Required 버튼에 표시할 문구입니다. SDK 로그에 기록되지 않습니다.
Options IReadOnlyList<UNNotificationActionOption> Required 액션 동작 옵션 목록입니다. 옵션이 없으면 빈 목록입니다.

CancelDeliveredResponse

필드가 없습니다.

CancelPendingResponse

필드가 없습니다.

CategorySpec

알림 유형인 UNNotificationCategory의 설정입니다.

필드 타입 필수 여부 설명
Identifier string Required 알림 유형 식별자입니다. 알림을 예약할 때 NotificationContent.CategoryIdentifier에 이 값을 넣습니다. 비어 있으면 ArgumentException이 발생합니다.
Actions IReadOnlyList<ActionSpec> Required 이 알림 유형의 알림에 표시할 액션 버튼 목록입니다.
IntentIdentifiers IReadOnlyList<string> Required 이 알림 유형과 연결할 Siri 인텐트 식별자 목록인 UNNotificationCategory.intentIdentifiers입니다. 연결할 인텐트가 없으면 빈 목록입니다.
Options IReadOnlyList<UNNotificationCategoryOption> Required 알림 유형 옵션 목록입니다. 옵션이 없으면 빈 목록입니다.

DateComponents

ScheduleCalendarAsync()로 예약할 날짜와 시각 조건인 DateComponents입니다. 값을 지정한 필드가 모두 일치하는 시각에 알림이 표시되며, 지정하지 않은 필드는 조건에 포함되지 않습니다. 예를 들어 Hour를 0으로 지정하면 자정이라는 조건이 되고, 지정하지 않으면 시 조건이 없습니다.

한 번만 표시할 알림은 Year, Month, Day와 시각을 지정하고 repeats를 false로 예약합니다. 절대 날짜는 요일을 이미 정하므로 Year, Month, Day와 Weekday를 함께 지정하지 마세요. 요일이 맞지 않으면 조건이 성립하지 않습니다.

반복 예약에서는 Year를 빼고, 지정한 필드 조합으로 반복 주기를 정합니다.

지정한 필드 반복 주기
Hour, Minute 매일
Weekday, Hour, Minute 매주
Day, Hour, Minute 매월
Month, Day, Hour, Minute 매년
필드 타입 필수 여부 설명
Year int? Optional 연도입니다. 반복 예약에서는 지정하지 마세요.
Month int? Optional 월입니다. 1~12 범위입니다.
Day int? Optional 일입니다. 1~31 범위입니다.
Hour int? Optional 시입니다. 0~23 범위입니다.
Minute int? Optional 분입니다. 0~59 범위입니다.
Second int? Optional 초입니다. 0~59 범위입니다.
Weekday int? Optional 요일입니다. 그레고리력 기준으로 1은 일요일, 7은 토요일입니다. 매주 반복할 때 사용하며 Year, Month, Day와 함께 지정하지 마세요.
TimeZoneIdentifier string Required 조건을 판단할 시간대 식별자입니다. 예: Asia/Seoul. 빈 문자열이거나 없는 식별자이면 기기의 현재 캘린더 시간대를 사용합니다.

DeliveredNotificationSummary

알림 센터에 남아 있는 알림 하나의 요약입니다.

필드 타입 필수 여부 설명
NotificationId string Required 알림을 예약할 때 지정한 식별자입니다.
DeliveredAtUnixMillis long Required 알림이 전달된 시각입니다. Unix epoch 밀리초입니다.

ListDeliveredResponse

필드 타입 필수 여부 설명
Notifications IReadOnlyList<DeliveredNotificationSummary> Required 알림 센터에 남아 있는 알림 목록입니다. 없으면 빈 목록입니다.

ListPendingResponse

필드 타입 필수 여부 설명
Requests IReadOnlyList<UNNotificationRequestSummary> Required 예약 대기 중인 알림 목록입니다. 없으면 빈 목록입니다.

LocalNotificationOpened

NotificationOpened 이벤트로 전달되는 값입니다. 앱 사용자가 탭한 알림과 선택한 액션을 함께 담습니다.

프로퍼티 타입 필수 여부 설명
Notification NotificationPayload Required 앱 사용자가 탭한 알림입니다.
ActionIdentifier string Required 앱 사용자가 선택한 액션의 식별자인 UNNotificationResponse.actionIdentifier입니다. 알림 자체를 탭하면 UNNotificationDefaultActionIdentifier 상수의 값인 com.apple.UNNotificationDefaultActionIdentifier, 알림 유형에 등록한 액션을 선택하면 그 액션의 ActionSpec.Identifier입니다. CustomDismissAction 옵션으로 등록한 알림 유형의 알림을 닫으면 UNNotificationDismissActionIdentifier 상수의 값인 com.apple.UNNotificationDismissActionIdentifier입니다. 델리게이트가 NotifyDidReceiveResponseAsync()에 빈 문자열을 넘기면 빈 문자열이며, 이 경우에도 이벤트는 발생합니다.

NotificationAttachment

알림에 첨부할 미디어인 UNNotificationAttachment의 설정입니다. 로컬 파일만 첨부할 수 있으며, Add-on은 원격 URL의 파일을 내려받지 않습니다. 원격 이미지를 첨부하려면 앱이 파일을 기기에 저장한 뒤 그 파일 URL을 넣으세요.

필드 타입 필수 여부 설명
Identifier string Required 한 알림 안에서 고유한 첨부 식별자입니다.
LocalFileUrl string Required 첨부할 파일의 로컬 파일 URL 문자열입니다. 예: file:///.... URL을 해석할 수 없거나 OS가 파일을 거부하면 이 첨부만 빠지고 알림은 그대로 예약됩니다.
TypeHint string Required 파일 형식을 알려 주는 Apple의 Uniform Type Identifier(UTType) 문자열입니다. 빈 문자열이면 OS가 파일 확장자로 형식을 판단합니다.

NotificationContent

예약할 알림의 내용인 UNMutableNotificationContent의 설정입니다. Add-on은 기본값을 따로 채우지 않고 지정한 값을 OS에 그대로 전달합니다.

필드 타입 필수 여부 설명
Title string Required 알림 제목입니다. SDK 로그에 기록되지 않습니다.
Subtitle string Required 알림 부제목입니다. SDK 로그에 기록되지 않습니다.
Body string Required 알림 본문입니다. SDK 로그에 기록되지 않습니다.
Badge int Required 알림이 전달될 때 앱 아이콘에 표시할 배지 숫자입니다. 0이면 배지를 바꾸지 않으므로, 배지를 지우려면 SetBadgeCountAsync()를 사용하세요.
Sound string Required 알림음입니다. default이면 기본 알림음을, 그 밖의 값이면 앱에 포함한 알림음 파일 이름을 사용하며, 빈 문자열이면 알림음 없이 표시됩니다.
CategoryIdentifier string Required RegisterCategoryAsync()로 등록한 알림 유형의 식별자입니다. 알림 유형을 쓰지 않으면 빈 문자열입니다.
ThreadIdentifier string Required 관련 알림을 묶어 표시하는 데 쓰는 스레드 식별자입니다. 묶지 않으면 빈 문자열입니다.
InterruptionLevel UNContentInterruptionLevel Required 알림의 중요도와 전달 시점입니다. Unspecified이면 OS 기본값인 Active로 전달됩니다.
RelevanceScore double Required 시스템이 알림의 우선순위를 판단할 때 참조하는 0.0~1.0 범위의 점수입니다.
UserInfoJson string Required 알림에 담을 사용자 정의 데이터를 JSON 객체 문자열로 넣습니다. 중첩된 값도 그대로 담깁니다. 빈 문자열이거나 JSON 객체가 아니면 사용자 정의 데이터 없이 예약됩니다. SDK 로그에 기록되지 않습니다.
Attachments IReadOnlyList<NotificationAttachment> Required 알림에 첨부할 로컬 파일 목록입니다. 첨부가 없으면 빈 목록입니다.

NotificationPayload

OS 콜백 전달 메서드에 넘기고 NotificationPresented 이벤트로 받는 알림입니다. 알림 식별자와 내용을 담습니다.

필드 타입 필수 여부 설명
NotificationId string Required 알림 요청의 식별자인 UNNotification.request.identifier입니다. 이 Add-on으로 예약한 알림이면 예약할 때 지정한 notificationId입니다.
Content NotificationContent Required 알림 내용입니다.

NotifyDidReceiveResponseResponse

필드가 없습니다.

NotifyWillPresentNotificationResponse

필드 타입 필수 여부 설명
PresentationOptions IReadOnlyList<UNForegroundPresentationOption> Required 항상 빈 목록입니다. 포그라운드 표시 옵션은 앱의 willPresent 델리게이트가 OS의 completionHandler에 직접 전달합니다.

RegisterCategoryResponse

필드가 없습니다.

RequestPermissionResponse

필드 타입 필수 여부 설명
Granted bool Required 앱 사용자가 알림 권한을 허용했으면 true입니다. 옵션별 허용 여부는 반환하지 않습니다.

ScheduleCalendarResponse

필드 타입 필수 여부 설명
NotificationId string Required 예약한 알림의 식별자입니다. 요청한 notificationId와 같습니다.

ScheduleTimeIntervalResponse

필드 타입 필수 여부 설명
NotificationId string Required 예약한 알림의 식별자입니다. 요청한 notificationId와 같습니다.

SetBadgeCountResponse

필드가 없습니다.

UNNotificationRequestSummary

예약 대기 중인 알림 하나의 요약입니다.

필드 타입 필수 여부 설명
NotificationId string Required 알림을 예약할 때 지정한 식별자입니다.
TriggerKind NotificationTriggerKind Required 알림의 예약 방식입니다.
NextTriggerAtUnixMillis long Required 다음에 알림이 표시될 시각입니다. Unix epoch 밀리초이며, 다음 표시 시각이 없으면 0입니다.

열거형

Add-on 열거형은 C# 멤버 이름으로 지정합니다. 표의 '값'은 직렬화에 사용하는 정수입니다.

NotificationTriggerKind

예약 대기 알림의 예약 방식입니다.

C# 멤버 값 설명
Unspecified 0 예약 방식이 지정되지 않은 기본값입니다.
TimeInterval 1 ScheduleTimeIntervalAsync()처럼 시간 간격으로 예약한 알림입니다.
Calendar 2 ScheduleCalendarAsync()처럼 날짜와 시각 조건으로 예약한 알림입니다.
Push 3 대기 중인 원격 푸시 알림입니다. 이 Add-on으로 예약한 알림에는 해당하지 않습니다.
Unknown 4 위치 기반처럼 이 Add-on이 다루지 않는 방식의 알림입니다.

UNContentInterruptionLevel

알림의 중요도와 전달 시점인 UNNotificationInterruptionLevel입니다.

C# 멤버 값 설명
Unspecified 0 수준을 지정하지 않은 기본값입니다. OS 기본값인 Active로 전달됩니다.
Passive 1 화면을 켜거나 소리를 내지 않고 알림 목록에만 추가합니다.
Active 2 즉시 표시하고 화면을 켜며, 알림음이 설정되어 있으면 소리를 냅니다.
TimeSensitive 3 즉시 표시하며 집중 모드나 방해 금지 모드에서도 알림을 표시할 수 있습니다. 앱이 com.apple.developer.usernotifications.time-sensitive 엔타이틀먼트를 선언하지 않으면 OS가 Passive로 낮춰 전달합니다.
Critical 4 방해 금지 모드를 무시하고 소리를 냅니다. Apple의 승인을 받은 중요 알림 엔타이틀먼트가 필요합니다.

UNForegroundPresentationOption

포그라운드 알림 표시 옵션인 UNNotificationPresentationOptions입니다. NotifyWillPresentNotificationResponse.PresentationOptions의 타입이며, 이 목록은 항상 비어 있습니다.

C# 멤버 값 설명
Unspecified 0 옵션이 없는 기본값입니다.
Badge 1 알림을 표시하면서 앱 아이콘 배지를 바꿉니다.
Sound 2 알림을 표시하면서 알림음을 재생합니다.
List 3 알림 센터에 표시합니다.
Banner 4 배너로 표시합니다.

UNLocalAuthorizationOption

RequestPermissionAsync()로 요청할 권한 옵션인 UNAuthorizationOptions입니다.

C# 멤버 값 설명
Unspecified 0 옵션이 없는 기본값입니다.
Badge 1 앱 아이콘 배지를 바꿀 수 있는 권한입니다.
Sound 2 알림음을 재생할 수 있는 권한입니다.
Alert 3 알림을 화면에 표시할 수 있는 권한입니다.
CarPlay 4 CarPlay 환경에서 알림을 표시할 수 있는 권한입니다.
CriticalAlert 5 방해 금지 모드를 무시하고 알림음을 재생하는 중요 알림 권한입니다. Apple의 승인을 받은 별도 엔타이틀먼트가 필요합니다.
ProvidesAppNotificationSettings 6 앱에 자체 알림 설정 화면이 있음을 OS에 알립니다. OS가 그 화면으로 이동하는 버튼을 표시합니다.
Provisional 7 권한 대화 상자 없이 알림 센터에 조용히 전달되는 임시 권한입니다.

UNNotificationActionOption

액션 버튼의 동작 옵션인 UNNotificationActionOptions입니다.

C# 멤버 값 설명
Unspecified 0 옵션이 없는 기본값입니다.
AuthenticationRequired 1 앱 사용자가 기기 잠금을 해제해야 액션이 실행됩니다.
Destructive 2 데이터를 삭제하거나 버리는 동작임을 경고하는 스타일로 버튼을 표시합니다. 일반적으로 빨간색으로 표시됩니다.
Foreground 3 앱 사용자가 액션을 선택하면 앱을 포그라운드로 가져옵니다.

UNNotificationCategoryOption

알림 유형 옵션인 UNNotificationCategoryOptions입니다.

C# 멤버 값 설명
Unspecified 0 옵션이 없는 기본값입니다.
CustomDismissAction 1 앱 사용자가 이 유형의 알림을 닫으면 OS가 닫기 액션을 앱에 전달합니다.
AllowInCarPlay 2 이 유형의 알림을 CarPlay 환경에 표시하는 옵션입니다. macOS에는 CarPlay가 없으므로 Add-on이 이 옵션을 무시합니다.
HiddenPreviewsShowTitle 3 앱 사용자가 알림 미리 보기를 끈 상태에서도 알림 제목을 표시합니다.
HiddenPreviewsShowSubtitle 4 앱 사용자가 알림 미리 보기를 끈 상태에서도 알림 부제목을 표시합니다.