Xamarin.iOS의 향상된 사용자 알림
iOS 10의 새로운 기능인 사용자 알림 프레임워크를 사용하면 로컬 및 원격 알림을 배달하고 처리할 수 있습니다. 이 프레임워크를 사용하여 앱 또는 앱 확장은 위치 또는 시간 등의 조건 집합을 지정하여 로컬 알림 배달을 예약할 수 있습니다.
사용자 알림 정보
위에서 설명한 것처럼 새 사용자 알림 프레임워크는 로컬 및 원격 알림의 배달 및 처리를 허용합니다. 이 프레임워크를 사용하여 앱 또는 앱 확장은 위치 또는 시간 등의 조건 집합을 지정하여 로컬 알림 배달을 예약할 수 있습니다.
또한 앱 또는 확장은 사용자의 iOS 디바이스에 배달될 때 로컬 및 원격 알림을 모두 수신하고 수정할 수 있습니다.
새 사용자 알림 UI 프레임워크를 사용하면 앱 또는 앱 확장이 사용자에게 표시될 때 로컬 및 원격 알림의 모양을 사용자 지정할 수 있습니다.
이 프레임워크는 앱이 사용자에게 알림을 제공할 수 있는 다음과 같은 방법을 제공합니다.
- 시각적 경고 - 알림이 화면 위쪽에서 배너로 롤다운되는 위치입니다.
- 소리 및 진동 - 알림과 연결할 수 있습니다.
- 앱 아이콘 바딩 - 앱 아이콘에 읽지 않은 전자 메일 메시지 수와 같은 새 콘텐츠를 사용할 수 있음을 보여 주는 배지가 표시됩니다.
또한 사용자의 현재 컨텍스트에 따라 알림이 표시되는 다양한 방법이 있습니다.
- 디바이스의 잠금이 해제된 경우 알림은 화면 위쪽에서 배너로 롤다운됩니다.
- 디바이스가 잠겨 있으면 알림이 사용자의 잠금 화면에 표시됩니다.
- 사용자가 알림을 놓친 경우 알림 센터를 열고 사용 가능한 대기 알림을 볼 수 있습니다.
Xamarin.iOS 앱에는 보낼 수 있는 두 가지 유형의 사용자 알림이 있습니다.
- 로컬 알림 - 이러한 알림은 사용자 디바이스에 로컬로 설치된 앱에서 전송됩니다.
- 원격 알림 - 원격 서버에서 전송되고 사용자에게 표시되거나 앱 콘텐츠의 백그라운드 업데이트를 트리거합니다.
로컬 알림 정보
iOS 앱이 보낼 수 있는 로컬 알림에는 다음과 같은 기능과 특성이 있습니다.
- 사용자의 디바이스에서 로컬인 앱에서 전송됩니다.
- 시간 또는 위치 기반 트리거를 사용하도록 구성할 수 있습니다.
- 앱은 사용자의 디바이스를 사용하여 알림을 예약하며 트리거 조건이 충족되면 표시됩니다.
- 사용자가 알림과 상호 작용하면 앱은 콜백을 받습니다.
로컬 알림의 몇 가지 예는 다음과 같습니다.
- 일정 경고
- 미리 알림 경고
- 위치 인식 트리거
자세한 내용은 Apple의 로컬 및 원격 알림 프로그래밍 가이드 설명서를 참조하세요.
원격 알림 정보
iOS 앱이 보낼 수 있는 원격 알림에는 다음과 같은 기능과 특성이 있습니다.
- 앱에는 통신하는 서버 쪽 구성 요소가 있습니다.
- APN(Apple Push Notification Service)은 개발자의 클라우드 기반 서버에서 사용자의 디바이스로 원격 알림의 최상의 배달을 전송하는 데 사용됩니다.
- 앱이 원격 알림을 받으면 사용자에게 표시됩니다.
- 사용자가 알림과 상호 작용하면 앱은 콜백을 받습니다.
원격 알림의 몇 가지 예는 다음과 같습니다.
- 뉴스 경고
- 스포츠 업데이트
- 인스턴트 메시징 메시지
iOS 앱에는 다음 두 가지 유형의 원격 알림을 사용할 수 있습니다.
- 사용자 연결 - 디바이스에서 사용자에게 표시됩니다.
- 자동 업데이트 - 백그라운드에서 iOS 앱의 콘텐츠를 업데이트하는 메커니즘을 제공합니다. 자동 업데이트를 받으면 앱이 원격 서버에 연결하여 최신 콘텐츠를 끌어올 수 있습니다.
자세한 내용은 Apple의 로컬 및 원격 알림 프로그래밍 가이드 설명서를 참조하세요.
기존 알림 API 정보
iOS 10 이전에는 iOS 앱이 시스템에 알림을 등록하고 시간 또는 위치별로 알림을 트리거하는 방법을 예약하는 데 사용합니다 UIApplication
.
개발자가 기존 알림 API를 사용할 때 발생할 수 있는 몇 가지 문제가 있습니다.
- 코드 중복으로 이어질 수 있는 로컬 또는 원격 알림에 필요한 콜백이 서로 다릅니다.
- 앱은 시스템으로 예약된 후 알림을 제한했습니다.
- 애플의 모든 기존 플랫폼에 걸쳐 지원의 다른 수준이 있었다.
새 사용자 알림 프레임워크 정보
iOS 10을 통해 Apple은 위에서 언급한 기존 방법을 대체하는 새로운 사용자 알림 프레임워크를 UIApplication
도입했습니다.
사용자 알림 프레임워크는 다음을 제공합니다.
- 기존 프레임워크에서 코드를 쉽게 포팅할 수 있도록 이전 메서드와의 기능 패리티를 포함하는 친숙한 API입니다.
- 사용자에게 더 풍부한 알림을 보낼 수 있는 확장된 콘텐츠 옵션 집합을 포함합니다.
- 로컬 및 원격 알림은 모두 동일한 코드와 콜백으로 처리할 수 있습니다.
- 사용자가 알림과 상호 작용할 때 앱에 전송되는 콜백을 처리하는 프로세스를 간소화합니다.
- 알림을 제거하거나 업데이트하는 기능을 포함하여 보류 중인 알림과 배달된 알림을 모두 관리합니다.
- 앱에서 알림 프레젠테이션을 수행할 수 있는 기능을 추가합니다.
- 앱 확장 내에서 알림을 예약하고 처리하는 기능을 추가합니다.
- 알림 자체에 대한 새 확장 지점을 추가합니다.
새 사용자 알림 프레임워크는 다음을 포함하여 Apple이 지원하는 여러 플랫폼에서 통합 알림 API를 제공합니다.
- iOS - 알림을 관리하고 예약하기 위한 모든 지원.
- tvOS - 로컬 및 원격 알림에 대한 앱 아이콘을 배지로 지정하는 기능을 추가합니다.
- watchOS - 사용자의 페어링된 iOS 디바이스에서 Apple Watch로 알림을 전달하는 기능을 추가하고 시계 앱에서 시계 자체에서 직접 로컬 알림을 수행할 수 있는 기능을 제공합니다.
- macOS - 알림을 관리하고 예약하기 위한 모든 지원.
자세한 내용은 Apple의 UserNotifications 프레임워크 참조 및 UserNotificationsUI 설명서를 참조하세요.
알림 배달 준비
iOS 앱이 사용자에게 알림을 보내려면 먼저 앱을 시스템에 등록해야 하며, 알림이 사용자에게 중단되기 때문에 앱은 사용자에게 보내기 전에 명시적으로 권한을 요청해야 합니다.
사용자가 앱에 대해 승인할 수 있는 세 가지 알림 요청 수준이 있습니다.
- 배너가 표시됩니다.
- 소리 경고.
- 앱 아이콘을 바딩합니다.
또한 로컬 및 원격 알림 모두에 대해 이러한 승인 수준을 요청하고 설정해야 합니다.
앱이 시작되는 즉시 다음 코드를 메서드 AppDelegate
에 추가하고 원하는 알림 유형(UNAuthorizationOptions
)을 설정하여 FinishedLaunching
알림 권한을 요청해야 합니다.
참고 항목
UNUserNotificationCenter
는 iOS 10 이상에서만 사용할 수 있습니다. 따라서 요청을 보내기 전에 macOS 버전을 검사 것이 좋습니다.
using UserNotifications;
...
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
// Version check
if (UIDevice.CurrentDevice.CheckSystemVersion (10, 0)) {
// Request notification permissions from the user
UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert, (approved, err) => {
// Handle approval
});
}
return true;
}
이 API는 통합되고 Mac 10.14 이상에서도 작동하므로 macOS를 대상으로 하는 경우 가능한 한 빨리 알림 권한을 검사 합니다.
using UserNotifications;
...
public override void DidFinishLaunching (NSNotification notification)
{
// Check we're at least v10.14
if (NSProcessInfo.ProcessInfo.IsOperatingSystemAtLeastVersion (new NSOperatingSystemVersion (10, 14, 0))) {
// Request notification permissions from the user
UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound, (approved, err) => {
// Handle approval
});
}
}
> [!NOTE]
> With MacOS apps, for the permission dialog to appear, you must sign your macOS app, even if building locally in DEBUG mode. Therefore, **Project->Options->Mac Signing->Sign the application bundle** must be checked.
Additionally, a user can always change the notification privileges for an app at any time using the **Settings** app on the device. The app should check for the user's requested notification privileges before presenting a notification using the following code:
```csharp
// Get current notification settings
UNUserNotificationCenter.Current.GetNotificationSettings ((settings) => {
var alertsAllowed = (settings.AlertSetting == UNNotificationSetting.Enabled);
});
원격 알림 환경 구성
iOS 10을 새롭게 접하는 개발자는 개발 또는 프로덕션으로 실행 중인 환경 푸시 알림을 OS에 알려야 합니다. 이 정보를 제공하지 않으면 다음과 유사한 알림과 함께 iTune App Store에 제출할 때 앱이 거부될 수 있습니다.
푸시 알림 자격 누락 - 앱에 Apple 푸시 알림 서비스에 대한 API가 포함되어 있지만
aps-environment
앱 서명에서 자격이 누락되었습니다.
필요한 자격을 제공하려면 다음을 수행합니다.
원격 알림 등록
앱이 원격 알림을 보내고 받는 경우에도 기존 API를 사용하여 토큰 등록을 UIApplication
수행해야 합니다. 이 등록을 수행하려면 디바이스에 라이브 네트워크 연결 액세스 APN이 있어야 합니다. 그러면 앱에 전송되는 데 필요한 토큰이 생성됩니다. 그런 다음, 앱은 이 토큰을 개발자의 서버 쪽 앱에 전달하여 원격 알림에 등록해야 합니다.
다음 코드를 사용하여 필요한 등록을 초기화합니다.
UIApplication.SharedApplication.RegisterForRemoteNotifications ();
개발자의 서버 쪽 앱으로 전송되는 토큰은 원격 알림을 보낼 때 서버에서 APN으로 전송되는 알림 페이로드의 일부로 포함되어야 합니다.
토큰은 알림과 알림을 열거나 응답하는 데 사용되는 앱을 연결하는 키 역할을 합니다.
자세한 내용은 Apple의 로컬 및 원격 알림 프로그래밍 가이드 설명서를 참조하세요.
알림 전송
앱이 완전히 등록되고 사용자가 요청 및 부여한 필수 권한이 있으면 이제 앱이 알림을 보내고 받을 준비가 되었습니다.
알림 콘텐츠 제공
iOS 10을 새롭게 접하는 모든 알림에는 항상 알림 콘텐츠 본문과 함께 표시되는 제목과 부제목이 모두 포함됩니다. 또한 알림 콘텐츠에 미디어 첨부 파일을 추가하는 기능도 새로 추가되었습니다.
로컬 알림의 콘텐츠를 만들려면 다음 코드를 사용합니다.
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
}
}
알림을 보낼 때 예약
알림 콘텐츠를 만든 상태에서 앱은 트리거를 설정하여 알림이 사용자에게 표시될 시기를 예약해야 합니다. iOS 10은 다음과 같은 네 가지 트리거 유형을 제공합니다.
- 푸시 알림 - 원격 알림과 함께 단독으로 사용되며 APN이 디바이스에서 실행 중인 앱에 알림 패키지를 보낼 때 트리거됩니다.
- 시간 간격 - 지금부터 시작하여 몇 가지 미래 시점을 종료하는 시간 간격부터 로컬 알림을 예약할 수 있습니다. 예를 들어
var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);
- 일정 날짜 - 특정 날짜 및 시간에 대한 로컬 알림을 예약할 수 있습니다.
- 위치 기반 - iOS 디바이스가 특정 지리적 위치를 입력하거나 떠날 때 또는 Bluetooth 비콘과 지정된 근접 위치에 있을 때 로컬 알림을 예약할 수 있습니다.
로컬 알림이 준비되면 앱은 개체의 메서드를 Add
UNUserNotificationCenter
호출하여 사용자에게 표시를 예약해야 합니다. 원격 알림의 경우 서버 쪽 앱은 APN에 알림 페이로드를 보낸 다음, 패킷을 사용자의 디바이스로 보냅니다.
모든 부분을 함께 가져오는 샘플 로컬 알림은 다음과 같습니다.
using UserNotifications;
...
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 != null) {
// Do something with error...
}
});
포그라운드 앱 알림 처리
iOS 10의 새로운 기능인 앱은 포그라운드에 있고 알림이 트리거될 때 알림을 다르게 처리할 수 있습니다. 메서드를 UNUserNotificationCenterDelegate
제공하고 구현하면 WillPresentNotification
앱이 알림을 표시하는 책임을 맡을 수 있습니다. 예시:
using System;
using UserNotifications;
namespace MonkeyNotification
{
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;
}
이 코드는 앱이 활성 상태이고 포그라운드에 있는 동안 알림을 처리할 수 있도록 위에서 현재 UNUserNotificationCenter
로 사용자 지정 UNUserNotificationCenterDelegate
을 연결합니다.
알림 관리
iOS 10을 새롭게 접하는 알림 관리는 보류 중인 알림과 배달된 알림 모두에 대한 액세스를 제공하고 이러한 알림을 제거, 업데이트 또는 승격하는 기능을 추가합니다.
알림 관리 의 중요한 부분은 알림을 만들고 시스템으로 예약할 때 알림에 할당된 요청 식별자 입니다. 원격 알림의 경우 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...
}
});
이미 배달된 알림의 경우 기존 알림이 업데이트되고 사용자가 이미 읽은 경우 홈 및 잠금 화면 및 알림 센터에서 목록 맨 위로 승격됩니다.
알림 작업 작업
iOS 10에서 사용자에게 전달되는 알림은 정적이지 않으며 사용자가 상호 작용할 수 있는 여러 가지 방법을 제공합니다(기본 제공에서 사용자 지정 작업까지).
iOS 앱이 응답할 수 있는 세 가지 유형의 작업이 있습니다.
- 기본 작업 - 사용자가 알림을 탭하여 앱을 열고 지정된 알림의 세부 정보를 표시하는 경우입니다.
- 사용자 지정 작업 - iOS 8에 추가되었으며 사용자가 앱을 시작할 필요 없이 알림에서 직접 사용자 지정 작업을 수행할 수 있는 빠른 방법을 제공합니다. 사용자 지정 가능한 제목이 있는 단추 목록 또는 백그라운드에서 실행할 수 있는 텍스트 입력 필드(앱에 요청을 이행하는 데 약간의 시간이 주어짐) 또는 포그라운드(요청을 수행하기 위해 앱이 포그라운드에서 시작되는 위치)로 표시될 수 있습니다. 사용자 지정 작업은 iOS 및 watchOS 모두에서 사용할 수 있습니다.
- 작업 해제 - 사용자가 지정된 알림을 해제하면 이 작업이 앱으로 전송됩니다.
사용자 지정 작업 만들기
사용자 지정 작업을 만들고 시스템에 등록하려면 다음 코드를 사용합니다.
// 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
ID를 만들 때 단추에 표시될 고유한 ID와 제목이 할당됩니다. 기본적으로 작업은 백그라운드 작업으로 생성되지만 작업의 동작을 조정하는 옵션을 제공할 수 있습니다(예: 포그라운드 작업으로 설정).
만든 각 작업은 범주와 연결되어야 합니다. 새 UNNotificationCategory
항목을 만들 때 고유한 ID, 수행할 수 있는 작업 목록, 범주의 작업 의도에 대한 자세한 정보를 제공하는 의도 ID 목록 및 범주의 동작을 제어하는 몇 가지 옵션이 할당됩니다.
마지막으로 모든 범주는 메서드를 사용하여 SetNotificationCategories
시스템에 등록됩니다.
사용자 지정 작업 표시
사용자 지정 작업 및 범주 집합이 만들어지고 시스템에 등록되면 로컬 또는 원격 알림에서 표시할 수 있습니다.
원격 알림의 category
경우 위에서 만든 범주 중 하나와 일치하는 원격 알림 페이로드를 설정합니다. 예시:
{
aps:{
alert:"Hello world!",
category:"message"
}
}
로컬 알림의 경우 개체의 CategoryIdentifier
UNMutableNotificationContent
속성을 설정합니다. 예시:
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";
...
이 ID는 위에서 만든 범주 중 하나와 일치해야 합니다.
해제 작업 처리
위에서 설명한 대로 사용자가 알림을 해제할 때 해제 작업을 앱으로 보낼 수 있습니다. 표준 작업이 아니므로 범주를 만들 때 옵션을 설정해야 합니다. 예시:
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
제공하고 구현하여 수행됩니다 UserNotificationCenter
. 예시:
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
트리거 및 알림 콘텐츠가 포함된 요청을 포함하는 원래 알림을 보유합니다. 앱은 트리거 유형에 따라 로컬 또는 원격 알림인지 여부를 결정할 수 있습니다.
참고 항목
iOS 12를 사용하면 사용자 지정 알림 UI가 런타임에 해당 작업 단추를 수정할 수 있습니다. 자세한 내용은 동적 알림 작업 단추 설명서를 참조 하세요 .
서비스 확장 작업
원격 알림을 사용할 때 서비스 확장은 알림 페이로드 내에서 엔드 투 엔드 암호화를 사용하도록 설정하는 방법을 제공합니다. 서비스 확장은 사용자에게 표시되기 전에 알림의 표시되는 콘텐츠를 보강하거나 바꾸기 위한 기본 목적으로 백그라운드에서 실행되는 비 사용자 인터페이스 확장(iOS 10에서 사용 가능)입니다.
서비스 확장은 신속하게 실행하기 위한 것이며 시스템에서 실행하는 데 짧은 시간만 제공됩니다. 서비스 확장이 할당된 시간 동안 해당 작업을 완료하지 못하는 경우 대체 메서드가 호출됩니다. 대체에 실패하면 원래 알림 콘텐츠가 사용자에게 표시됩니다.
서비스 확장의 몇 가지 잠재적 용도는 다음과 같습니다.
- 원격 알림 콘텐츠의 엔드 투 엔드 암호화 제공
- 원격 알림에 첨부 파일을 추가하여 보강합니다.
서비스 확장 구현
Xamarin.iOS 앱에서 서비스 확장을 구현하려면 다음을 수행합니다.
Important
서비스 확장의 번들 식별자는 끝에 추가된 기본 앱 .appnameserviceextension
의 번들 식별자와 일치해야 합니다. 예를 들어 기본 앱에 번들 식별자가 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
{
#region Computed Properties
public Action<UNNotificationContent> ContentHandler { get; set; }
public UNMutableNotificationContent BestAttemptContent { get; set; }
#endregion
#region Constructors
protected NotificationService (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
#endregion
#region Override Methods
public override void DidReceiveNotificationRequest (UNNotificationRequest request, Action<UNNotificationContent> contentHandler)
{
ContentHandler = contentHandler;
BestAttemptContent = (UNMutableNotificationContent)request.Content.MutableCopy ();
// Modify the notification content here...
BestAttemptContent.Title = $"{BestAttemptContent.Title}[modified]";
ContentHandler (BestAttemptContent);
}
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.
ContentHandler (BestAttemptContent);
}
#endregion
}
}
첫 번째 메서드는 DidReceiveNotificationRequest
개체를 통해 알림 콘텐츠뿐만 아니라 알림 식별자를 전달합니다 request
. 사용자에게 알림을 표시하려면 전달된 contentHandler
메시지를 호출해야 합니다.
두 번째 메서드인 TimeWillExpire
는 서비스 확장이 요청을 처리하기 위해 시간이 다 다가지기 직전에 호출됩니다. 서비스 확장이 할당된 시간 단위로 호출 contentHandler
하지 못하면 원래 콘텐츠가 사용자에게 표시됩니다.
서비스 확장 트리거
서비스 확장이 만들어지고 앱과 함께 제공되면 디바이스로 전송된 원격 알림 페이로드를 수정하여 트리거할 수 있습니다. 예시:
{
aps : {
alert : "New Message Available",
mutable-content: 1
},
encrypted-content : "#theencryptedcontent"
}
새 mutable-content
키는 원격 알림 콘텐츠를 업데이트하기 위해 서비스 확장을 시작해야 한다고 지정합니다. 키는 encrypted-content
사용자에게 표시하기 전에 서비스 확장이 해독할 수 있는 암호화된 데이터를 보유합니다.
다음 서비스 확장 예제를 살펴보세요.
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
사용자에게 알림을 표시합니다.
요약
이 문서에서는 iOS 10에서 사용자 알림이 향상된 모든 방법을 설명했습니다. 새 사용자 알림 프레임워크와 Xamarin.iOS 앱 또는 앱 확장에서 사용하는 방법을 설명했습니다.