다음을 통해 공유


사용자 알림

사용자 알림 프레임워크를 사용하면 로컬 및 원격 알림을 배달하고 처리할 수 있습니다. 이 프레임워크를 사용하여 앱 또는 앱 확장 프로그램은 위치 또는 시간 등의 조건 집합을 지정하여 로컬 알림 배달을 예약할 수 있습니다.

또한 앱 또는 확장은 사용자의 디바이스에 배달될 때 로컬 및 원격 알림을 모두 수신(및 잠재적으로 수정)할 수 있습니다.

사용자 알림 UI 프레임워크를 사용하면 앱 또는 앱 확장이 사용자에게 표시될 때 로컬 및 원격 알림의 모양을 사용자 지정할 수 있습니다.

이 프레임워크는 앱이 사용자에게 알림을 제공할 수 있는 다음과 같은 방법을 제공합니다.

  • 시각적 경고: 화면 위쪽에서 알림이 배너로 롤다운되는 위치입니다.
  • 소리 및 진동: 알림과 연결할 수 있습니다.
  • 앱 아이콘 배지: 앱의 아이콘에 읽지 않은 전자 메일 메시지 수와 같은 새 콘텐츠를 사용할 수 있음을 보여 주는 배지가 표시됩니다.

또한 사용자의 현재 컨텍스트에 따라 알림이 표시되는 다양한 방법이 있습니다.

  • 디바이스의 잠금이 해제된 경우 알림은 화면 위쪽에서 배너로 롤다운됩니다.
  • 디바이스가 잠겨 있으면 알림이 사용자의 잠금 화면에 표시됩니다.
  • 사용자가 알림을 놓친 경우 알림 센터를 열고 사용 가능한 대기 알림을 볼 수 있습니다.

앱은 다음 두 가지 유형의 사용자 알림을 보낼 수 있습니다.

  • 로컬 알림: 이러한 알림은 사용자 디바이스에 로컬로 설치된 앱에서 전송됩니다.
  • 원격 알림: 원격 서버에서 전송되고 사용자에게 표시되거나 앱 콘텐츠의 백그라운드 업데이트를 트리거합니다.

로컬 알림 정보

앱이 보낼 수 있는 로컬 알림에는 다음과 같은 기능과 특성이 있습니다.

  • 사용자의 디바이스에서 로컬인 앱에서 전송됩니다.
  • 시간 또는 위치 기반 트리거를 사용하도록 구성할 수 있습니다.
  • 앱은 사용자의 디바이스를 사용하여 알림을 예약하며 트리거 조건이 충족되면 표시됩니다.
  • 사용자가 알림과 상호 작용하면 앱은 콜백을 받습니다.

로컬 알림의 몇 가지 예는 다음과 같습니다.

  • 일정 경고.
  • 미리 알림 경고입니다.
  • 위치 인식 트리거입니다.

자세한 내용은 Apple의 사용자 알림 설명서를 참조하세요.

원격 알림 정보

앱이 보낼 수 있는 원격 알림에는 다음과 같은 기능과 특성이 있습니다.

  • 앱에는 통신하는 서버 쪽 구성 요소가 있습니다.
  • APN(Apple Push Notification Service)은 개발자의 클라우드 기반 서버에서 사용자의 디바이스로 원격 알림의 최상의 배달을 전송하는 데 사용됩니다.
  • 앱이 원격 알림을 받으면 사용자에게 표시됩니다.
  • 사용자가 알림과 상호 작용하면 앱은 콜백을 받습니다.

원격 알림의 몇 가지 예는 다음과 같습니다.

  • 뉴스 경고.
  • 스포츠 업데이트.
  • 인스턴트 메시징 메시지.

앱에는 다음 두 가지 유형의 원격 알림을 사용할 수 있습니다.

  • 사용자 표시: 디바이스에서 사용자에게 표시됩니다.
  • 무음 업데이트: 백그라운드에서 앱의 콘텐츠를 갱신하는 메커니즘을 제공합니다. 자동 업데이트가 수신되면 앱이 원격 서버에 연결하여 최신 콘텐츠를 끌어올 수 있습니다.

자세한 내용은 Apple의 사용자 알림 설명서를 참조하세요.

UIApplication API

UIApplication을 사용하여 시스템에 알림을 등록하고 시간 또는 위치별로 알림을 트리거하는 방법을 예약할 수 있습니다(Apple에서 사용자 알림에 대해 제공된 원래 API임).

그러나 UIApplication에서 제공하는 기존 알림을 사용할 때 개발자가 발생할 수 있는 몇 가지 문제가 있습니다.

  • 코드 중복으로 이어질 수 있는 로컬 또는 원격 알림에 필요한 콜백이 서로 다릅니다.
  • 앱은 시스템에 예약된 후 알림에 대한 제어 권한이 제한됩니다.
  • 애플의 모든 기존 플랫폼에 걸쳐 지원의 다른 수준이 있다.

사용자 알림 프레임워크 정보

알림 환경을 개선하기 위해 Apple은 위에서 언급한 기존 UIApplication 메서드를 대체하는 사용자 알림 프레임워크를 도입했습니다.

사용자 알림 프레임워크는 다음을 제공합니다.

  • 기존 프레임워크에서 코드를 쉽게 포팅할 수 있도록 이전 메서드와의 기능 패리티를 포함하는 친숙한 API입니다.
  • 사용자에게 더 풍부한 알림을 보낼 수 있는 확장된 콘텐츠 옵션 집합을 포함합니다.
  • 로컬 및 원격 알림은 모두 동일한 코드와 콜백으로 처리할 수 있습니다.
  • 사용자가 알림과 상호 작용할 때 앱에 전송되는 콜백을 처리하는 프로세스를 간소화합니다.
  • 알림을 제거하거나 업데이트하는 기능을 포함하여 보류 중인 알림과 배달된 알림을 모두 관리합니다.
  • 앱에서 알림 프레젠테이션을 수행할 수 있는 기능을 추가합니다.
  • 앱 확장 내에서 알림을 예약하고 처리하는 기능을 추가합니다.
  • 알림 자체에 대한 새 확장 지점을 추가합니다.

사용자 알림 프레임워크는 다음을 포함하여 Apple이 지원하는 여러 플랫폼에서 통합 알림 API를 제공합니다.

  • iOS: 알림을 관리하고 예약하기 위한 전폭적인 지원.
  • tvOS: 로컬 및 원격 알림에 대한 앱 아이콘을 배지로 지정하는 기능을 추가합니다.
  • Mac Catalyst: 알림을 관리하고 예약하기 위한 모든 지원.
  • macOS: 알림을 관리하고 예약하기 위한 모든 지원.

자세한 내용은 Apple의 사용자 알림 및 사용자 알림UI 설명서를 참조하세요.

알림 배달 준비

앱이 사용자에게 알림을 보내려면 먼저 앱을 시스템에 등록해야 하며, 알림이 사용자에 대한 중단이기 때문에 앱은 알림을 보내기 전에 명시적으로 권한을 요청해야 합니다.

사용자가 앱에 대해 승인할 수 있는 세 가지 알림 요청 수준이 있습니다.

  • 배너가 표시됩니다.
  • 소리 경고.
  • 앱 아이콘을 바딩합니다.

또한 로컬 및 원격 알림 모두에 대해 이러한 승인 수준을 요청하고 설정해야 합니다.

앱이 시작되는 즉시 다음 코드를 메서드 AppDelegate 에 추가하고 원하는 알림 유형(UNAuthorizationOptions)을 설정하여 FinishedLaunching 알림 권한을 요청해야 합니다.

using UserNotifications;

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
    // Request notification permissions from the user
    UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert, (approved, error) => {
        // Handle approval (or disapproval)
    });

    return true;
}

macOS에서 DidFinishLaunching 구현 내에서 수행합니다.

using UserNotifications;

public override void DidFinishLaunching (NSNotification notification)
{
    // Request notification permissions from the user
    UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound, (approved, error) => {
        // Handle approval (or disapproval)
    });
}

비고

디버그 모드에서 로컬로 빌드하는 경우에도 권한 대화 상자가 표시되려면 macOS 및 Mac Catalyst 앱에 서명해야 합니다. 프로젝트 파일에서 EnableCodeSigning 속성을 설정하여 true 앱이 강제로 서명되도록 합니다.

또한 사용자는 디바이스에서 설정 앱을 사용하여 언제든지 앱에 대한 알림 권한을 변경할 수 있습니다. 앱은 다음 코드를 사용하여 알림을 표시하기 전에 사용자의 요청된 알림 권한을 확인해야 합니다.

// Get current notification settings
UNUserNotificationCenter.Current.GetNotificationSettings ((settings) => {
    var alertsAllowed = (settings.AlertSetting == UNNotificationSetting.Enabled);
});

백그라운드 알림 사용

앱이 백그라운드 알림을 받으려면 앱에 대한 원격 알림 백그라운드 모드를 사용하도록 설정해야 합니다.

이 작업은 프로젝트의 Info.plist 파일 내 UIBackgroundModes 배열에 remote-notifications 항목을 추가하여 다음과 같이 수행됩니다.

<key>UIBackgroundModes</key>
<array>
    <string>remote-notification</string>
</array>

원격 알림 환경 구성

개발자는 OS에 어떤 환경 푸시 알림 중 하나 development 또는 production로 실행 중인지 알려야 합니다. 이 정보를 제공하지 않으면 다음과 유사한 알림을 사용하여 앱 스토어에 제출할 때 앱이 거부될 수 있습니다.

푸시 알림 자격 누락 - 앱에 Apple 푸시 알림 서비스에 대한 API가 포함되어 있지만 aps-environment 앱 서명에서 자격이 누락되었습니다.

필요한 자격을 제공하려면 다음을 수행합니다.

  1. 선택한 텍스트 편집기에서 프로젝트 파일을 엽니다.

  2. 다음과 같이 두 CustomEntitlements 항목을 입력합니다.

    <ItemGroup>
        <CustomEntitlements Include="aps-environment" Type="String" Value="development" Condition="'$(Configuration)' != 'Release'" />
        <CustomEntitlements Include="aps-environment" Type="String" Value="production" Condition="'$(Configuration)' == 'Release'" />
    </ItemGroup>
    

    참고: App Store에 배포하기 위해 Release와 다른 구성을 사용하는 경우, 그에 따라 조건을 업데이트합니다.

비고

aps-environment 또한 Entitlements.plist 파일에서 설정할 수 있습니다. 이는 지금까지 수행된 방식입니다. 프로젝트 파일을 사용하면 빌드 구성에 따라 development 또는 production의 올바른 값을 자동으로 사용하기가 더 쉽다는 점이 장점입니다.

프로비저닝

이전 섹션의 aps-environment 권한을 사용하려면 Push Notifications 기능이 포함된 프로비저닝 프로필을 사용해야 합니다.

  1. Apple 개발자 사이트의 식별자 섹션으로 이동합니다.

    식별자 섹션

  2. 새 식별자 추가(새 식별자 등록):

    새 식별자 등록

  3. '앱' 유형을 선택합니다.

    '앱' 유형 선택

  4. 새 앱 식별자에 대한 번들 식별자 및 설명을 입력합니다.

    앱 ID 등록

  5. Push Notifications 기능을 사용하도록 설정합니다.

    활성화된 푸시 알림 기능'

  6. Register 앱 식별자를 저장하려면 클릭합니다.

다음 단계는 새 앱 식별자에 대한 프로비저닝 프로필을 만드는 것입니다.

  1. Apple 개발자 사이트의 프로필 섹션으로 이동합니다.

    프로필 섹션

  2. iOS 앱 개발을 위한 새 프로필을 추가합니다.

    새 프로비저닝 프로필 등록

  3. 방금 만든 앱 ID를 선택합니다.

    앱 ID 선택

  4. 이 프로비저닝 프로필에 포함된 모든 인증서를 선택합니다(아직 만들어지지 않은 경우 새 인증서를 크롤링해야 함).

    인증서 선택

  5. 이 프로비전 프로필에 포함된 모든 디바이스를 선택합니다(앱은 이러한 디바이스에만 설치할 수 있습니다).

    디바이스 선택

  6. 프로비저닝 프로필의 이름을 선택하고 확인합니다.

    검토하고 이름 지정

  7. 새 프로비저닝 프로필을 생성하고 다운로드합니다.

    창조하다

  8. 다운로드한 프로비전 프로필 파일을 Xcode에서 열어(Finder에서 두 번 클릭하여) 시스템에 설치합니다.

  9. 6단계에서 프로비저닝 프로필의 이름으로 속성을 설정 CodesignProvision 하여 새로 만든 프로비저닝 프로필을 사용하도록 프로젝트를 구성합니다.

    <PropertyGroup>
        <CodesignProvision>User Notifications Profile</CodesignProvision>
    </PropertyGroup>
    

비고

앱에 알림을 처리하는 앱 확장이 있는 경우 각 해당 앱 확장 프로젝트에 대해 이 프로세스를 반복해야 합니다. 각 앱에는 고유한 앱 식별자 및 프로비저닝 프로필이 있어야 합니다.

원격 알림 등록

앱이 원격 알림을 보내고 받는 경우에도 기존 UIApplication API를 사용하여 토큰 등록을 수행해야 합니다. 이 등록을 위해서는 APN에 액세스하기 위해 디바이스에 라이브 네트워크 연결이 있어야 합니다. 그러면 앱에 전송되는 데 필요한 토큰이 생성됩니다. 그런 다음, 앱은 이 토큰을 개발자의 서버 쪽 앱에 전달하여 원격 알림에 등록해야 합니다.

토큰 등록 개요

다음 코드를 사용하여 필요한 등록을 초기화합니다.

UIApplication.SharedApplication.RegisterForRemoteNotifications ();

개발자의 서버 쪽 앱으로 전송되는 토큰은 원격 알림을 보낼 때 서버에서 APN으로 전송되는 알림 페이로드의 일부로 포함되어야 합니다.

알림 페이로드의 일부로 포함된 토큰

토큰은 알림과 알림을 열거나 응답하는 데 사용되는 앱을 연결하는 키 역할을 합니다.

자세한 내용은 Apple의 사용자 알림 설명서를 참조하세요.

알림 배달

앱이 완전히 등록되고 사용자가 요청 및 부여한 필수 권한이 있으면 이제 앱이 알림을 보내고 받을 준비가 되었습니다.

알림 콘텐츠 제공

모든 알림에는 항상 알림 콘텐츠의 본문과 함께 표시되는 제목부제목이 모두 포함됩니다. 알림 콘텐츠에 미디어 첨부 파일을 추가하는 기능도 있습니다.

로컬 알림의 콘텐츠를 만들려면 다음 코드를 사용합니다.

var content = new UNMutableNotificationContent();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;

원격 알림의 경우 프로세스는 다음과 유사합니다.

{
    "aps":{
        "alert":{
            "title":"Notification Title",
            "subtitle":"Notification Subtitle",
            "body":"This is the message body of the notification."
        },
        "badge":1
    }
}

알림 발송 일정 설정

알림 콘텐츠를 만든 상태에서 앱은 트리거를 설정하여 알림이 사용자에게 표시되는 시기를 예약해야 합니다. 다음과 같은 네 가지 트리거 유형이 있습니다.

  • 푸시 알림 - 원격 알림과 함께 단독으로 사용되며 APN이 디바이스에서 실행되는 앱에 알림 패키지를 보낼 때 트리거됩니다.
  • 시간 간격 - 지금부터 시작하여 몇 가지 미래 시점을 종료하는 시간 간격에서 로컬 알림을 예약할 수 있습니다. 예를 들어:
    var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);
    
  • 일정 날짜 - 특정 날짜 및 시간에 대한 로컬 알림을 예약할 수 있습니다.
  • 위치 기반 - 디바이스가 특정 지리적 위치로 들어오거나 나가는 경우 또는 Bluetooth 비콘과 지정된 근접 위치에 있을 때 로컬 알림을 예약할 수 있습니다.

로컬 알림이 준비되면 앱은 UNUserNotificationCenter.AddNotificationRequest 를 호출하여 사용자에게 표시를 예약해야 합니다. 원격 알림의 경우 서버 쪽 앱은 APN에 알림 페이로드를 보낸 다음, 사용자의 디바이스에 패킷을 보냅니다.

모든 부분을 함께 가져오면 샘플 로컬 알림이 다음과 같이 표시될 수 있습니다.

using UserNotifications;

public void SendLocalNotification ()
{
    var content = new UNMutableNotificationContent ();
    content.Title = "Notification Title";
    content.Subtitle = "Notification Subtitle";
    content.Body = "This is the message body of the notification.";
    content.Badge = 1;

    var trigger =  UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);

    var requestId = "sampleRequest";
    var request = UNNotificationRequest.FromIdentifier (requestId, content, trigger);

    UNUserNotificationCenter.Current.AddNotificationRequest (request, (err) => {
        if (err is not null) {
            // Do something with error
        }
    });
}

원격 알림 트리거

테스트용으로 개발하는 동안 원격 알림을 트리거하는 여러 가지 방법이 있습니다.

앱이 릴리스되면 일반적으로 서버 쪽 앱에서 원격 알림이 트리거됩니다.

포그라운드 앱 알림 처리

앱은 포그라운드에 있고 알림이 트리거될 때 알림을 다르게 처리할 수 있습니다. UNUserNotificationCenterDelegate를 제공하고 WillPresentNotification 메서드를 구현하면 앱이 알림을 표시하는 책임을 맡을 수 있습니다. 다음은 그 예입니다.

using System;
using UserNotifications;

public class UserNotificationCenterDelegate : UNUserNotificationCenterDelegate
{
    #region Constructors
    public UserNotificationCenterDelegate ()
    {
    }
    #endregion

    #region Override Methods
    public override void WillPresentNotification (UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
    {
        // Do something with the notification
        Console.WriteLine ("Active notification: {0}", notification);

        // Tell system to display the notification anyway or use
        // `None` to say we have handled the display locally.
        completionHandler (UNNotificationPresentationOptions.Alert);
    }
    #endregion
}

이 코드는 단순히 UNNotification 의 내용을 애플리케이션 출력에 작성하고 시스템에 알림에 대한 표준 경고를 표시하도록 요청하는 것입니다.

앱이 포그라운드에 있을 때 알림 자체를 표시하고 시스템 기본값을 사용하지 않길 원하는 경우 완료 처리기에 None 을 전달합니다. 예제:

completionHandler (UNNotificationPresentationOptions.None);

이 코드가 준비되면 편집할 파일을 열고 AppDelegate.cs 메서드를 FinishedLaunching 다음과 같이 변경합니다.

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
    // Request notification permissions from the user
    UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert, (approved, err) => {
        // Handle approval
    });

    // Watch for notifications while the app is active
    UNUserNotificationCenter.Current.Delegate = new UserNotificationCenterDelegate ();

    return true;
}

이 코드는 위에서 정의한 사용자 지정 UNUserNotificationCenterDelegate를 현재 UNUserNotificationCenter에 연결하여, 앱이 활성 상태로 포그라운드에 있을 때 알림을 처리할 수 있도록 합니다.

알림 관리

알림 관리는 보류 중인 알림과 배달된 알림 모두에 대한 액세스를 제공하고 이러한 알림을 제거, 업데이트 또는 승격하는 기능을 추가합니다.

알림 관리의 중요한 부분은 알림을 만들고 시스템으로 예약할 때 알림에 할당된 요청 식별자 입니다. 원격 알림의 경우 HTTP 요청 헤더의 apps-collapse-id 필드를 통해 할당됩니다.

요청 식별자는 앱이 알림 관리를 수행하려는 알림을 선택하는 데 사용됩니다.

알림 제거

시스템에서 보류 중인 알림을 제거하려면 다음 코드를 사용합니다.

var requests = new string [] { "sampleRequest" };
UNUserNotificationCenter.Current.RemovePendingNotificationRequests (requests);

이미 배달된 알림을 제거하려면 다음 코드를 사용합니다.

var requests = new string [] { "sampleRequest" };
UNUserNotificationCenter.Current.RemoveDeliveredNotifications (requests);

기존 알림 업데이트

기존 알림을 업데이트하려면 원하는 매개 변수가 수정된 새 알림(예: 새 트리거 시간)을 사용하여 새 알림을 만들고 수정해야 하는 알림과 동일한 요청 식별자를 사용하여 시스템에 추가하면 됩니다. 예제:

using UserNotifications;

// Rebuild notification
var content = new UNMutableNotificationContent ();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;

// New trigger time
var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (10, false);

// Id of notification to be updated
var requestId = "sampleRequest";
var request = UNNotificationRequest.FromIdentifier (requestId, content, trigger);

// Add to system to modify existing Notification
UNUserNotificationCenter.Current.AddNotificationRequest (request, (err) => {
    if (err != null) {
        // Do something with error...
    }
});

이미 배달된 알림의 경우 기존 알림이 업데이트되고 사용자가 이미 읽은 경우 홈 및 잠금 화면 및 알림 센터에서 목록의 맨 위로 승격됩니다.

알림 작업

사용자에게 전달되는 알림은 정적이지 않으며 사용자가 상호 작용할 수 있는 여러 가지 방법을 제공합니다(기본 제공에서 사용자 지정 작업까지).

앱이 응답할 수 있는 세 가지 유형의 작업이 있습니다.

  • 기본 작업 - 사용자가 알림을 탭하여 앱을 열고 지정된 알림의 세부 정보를 표시하는 경우입니다.
  • 사용자 지정 작업 - 사용자가 앱을 시작할 필요 없이 알림에서 직접 사용자 지정 작업을 수행할 수 있는 빠른 방법을 제공합니다. 사용자 지정 가능한 제목이 있는 단추 목록 또는 백그라운드에서 실행할 수 있는 텍스트 입력 필드(앱에 요청을 이행하는 데 약간의 시간이 부여됨) 또는 포그라운드(요청을 수행하기 위해 앱이 포그라운드에서 시작되는 위치)로 표시될 수 있습니다.
  • 해제 작업 - 사용자가 지정된 알림을 해제하면 이 작업이 앱으로 전송됩니다.

사용자 지정 작업 만들기

사용자 지정 작업을 만들고 시스템에 등록하려면 다음 코드를 사용합니다.

// Create action
var actionId = "reply";
var title = "Reply";
var action = UNNotificationAction.FromIdentifier (actionId, title, UNNotificationActionOptions.None);

// Create category
var categoryId = "message";
var actions = new UNNotificationAction [] { action };
var intentIds = new string [] { };
var categoryOptions = new UNNotificationCategoryOptions [] { };
var category = UNNotificationCategory.FromIdentifier (categoryId, actions, intentIds, UNNotificationCategoryOptions.None);
    
// Register category
var categories = new UNNotificationCategory [] { category };
UNUserNotificationCenter.Current.SetNotificationCategories (new NSSet<UNNotificationCategory>(categories)); 

UNNotificationAction을 만들 때 단추에 표시될 고유 식별자와 제목이 할당됩니다. 기본적으로 작업은 백그라운드 작업으로 생성되지만 작업의 동작을 조정하는 옵션을 제공할 수 있습니다(예: 포그라운드 작업으로 설정).

만든 각 작업은 범주와 연결되어야 합니다. 새 UNNotificationCategory를 만들 때 고유 식별자, 수행할 수 있는 작업 목록, 범주에서 작업의 의도에 대한 자세한 정보를 제공하는 의도 식별자 목록 및 범주의 동작을 제어하는 몇 가지 옵션이 할당됩니다.

마지막으로 모든 범주는 SetNotificationCategories 메서드를 사용하여 시스템에 등록됩니다.

사용자 지정 작업 표시

사용자 지정 작업 및 범주 집합이 만들어지고 시스템에 등록되면 로컬 또는 원격 알림에서 표시할 수 있습니다.

원격 알림의 경우 위에서 만든 범주 중 하나와 일치하는 원격 알림 페이로드를 설정합니다 category . 다음은 그 예입니다.

{
    aps: {
        alert:"Hello world!",
        category:"message"
    }
}

로컬 알림의 경우 개체의 CategoryIdentifierUNMutableNotificationContent 속성을 설정합니다. 다음은 그 예입니다.

var content = new UNMutableNotificationContent ();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;
content.CategoryIdentifier = "message";

이 식별자는 위에서 만든 범주 중 하나와 일치해야 합니다.

해제 작업 처리

위에서 설명한 대로 사용자가 알림을 해제할 때 해제 작업을 앱에 보낼 수 있습니다. 표준 작업이 아니므로 범주를 만들 때 옵션을 설정해야 합니다. 다음은 그 예입니다.

var categoryId = "message";
var actions = new UNNotificationAction [] { action };
var intentIds = new string [] { };
var categoryOptions = new UNNotificationCategoryOptions [] { };
var category = UNNotificationCategory.FromIdentifier (categoryId, actions, intentIds, UNNotificationCategoryOptions.CustomDismissAction);

작업 응답 처리

사용자가 위에서 만든 사용자 지정 작업 및 범주와 상호 작용할 때 앱은 요청된 작업을 수행해야 합니다. 이 작업은 [UNUserNotificationCenterDelegate][unnsernotificationcenterdelegate]를 제공하고 DidReceiveNotificationResponse 메서드를 구현하여 수행됩니다. 다음은 그 예입니다.

using System;
using UserNotifications;

namespace MonkeyNotification
{
    public class UserNotificationCenterDelegate : UNUserNotificationCenterDelegate
    {
        ...

        #region Override methods
        public override void DidReceiveNotificationResponse (UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
        {
            // Take action based on Action ID
            switch (response.ActionIdentifier) {
            case "reply":
                // Do something
                break;
            default:
                // Take action based on identifier
                if (response.IsDefaultAction) {
                    // Handle default action...
                } else if (response.IsDismissAction) {
                    // Handle dismiss action
                }
                break;
            }

            // Inform caller it has been handled
            completionHandler();
        }
        #endregion
    }
}

전달된 UNNotificationResponse 클래스에는 ActionIdentifier 기본 작업 또는 해제 작업일 수 있는 속성이 있습니다. 사용자 지정 작업을 테스트하는 데 사용합니다 response.Notification.Request.Identifier .

이 속성은 UserText 모든 사용자 텍스트 입력의 값을 보유합니다. 이 속성은 Notification 트리거 및 알림 콘텐츠가 포함된 요청을 포함하는 원래 알림을 보유합니다. 앱은 트리거 유형에 따라 로컬 또는 원격 알림인지 결정할 수 있습니다.

알림 서비스 확장 기능 작업

원격 알림을 사용할 때 알림 서비스 확장은 알림 페이로드 내에서 엔드 투 엔드 암호화를 사용하도록 설정하는 방법을 제공합니다. Notification Service 확장은 사용자에게 표시되기 전에 알림의 표시되는 콘텐츠를 보강하거나 바꾸기 위한 주요 목적으로 백그라운드에서 실행되는 비 사용자 인터페이스 확장입니다.

Notification Service 확장 개요

Notification Service 확장은 신속하게 실행되도록 하며 시스템에서 실행하는 데 짧은 시간만 제공됩니다. 알림 서비스 확장이 할당된 시간 동안 해당 작업을 완료하지 못하는 경우 대체 메서드가 호출됩니다. 대체에 실패하면 원래 알림 콘텐츠가 사용자에게 표시됩니다.

Notification Service 확장의 몇 가지 잠재적 사용은 다음과 같습니다.

  • 원격 알림 콘텐츠의 엔드 투 엔드 암호화를 제공합니다.
  • 원격 알림에 첨부 파일을 추가하여 보강합니다.

Notification Service 확장 구현

앱에서 Notification Service 확장을 구현하려면 다음을 수행합니다.

  1. 기본 프로젝트의 폴더 옆에 확장 프로젝트에 대한 새 폴더를 만듭니다. 다음 지침에서는 새 폴더의 이름을 MyNotificationServiceExtension가정합니다.

  2. 터미널을 열고 다음을 실행합니다.

    dotnet new ios-notification-service-extension
    
  3. 주 프로젝트의 프로젝트 파일을 열고 다음을 추가합니다.

    <ItemGroup>
        <ProjectReference Include="..\MyNotificationServiceExtension\MyNotificationServiceExtension.csproj">
            <IsAppExtension>true</IsAppExtension>
        </ProjectReference>
    </ItemGroup>
    
  4. 이제 기본 프로젝트를 빌드하고 확장 프로젝트도 빌드되고 최종 앱 번들에 포함됩니다.

중요합니다

Mac과 연결된 디바이스 간의 상호 작용이 Mac에서 처리되는 방식의 변경으로 인해 현재 디버거를 사용하여 앱 확장을 디버그할 수 없습니다. 자세한 up-to-date 정보도 https://github.com/xamarin/xamarin-macios/issues/19484 참조하세요.

즉, 앱 확장을 디버그하는 가장 신뢰할 수 있는 방법은 코드에 Console.WriteLine 문을 추가한 다음 디바이스 로그에서 해당 문을 찾는 것입니다.

중요합니다

서비스 확장에 대한 번들 식별자(ApplicationId)는 주 앱의 번들 식별자를 접두사로 묶어야 합니다. 예를 들어 주 앱에 번들 식별자가 com.xamarin.monkeynotify있는 경우 서비스 확장에는 번들 식별자가 com.xamarin.monkeynotify.monkeynotifyserviceextension있어야 합니다.

Notification Service 확장에는 필요한 기능을 제공하기 위해 수정해야 하는 하나의 기본 클래스가 있습니다. 다음은 그 예입니다.

using System;

using Foundation;
using UIKit;
using UserNotifications;

namespace MonkeyChatServiceExtension
{
    [Register ("NotificationService")]
    public class NotificationService : UNNotificationServiceExtension
    {
        protected NotificationServiceClass (NativeHandle handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic,
            // it only exists so that the OS can instantiate an instance of this class.
        }

        public override void DidReceiveNotificationRequest (UNNotificationRequest request, Action<UNNotificationContent> contentHandler)
        {
            // Called when the OS receives a notification that can be muteated

            // Create a mutable copy of the notification
            var mutableRequest = (UNMutableNotificationContent) request.Content.MutableCopy ();

            // Modify the notification content here...
            mutableRequest.Title = $"[modified] {mutableRequest.Title}";

            // Call the contentHandler callback to let the OS know about the modified notification.
            contentHandler (mutableRequest);
        }

        public override void TimeWillExpire ()
        {
            // Called just before the extension will be terminated by the system.
            // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        }
    }
}

첫 번째 메서드인 DidReceiveNotificationRequest는 개체를 통해 request 알림 콘텐츠뿐만 아니라 알림 식별자를 전달합니다. 전달된 contentHandler를 호출하여 사용자에게 알림을 표시해야 합니다.

두 번째 메서드인 TimeWillExpire는 알림 서비스 확장이 요청을 처리하기 위해 시간이 다 되도록 하기 직전에 호출됩니다. 알림 서비스 확장이 주어진 시간을 초과하여 contentHandler 을 호출하지 못하면 사용자에게 원래 콘텐츠가 표시됩니다.

알림 서비스 확장 기능 활성화

알림 서비스 확장이 만들어지고 앱과 함께 제공되면 디바이스로 전송된 원격 알림 페이로드를 수정하여 트리거할 수 있습니다. 다음은 그 예입니다.

{
    aps : {
        alert : "New Message Available",
        mutable-content: 1
    },
    encrypted-content : "#theencryptedcontent"
}

mutable-content 키는 원격 알림 콘텐츠를 업데이트하기 위해 Notification Service 확장을 시작해야 한다고 지정합니다. 키는 encrypted-content 알림 서비스 확장이 사용자에게 표시하기 전에 암호 해독할 수 있는 암호화된 데이터를 보유합니다.

다음 예제 Notification Service 확장을 살펴보세요.

using UserNotification;

namespace myApp {
    public class NotificationService : UNNotificationServiceExtension {
    
        public override void DidReceiveNotificationRequest(UNNotificationRequest request, contentHandler) {
            // Decrypt payload
            var decryptedBody = Decrypt(Request.Content.UserInfo["encrypted-content"]);
            
            // Modify notification body
            var newContent = new UNMutableNotificationContent();
            newContent.Body = decryptedBody;
            
            // Present to user
            contentHandler(newContent);
        }
        
        public override void TimeWillExpire() {
            // Handle out-of-time fallback event
        }
        
    }
}

이 코드는 키에서 암호화된 콘텐츠의 encrypted-content 암호를 해독하고, 새 UNMutableNotificationContent를 만들고, Body 속성을 암호 해독된 콘텐츠로 설정하고, 이를 사용하여 contentHandler 사용자에게 알림을 표시합니다.

참고하십시오