Customizing the Appearance of Notifications

https://developer.apple.com/documentation/usernotificationsui/customizing_the_appearance_of_notifications

"Customize the appearance of your iOS app’s notification alerts with a notification content app extension."

노티피케이션 컨텐트 앱 확장을 사용해서 iOS 앱 노티피케이션 알림의 모양을 커스터마이징합니다.

Overview

iOS 기기가 알림을 포함하는 노티피케이션을 받으면 시스템은 두 단계로 알림의 컨텐츠를 표시합니다. 처음에 시스템은 노티피케이션의 제목, 서브타이틀, 두 줄에서 네 줄의 바디 텍스트를 갖는 축약된 배너를 표시합니다. 사용자가 축약된 배너를 누르면 iOS는 모든 노티피케이션 관련 액션을 포함해 전체 노티피케이션 인터페이스를 표시합니다. 시스템은 축약된 배너를 위한 인터페이스를 제공하지만 노티피케이션 컨텐트 앱 확장을 사용해서 전체 인터페이스를 커스터마이징할 수 있습니다.

노티피케이션 컨텐트 앱 확장은 커스텀 노티피케이션 인터페이스를 표시하는 뷰 컨트롤러를 관리합니다. 이 뷰 컨트롤러는 노티피케이션에 대한 기본값 시스템 인터페이스를 보충하거나 대체할 수 있습니다. 아래와 같은 작업을 위해서 뷰 컨트롤러를 사용할 수 있습니다.

  • 알림의 제목, 서브타이틀, 바디 텍스트를 포함해 아이템의 위치를 커스터마이징합니다.
  • 인터페이스 요소에. 대해 폰트 혹은 스타일을 다르게 교체할 수 있습니다.
  • 앱의 특정 데이터를 표시할 수 있습니다(예를 들어 노티피케이션 페이로드의 앱 특정 키를 저장한 데이터).
  • 커스텀 이미지 혹은 브랜딩을 포함시킬 수 있습니다.

앱 확장은 노티피케이션의 컨텐츠, 앱 확장의 번들에서 나타나는 파일과 같은 즉시 사용 가능한 데이터를 사용해 뷰 컨트롤러를 설정해야 합니다. 앱과 앱 확장 사이에 공유하기 위한 앱 그룹을 사용하고 있는 경우 앱 그룹에서 찾을 수 있는 모든 파일을 사용할 수 있습니다. 노티피케이션이 적합한 시점에 전달될 수 있도록 하려면 가능한 빠르게 뷰를 설정하시기 바랍니다. 네트워크에서 데이터를 가져오는 경우처럼 실행하는 데 긴 시간이 소요되는 작업을 수행하지 않아야 합니다.

Note
노티피케이션 앱 확장은 iOS 앱에서만 지원됩니다. watchOS에서 노티피케이션의 모양을 커스터마이징하는 방법에 대한 정보는 App Programming Guide for watchOS를 보시기 바랍니다.

App Programming Guide for watchOS
https://developer.apple.com/documentation/watchkit#//apple_ref/doc/uid/TP40014969

Add the Notification Content App Extension to Your Project

iOS 앱에 노티피케이션 컨텐트 앱 확장을 추가하려면 다음과 같이 합니다.

  1. Xcode에서 File > New > Target을 선택합니다.
  2. iOS Application Extension으로부터 Notification Content Extension을 선택합니다.
  3. 다음을 클릭합니다.
  4. 앱 확장을 위한 이름을 제공합니다.
  5. 완료를 클릭합니다.

Note
프로젝트에 한 가지를 넘는 노티피케이션 컨텐트 앱 확장을 추가할 수 있지만 각각은 노티피케이션 카테고리의 고유한 집합을 지원해야만 합니다. Declare the Supported Notification Types에서 설명하고 있는 것처럼 Info.plist 파일에서 앱 확장에 대한 카테고리를 구체화할 수 있습니다.

Declare the Supported Notification Types는 이 글의 아래에 나옵니다.

Add Views to Your View Controller

Xcode가 제공하는 템플릿은 설정할 수 있는 스토리보드 및 뷰 컨트롤러를 포함하고 있습니다. 뷰 컨트롤러에 뷰를 추가해서 커스텀 노티피케이션 인터페이스를 빌드하시기 바랍니다. 예를 들어 노티피케이션의 제목, 서브타이틀, 바디 텍스트를 표시하기 위해 레이블을 사용할 수 있습니다. 이미지 뷰 및 상호작용 없는 컨텐트를 표시하기 위한 뷰 역시 추가할 수 있습니다. 뷰에 대한 초기 컨텐트를 제공할 필요는 없습니다. 상호작용 컨트롤(예를 들어 버튼 혹은 스위치)을 추가할 수도 있으며, iOS 12 및 이후 버전에서 지원합니다. 이에 대한 더 많은 정보는 Support Interactive Controls를 보시기 바랍니다.

Support Interactive Controls는 이 글의 아래에 나옵니다.

Important
앱 확장 혹은 스토리보드 파일에 추가적인 뷰 컨트롤러를 추가하지 않아야 합니다. 앱 확장은 정확히 하나의 뷰 컨트롤러만 포함해야 합니다.

Configure Your View Controller

레이블 및 다른 뷰를 업데이트하려면 뷰 컨트롤러의 didReceive(_:) 메소드를 사용해야 합니다. 노티피케이션 페이로드는 뷰 컨트롤러를 설정하는 시점에 사용할 데이터를 포함합니다. 앱 확장의 다른 파일로부터 데이터를 사용할 수도 있습니다. Listing 1은 노티피케이션 페이로드로부터 제목 및 바디 텍스트를 가져오는, 그리고 뷰 컨트롤러에서 outlet으로 저장되는 두 개의 UILabel 컨트롤에 스트링을 할당하는 메소드의 버전으 ㄹ보여주고 있습니다.

Listing 1 Configuring the notification interface at runtime

func didReceive(_ notification: UNNotification) {
   self.bodyText?.text = notification.request.content.body
   self.headlineText?.text = notification.request.content.title
}

뷰 컨트롤러가 이미 시각화되어 있을 때 두 번째 노티피케이션이 도착하면 시스템은 새 노티피케이션 페이로드와 함께 didReceive(_:) 메소드를 다시 호출합니다.

Declare the Supported Notification Types

노티피케이션 컨텐트 앱 확장이 제공하고자 하는 인터페이스에 맞게 노티피케이션의 타입을 구체화하시기 바랍니다. 노티피케이션을 받으면 시스템은 노티피케이션의 카테고리 값(노티피케이션의 타입)과 모든 노티피케이션 컨텐트 앱 확장의 선언된 카테고리를 확인하고 일치하는 것이 있는지 확인합니다. 일치하는 것을 찾으면 시스템은 상응하는 앱 확장을 로드합니다.

노티피케이션 컨텐트 앱 확장의 Info.plist 파일에서 확장이 지원하는 노티피케이션의 카테고리 스트링을 갖는 UNNotificationExtensionCategory 키를 설정해야 합니다. 카테고리 스트링은 iOS 앱에 등록한 UNNotificationCategory 객체에 포함된 아이덴티파이어입니다. 이러한 스트링은 앱이 받을 수 있는 노티피케이션 타입을 구분하기 위해 사용할 수 있습니다. 예를 들어 새 미팅 초대의 도착을 나타내는 노티피케이션에 스트링 MEETING_INVITE를 포함시킬 수 있습니다. 아이덴티파이어 스트링은 대소문자를 구분합니다.

Figure 2는 두 가지 다른 타입의 노티피케이션을 지원하는 노티피케이션 컨텐트 앱 확장의 Info.plist 파일을 보여주고 있습니다. 두 가지 타입을 지원하고 있기 때문에 UNNotificationExtensionCategory 키에 대한 값은 스트링 GENERALPLANE_AVAILABLE을 갖는 배열을 구성하고 있습니다. 두 가지 중 해당하는 타입을 갖는 노티피케이션이 도착하면 시스템은 이 노티피케이션 컨텐트 앱 확장으로부터 인터페이스를 표시합니다.

Figure 2 Configuring the Info.plist file of a

Note
처음에 UNNotificationExtensionCategory 키의 값은 노티피케이션 컨텐트 앱 확장이 오직 하나의 노티피케이션 타입만 지원할 수 있게 해주는 스트링입니다. 여러 타입을 지원하려면 타입을 스트링 배열로 바꿔야 합니다.

로컬 노티피케이션의 경우 카테고리 스트링을 UNMutableNotificationContent 객체의 categoryIdentifier 속성에 넣어야 합니다. 원격 노티피케이션의 경우 스트링을 JSON 페이로드의 카테고리 키에 넣어야 합니다. 앱 확장 타입 선언에 대한 더 많은 정보는 Declaring Your Actionable Notification Types를 보시기 바랍니다.

Declaring Your Actionable Notification Types
https://developer.apple.com/documentation/usernotifications/declaring_your_actionable_notification_types
https://velog.io/@panther222128/Declaring-Your-Actionable-Notification-Types

Info.plsit 파일에 있는 키에 대한 더 정보는 UNNotificationContentExtension을 보시기 바랍니다.

UNNotificationContentExtension
https://developer.apple.com/documentation/usernotificationsui/unnotificationcontentextension
https://velog.io/@panther222128/UNNotificationContentExtension

Hide the Default Notification Interface

시스템은 모든 노티피케이션에 커스텀 인터페이스를 포함해서 몇 가지 기본값 정보를 표시합니다. 시스템은 항상 앱 이름 및 아이콘을 포함하는 헤더를 표시합니다. 또한, 시스템은 노티피케이션의 제목, 서브타이틀, 바디 텍스트를 갖는 인터페이스도 표시합니다. 필요에 따라 이러한 인터페이스의 부분을 수킬 수도 있습니다. 예를 들어 커스텀 인터페이스가 같은 정보를 표시하는 경우에 기본값 노티피케이션 인터페이스를 숨길 수 있습니다. Figure 3은 기본값 컨텐트를 포함한 것과 포함하지 않는 경우의 노티피케이션 인터페이스 레이아웃을 보여주고 있습니다.

Figure 3 Layout of the notification interface

기본값 시스템 컨텐트를 제거하려면 확장의 Info.plist 파일에 UNNotificationExtensionDefaultContentHidden 키를 추가해야 하며, 키의 값을 true로 설정해야 합니다. 이 키에 대한 더 많은 정보는 UNNotificationContentExtension를 보시기 바랍니다.

UNNotificationContentExtension
https://developer.apple.com/documentation/usernotificationsui/unnotificationcontentextension
https://velog.io/@panther222128/UNNotificationContentExtension

Incorporating Media Into Your Interface

커스텀 노티피케이션으로부터 오디오 혹은 비디오 재생을 지원하려면 아래 내용을 구현해야 합니다.

  • 뷰 컨트롤러의 mediaPlayPauseButtonType 속성에서 원하는 버튼의 타입을 반환합니다.
  • 뷰 컨트롤러의 mediaPlayPauseButtonFrame 속성에서 버튼의 프레임을 반환합니다.
  • mediaPlay() 메소드에서 미디어 파일 재생을 시작합니다.
  • mediaPause() 버튼에서 미디어 파일 재생을 멈춥니다.

시스템은 모든 사용자 상호작용을 처리하면서 미디어 버튼을 그려줍니다. 버튼이 눌러지면 시스템은 재생을 시작하거나 멈출 수 있도록 mediaPlay()mediaPause() 메소드를 호출합니다.

코드 작성을 통해 미디어 파일의 재생을 시작하거나 멈추길 원한다면 현재 NSExtensionContext 객체의 mediaPlayingStarted()mediaPlayingPaused() 메소드를 호출하시기 바랍니다. 확장 컨텍스트에 접근하려면 뷰 컨트롤러의 extensionContext 속성을 사용하시기 바랍니다.

Support Interactive Controls

iOS 12 및 이후 버전에서 커스텀 노티피케이션에 대해 사용자 상호작용을 활성화할 수 있습니다. 이는 커스텀 인터페이스에서 버튼, 스위치 같은 상호작용 컨트롤을 추가할 수 있게 해줍니다.

사용자 상호작용을 활성화하려면 아래처럼 수행합니다.

  1. 노티피케이션 컨텐트 확장의 Info.plist 파일을 엽니다.
  2. 확장 특성에 UNNotificationExtensionUserInteractionEnabled 키를 추가합니다. 불리언 값을 YES로 설정합니다.

Figure 4는 노티피케이션 활성화된 Info.plist 파일을 보여주고 있습니다.

Figure 4 Enabling user interactions in the notification extension’s info.plist file

좋은 웹페이지 즐겨찾기