Skip to content

notification programming guide

우성진 edited this page Dec 6, 2017 · 9 revisions

앱에서 알림

로컬 알림 및 원격 알림은 앱이 포 그라운드에서 실행되지 않는 경우에도 앱에 새로운 데이터가 제공 될 때이를 사용자에게 알리는 방법입니다.
예를 들어, 메시징 앱을 사용하면 새 메시지가 도착했을 때 사용자에게 알릴 수 있으며 캘린더 앱은 사용자에게 예정된 약속을 알릴 수 있습니다.
로컬 알림과 원격 알림의 차이점은 간단합니다.

  • 지역 알림을 사용하면 앱에서 알림 세부 정보를 로컬로 구성하고 해당 세부 정보를 시스템에 전달합니다.
    그런 다음 앱이 포 그라운드에 있지 않을 때 알림 전달을 처리합니다. 로컬 알림은 iOS, tvOS 및 watchOS에서 지원됩니다.
  • 원격 알림을 사용하면 회사 서버 중 하나를 사용하여 Apple Push Notification 서비스를 통해 사용자 장치로 데이터를 전송할 수 있습니다.
    원격 알림은 iOS, tvOS, watchOS 및 macOS에서 지원됩니다.

로컬 및 원격 알림 모두 앱의 알림 예약 및 처리를 지원하는 코드를 추가해야합니다.
원격 알림의 경우 사용자 장치에서 데이터를 수신하고 Apple Push Notification Service(APNs)에 알림 관련 데이터를 보낼 수 있는 서버 환경을 제공해야 합니다.
이 서비스는 사용자 장치로 전송되는 원격 알림 전달을 처리하는 Apple 제공 서비스입니다.

사용자 알림과 사용자 알림 UI 프레임워크

사용자 알림 프레임 워크는 iOS 10, watchOS 3 및 tvOS 10에서 시작하는 로컬 알림 일정과 일정을 일관되게 유지할 수있는 방법을 제공합니다.
로컬 알림을 관리하는 것 외에도, 비록 플랫폼에 특정한 API가 필요하지만 원격 알림 구성은 여전히 지원하고, 프레임워크는 원격 알림 처리를 지원합니다.
별도의 프레임워크이므로 작성한 앱 및 WatchKit 확장과 같이 생성한 확장 프로그램에서 사용할 수 있습니다.

노트
macOS에서 원격 알림을 구성하고 처리하려면 AppKit 프레임 워크에있는 플랫폼 별 메서드를 사용해야합니다.

사용자 알림 프레임 워크는 원격 알림이 배달되기 전에 원격 알림의 콘텐츠를 수정할 수있는 알림 서비스 앱 확장을 만들 수도 있습니다.
앱에 알림 서비스 앱 확장을 포함하면 시스템에서 수신 알림을 사용자에게 전달하기 전에 내선 번호로 전달합니다.
이러한 유형의 확장 프로그램을 사용하여 앱 알림을위한 종단 간 암호화를 구현하거나, 전달하기 전에 알림 내용을 수정하거나, 알림과 관련된 추가 이미지 또는 미디어를 다운로드 할 수 있습니다.

사용자 알림 UI 프레임워크는 시스템 알림 인터페이스의 모양을 사용자 지정할 수있는 사용자 알림 프레임워크와 함께 제공됩니다.
사용자 알림 UI 프레임워크를 사용하여 알림 컨텐트 앱 확장을 정의합니다.
이 작업은 뷰 인터페이스에 표시할 사용자 정의 컨텐트가 있는 뷰컨트롤러를 제공합니다.
시스템이 기본 시스템 인터페이스 대신 사용자 정의 뷰컨트롤러를 표시합니다.
이 확장 유형을 사용하여 미디어 또는 동적 컨텐츠를 알림 인터페이스에 통합할 수 있습니다.

사용자 알림 프레임 워크의 클래스에 대한 자세한 내용은 사용자 알림 프레임 워크 참조를 참조하십시오. 알림 콘텐츠 앱 확장을 만드는 데 사용하는 클래스에 대한 자세한 내용은 사용자 알림 UI 프레임워크 참조를 참조하십시오.

로컬 및 원격 알림을 사용해야하는 경우

iOS, tvOS 및 watchOS의 앱이 항상 실행되고있는 것은 아니기 때문에 로컬 알림을 사용하면 앱에 새로운 정보가있을 때 사용자에게 알릴 수 있습니다.
예를 들어 백그라운드에서 서버의 데이터를 가져 오는 앱은 재미있는 정보를 수신하면 로컬 알림을 예약할 수 있습니다.
로컬 알림은 특정 시간이나 특정 지리적 위치에 도달했을 때 사용자에게 경고해야하는 캘린더 및 할 일 목록 앱과 같은 앱에도 매우 적합합니다.

원격 알림은 앱의 일부 또는 모든 데이터가 회사 서버에 의해 관리될 때 적합합니다.
원격 알림을 사용하면 사용자 장치에 알림을 푸시할 시기를 결정할 수 있습니다.
예를 들어, 메시징 앱은 원격 알림을 사용하여 새 메시지가 도착할 때 사용자에게 알릴 수 있습니다.
서버에서 전송되기 때문에 사용자의 기기에서 앱이 실행되지 않는 경우를 포함하여 언제든지 원격 알림을 보낼 수 있습니다.

로컬 및 원격 알림은 사용자와 동일하게 보입니다.

사용자에게는 주어진 장치에 제시 될 때 로컬 및 원격 통지간에 차이가 없습니다.
두 가지 유형의 알림은 시스템에서 제공하는 것과 동일한 기본 모양을 가집니다.
경우에 따라 모양을 사용자 정의 할 수 있지만 대개 사용자에게 통지 방법을 선택합니다.
특히 알림 전달을 위해 다음 옵션 중 하나를 선택합니다.

  • 화면상의 경고 또는 배너
  • 앱 아이콘의 배지
  • 경고, 배너 또는 배지와 함께 제공되는 소리

로컬 및 원격 알림을 구성 할 때 제공하는 정보 유형에 가장 적합한 상호 작용 유형을 선택하십시오.
예를 들어해야 할 일 목록 앱에는 항목 목록이있을 수 있으며 각 목록에는 항목을 완료해야하는 시간과 우선 순위가 있습니다.
중요도가 높은 항목의 경우 완료 시간이 지나면 항목을 즉시 처리해야 함을 알리는 경고를 표시 할 수 있습니다.
우선 순위가 낮은 항목의 경우 앱의 아이콘에 배지를 적용하거나 소리를내어 항목을 완성하는 알림을 제공 할 수 있습니다.

알리미를 사용하면 메시지를 사용자에게 직접 표시 할 수 있지만 배지와 소리의 의미는 앱에 따라 다릅니다.
다른 소리를 사용하여 메시지 도착 또는 작업 완료와 같은 특정 유형의 이벤트를 전달할 수 있습니다.
배지는 항상 숫자 값을 포함하며 일반적으로 사용자의 관심을 기다리고있는 항목의 수를 나타내는 데 사용됩니다.
그림 1-1은 iOS 앱의 아이콘에 배지를 배치 한 모습입니다.

그림 1-1 배지 번호가있는 응용 프로그램 아이콘 (iOS)

항상 로컬 및 원격 통지를 사용하여 사용자를 성가시게 하지 마십시오.
이 시스템을 통해 사용자는 앱별로 알림, 소리 및 배지의 표시를 사용 또는 사용 중지할 수 있습니다.
알림이 앱에 전달 될 수도 있지만 시스템은 현재 사용 가능한 옵션으로만 사용자에게 알립니다.
사용자가 알림을 모두 사용 중지하면 APN은 앱의 알림을 사용자의 기기에 전달하지 않으며 로컬 알림 일정은 항상 실패합니다.

앱은 실행시 로컬 및 원격 알림을 지원하도록 구성되어야합니다.
특히 다음 중 하나를 수행하는 경우 앱을 미리 구성해야합니다.

  • 도착 알림에 대한 응답으로 알림, 재생 사운드 또는 배지 아이콘을 표시합니다.
  • 사용자 지정 작업 단추를 알림과 함께 표시합니다.

일반적으로 응용 프로그램이 시작되기 전에 모든 구성을 수행합니다.
iOS 및 tvOS에서 이는 UIApplication 대리인의 application:didFinishLaunchingWithOptions: 메소드보다 늦지 않게 알림 지원을 구성하는 것을 의미합니다.
watchOS에서 WKExtension 대리인의 applicationDidFinishLaunching 메소드보다 늦게 지원을 구성하십시오. 나중에이 구성을 수행 할 수 있지만이 구성이 완료 될 때까지 앱을 대상으로하는 로컬 또는 원격 알림을 예약하지 않아야 합니다.

원격 알림을 지원하는 앱에는 원격 알림 지원 구성에 설명된 추가 구성이 필요합니다.

사용자와 상호 작용할 권한 요청

iOS, tvOS 및 watchOS에서 앱은 들어오는 알림에 대한 응답으로 알림을 표시하거나 소리를 재생하거나 앱 아이콘에 배지 할 수있는 권한이 있어야 합니다.
요청 권한 부여는 사용자 상호 작용을 제어하여 사용자의 요청을 허용하거나 거부할 수 있습니다.
또한 사용자는 나중에 시스템 설정에서 앱의 인증 설정을 변경할 수 있습니다.

권한을 요청하려면 공유 UNUserNotificationCenter 오브젝트의 requestAuthorizationWithOptions:completionHandler: 메소드를 호출하십시오.
요청된 모든 상호 작용 유형에 대해 앱이 승인 된 경우 시스템은 부여된 매개 변수를 YES로 설정하여 완료 핸들러 블록을 호출합니다.
하나 이상의 상호 작용 유형이 허용되지 않으면 매개 변수는 NO입니다.
Listing 2-1은 사운드를 재생하고 경고를 표시하는 권한을 요청하는 방법을 보여줍니다.
완료 핸들러 블록을 사용하여 상호 작용 유형이 부여되었는지 또는 거부되었는지에 따라 앱의 동작을 업데이트하십시오.

Listing 2-1 사용자 상호 작용에 대한 승인 요청

UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound)
   completionHandler:^(BOOL granted, NSError * _Nullable error) {
      // Enable or disable features based on authorization.
}];
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
    // Enable or disable features based on authorization.
}

앱이 처음 실행되고 requestAuthorizationWithOptions:completionHandler: 메소드를 호출하면 요청 된 상호 작용을 허용하거나 거부하라는 메시지가 표시됩니다.
시스템이 사용자 응답을 저장하기 때문에 후속 실행 중에이 메소드를 호출해도 사용자에게 다시 묻지 않습니다.

노트
사용자는 시스템 설정을 사용하여 언제든지 앱의 승인 된 상호 작용 유형을 변경할 수 있습니다.
사용할 수있는 상호 작용의 유형을 정확하게 결정하려면 UNUserNotificationCentergetNotificationSettingsWithCompletionHandler: 메소드를 호출하십시오.

범주 및 실행 가능 알림 구성

실행 가능한 알림을 사용하면 알림에 대한 응답으로 관련 작업을 쉽고 빠르게 수행 할 수 있습니다.
사용자가 강제로 앱을 실행하는 대신 실행 가능한 알림을 위한 인터페이스는 사용자가 탭할 수 있는 맞춤 동작 버튼을 표시합니다.
탭하면 각 버튼이 알림 인터페이스를 닫고 선택한 작업을 앱으로 전달하여 즉각적인 처리가 가능하도록합니다.
앱에 작업을 전달하면 사용자가 작업을 수행하기 위해 앱에서 더 이상 탐색 할 필요가 없어 시간을 절약 할 수 있습니다.

앱은 실행 가능한 알림을 명시 적으로 추가해야합니다.
실행시 앱은 앱에서 보내는 알림 유형을 정의하는 하나 이상의 카테고리를 등록해야합니다.
각 카테고리와 관련하여 해당 유형의 알림이 전달 될 때 사용자가 수행 할 수있는 작업이 있습니다.
실제로 표시되는 동작의 수는 알림이 표시되는 방법과 위치에 따라 다르지만 각 범주에는 연결된 네 개의 동작이 포함될 수 있습니다.
예를 들어, 배너는 두 가지 동작만 표시합니다.

노트
실행 가능한 알림은 iOS 및 watchOS에서만 지원됩니다.

앱 알림 카테고리 등록하기

카테고리는 앱이 지원하는 알림 유형을 정의하고 알림을 표시 할 방식을 시스템과 통신합니다.
범주를 사용하여 사용자 지정 작업을 알림과 연결하고 해당 유형의 알림을 처리하는 방법에 대한 옵션을 지정할 수 있습니다.
예를 들어 카테고리 옵션을 사용하여 알림을 CarPlay 환경에 표시 할 수 있는지 여부를 지정합니다.

시작시 공유 UNUserNotificationCenter 객체의 setNotificationCategories: 메소드를 사용하여 모든 앱 카테고리를 한꺼번에 등록합니다.
이 메서드를 호출하기 전에 하나 이상의 UNNotificationCategory 클래스 인스턴스를 만들고 해당 형식의 알림을 표시 할 때 사용할 범주 이름과 옵션을 지정합니다. 카테고리 이름은 앱 내부에 있으며 사용자가 본 적이 없습니다.
알림을 예약 할 때 알림의 페이로드에 범주 이름을 포함시켜 시스템이 옵션을 검색하고 알림을 표시하는 데 사용합니다.

Listing 2-2는 간단한 UNNotificationCategory 객체를 생성하고 이를 시스템에 등록하는 방법을 보여준다.
이 카테고리는 이름이 "GENERAL"이며 사용자가 다른 조치를 취하지 않고 알림 인터페이스를 닫을 때 시스템이 앱에 알리도록하는 맞춤 해제 액션 옵션으로 구성됩니다.

Listing 2-2 알림 카테고리 만들기 및 등록

UNNotificationCategory* generalCategory = [UNNotificationCategory
     categoryWithIdentifier:@"GENERAL"
     actions:@[]
     intentIdentifiers:@[]
     options:UNNotificationCategoryOptionCustomDismissAction];
 
// Register the notification categories.
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center setNotificationCategories:[NSSet setWithObjects:generalCategory, nil]];
let generalCategory = UNNotificationCategory(identifier: "GENERAL",
                                             actions: [],
                                             intentIdentifiers: [],
                                             options: .customDismissAction)
 
// Register the category.
let center = UNUserNotificationCenter.current()
center.setNotificationCategories([generalCategory])

앱에서 예약하는 모든 알림에 범주를 지정할 필요는 없습니다.
그러나 범주를 포함하지 않으면 사용자 지정 작업이나 구성 옵션없이 알림이 표시됩니다.

사용자 지정 작업을 범주에 추가

등록한 각 범주에는 최대 네 개의 사용자 지정 작업이 포함될 수 있습니다.
카테고리에 사용자 정의 액션이 포함되어 있으면 시스템은 사용자 정의 액션 중 하나의 제목을 가진 버튼을 알림 인터페이스에 추가합니다.
사용자가 맞춤 동작 중 하나를 탭하면 시스템은 해당 액션 식별자를 앱에 전송하여 필요에 따라 앱을 실행합니다.

사용자 지정 작업을 정의하려면 UNNotificationAction 개체를 만들어 범주 개체 중 하나에 추가합니다.
각 액션에는 해당 버튼의 제목 문자열과 버튼을 표시하고 관련 작업을 처리하는 방법에 대한 옵션이 있습니다.
사용자가 작업을 선택하면 시스템은 작업의 식별자 문자열을 앱에 제공하고,이 식별자 문자열을 사용하여 수행 할 작업을 식별합니다.
Listing 2-3 은 두 개의 사용자 지정 작업이 포함 된 새 범주를 추가하여 Listing 2-2의 예를 확장합니다.

Listing 2-3 카테고리에 대한 사용자 정의 액션 정의하기

UNNotificationCategory* generalCategory = [UNNotificationCategory
      categoryWithIdentifier:@"GENERAL"
      actions:@[]
      intentIdentifiers:@[]
      options:UNNotificationCategoryOptionCustomDismissAction];
 
// Create the custom actions for expired timer notifications.
UNNotificationAction* snoozeAction = [UNNotificationAction
      actionWithIdentifier:@"SNOOZE_ACTION"
      title:@"Snooze"
      options:UNNotificationActionOptionNone];
 
UNNotificationAction* stopAction = [UNNotificationAction
      actionWithIdentifier:@"STOP_ACTION"
      title:@"Stop"
      options:UNNotificationActionOptionForeground];
 
// Create the category with the custom actions.
UNNotificationCategory* expiredCategory = [UNNotificationCategory
      categoryWithIdentifier:@"TIMER_EXPIRED"
      actions:@[snoozeAction, stopAction]
      intentIdentifiers:@[]
      options:UNNotificationCategoryOptionNone];
 
// Register the notification categories.
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center setNotificationCategories:[NSSet setWithObjects:generalCategory, expiredCategory,
      nil]];
let generalCategory = UNNotificationCategory(identifier: "GENERAL",
                                             actions: [],
                                             intentIdentifiers: [],
                                             options: .customDismissAction)
 
// Create the custom actions for the TIMER_EXPIRED category.
let snoozeAction = UNNotificationAction(identifier: "SNOOZE_ACTION",
                                        title: "Snooze",
                                        options: UNNotificationActionOptions(rawValue: 0))
let stopAction = UNNotificationAction(identifier: "STOP_ACTION",
                                      title: "Stop",
                                      options: .foreground)
 
let expiredCategory = UNNotificationCategory(identifier: "TIMER_EXPIRED",
                                             actions: [snoozeAction, stopAction],
                                             intentIdentifiers: [],
                                             options: UNNotificationCategoryOptions(rawValue: 0))
 
// Register the notification categories.
let center = UNUserNotificationCenter.current()
center.setNotificationCategories([generalCategory, expiredCategory])

각 범주에 대해 최대 네 개의 사용자 지정 동작을 지정할 수 있지만 일부 상황에서는 처음 두 동작 만 표시 할 수 있습니다.
예를 들어, 배너에 알림을 표시 할 때 시스템에서 두 가지 동작 만 표시합니다.
UNNotificationCategory 개체를 초기화 할 때는 항상 가장 관련있는 작업이 배열에서 먼저 수행되도록 작업 배열을 구성하십시오.

UNTextInputNotificationAction 클래스를 사용하여 작업을 구성하면 시스템에서 사용자가 알림 응답의 일부로 텍스트를 입력 할 수 있는 방법을 제공합니다.
텍스트 입력 동작은 사용자로부터 자유 형식 텍스트를 수집하는 데 유용합니다.
예를 들어 메시지 앱을 사용하면 사용자가 메시지에 맞춤 응답을 제공 할 수 있습니다.
처리할 텍스트 입력 작업이 앱에 전달되면 시스템은 사용자 응답을 UNTextInputNotificationResponse 객체에 패키지화합니다.

사용자 지정 동작 선택 처리 방법에 대한 자세한 내용은 사용자 지정 동작 선택에 응답을 참조하십시오.

사용자 지정 경고 사운드 준비

로컬 및 원격 알림은 알림이 배달 될 때 재생할 사용자 지정 알림 소리를 지정할 수 있습니다.
aiff, wav 또는 caf 파일로 오디오 데이터를 패키지화 할 수 있습니다.
시스템 사운드 기능으로 재생되므로 사용자 지정 사운드는 다음 오디오 데이터 형식 중 하나여야 합니다.

  • 선형 PCM
  • MA4 (IMA / ADPCM)
  • μLaw
  • aLaw

앱 번들이나 앱의 컨테이너 디렉토리에 있는 라이브러리/사운드 폴더에 맞춤 사운드 파일을 저장하십시오.
사용자 정의 사운드는 재생할 때 30초 미만이어야 합니다.
사용자 지정 사운드가이 한계를 초과하면 기본 시스템 사운드가 대신 재생됩니다.

afconvert 도구를 사용하여 사운드를 변환 할 수 있습니다. 예를 들어, 16 비트 선형 PCM 시스템 사운드 Submarine.aiffCAF 파일의 IMA4 오디오로 변환하려면 터미널 응용 프로그램에서 다음 명령을 사용하십시오.

afconvert /System/Library/Sounds/Submarine.aiff ~ / Desktop / sub.caf -d ima4 -f caff -v

사운드 파일을 알림과 연결하는 방법에 대한 자세한 내용은 알림 내용에 사운드 추가를 참조하십시오.

앱 알림 설정 관리

사용자는 언제든지 앱의 알림 설정을 변경할 수 있으므로 공유 UNUserNotificationCenter 객체의 getNotificationSettingsWithCompletionHandler: 메소드를 사용하여 언제든지 앱의 승인 상태를 확인할 수 있습니다.
이 메소드는 UNNotificationSettings 객체를 반환합니다.
이 객체는 앱의 현재 승인 상태와 현재 알림 환경을 반영합니다.

UNNotificationSettings 개체의 정보를 사용하여 앱의 알림 관련 코드를 조정하십시오.
앱의 알림, 배지 및 사운드 권한 설정을 공급자에게 전달하여 모든 원격 알림 페이로드에 포함 된 옵션을 조정할 수 있습니다.
공급자는 배포 및 관리하고 APNs를 사용하도록 구성된 서버이며 공급자에 대한 자세한 내용은 APNs 개요를 참조하십시오.
다른 설정을 사용하여 알림을 예약하고 구성하는 방법을 조정할 수 있습니다.
사용 가능한 설정에 대한 자세한 내용은 UNNotificationSettings 클래스 참조를 참조하십시오.

전달 된 알림 관리

응용 프로그램이나 사용자가 로컬 및 원격 알림을 직접 처리하지 않으면 나중에 알림을 볼 수 있도록 알림 센터에 알림이 표시됩니다.
공유 UNUserNotificationCenter 개체의 getDeliveredNotificationsWithCompletionHandler: 메서드를 사용하여 알림 센터에 여전히 표시되는 알림 목록을 가져옵니다.
오래된 알림이 사용자에게 표시되어서는 안되는 것을 발견하면 removeDeliveredNotificationsWithIdentifiers: 메소드를 사용하여 알림을 제거 할 수 있습니다.