Notification Content Extension — 핵심, 커스텀 UI 및 iOS 설정

저자: IT Sectr 게시일: 2026-06-15 읽는 시간: 9 분

Notification Content Extension—푸시 알림의 표준 템플릿을 완전히 커스텀 사용자 인터페이스로 대체하는 iOS 확장 유형입니다. 개발자는 알림 내부에 이미지, 오디오 플레이어, 액션 버튼, 진행률 표시줄 및 커스텀 애니메이션을 표시할 수 있어, 표준 배너를 본격적인 미니 애플리케이션으로 확장합니다. WWDC 2025 데이터에 따르면, 이 확장은 UNNotificationContentExtension을 사용하며 하나의 알림에서 최대 4개의 미디어 첨부 파일을 지원하고 UNNotificationAction을 통한 인터랙티브 액션 처리를 제공합니다.

핵심 사항

  • Notification Content Extension은 표준 시스템 템플릿 대신 푸시 알림을 위한 커스텀 인터페이스를 생성합니다
  • 아키텍처는 UNNotificationContentExtension 프로토콜을 기반으로 하며 didReceive(_:with:) 및 didReceive(_:withCompletionHandler:) 메서드를 포함합니다
  • 확장은 앱을 열지 않고도 알림 내부에 미디어 첨부 파일—이미지, 오디오, 비디오—을 직접 표시할 수 있습니다
  • 인터랙티브 알림은 피드백 및 텍스트 입력이 있는 커스텀 액션을 지원합니다
  • 인터페이스 크기는 제한적이며—커스텀 알림의 최대 높이는 iPhone에서 320포인트, iPad에서 352포인트입니다

Notification Content Extension이란

Notification Content Extension—iOS에서 푸시 알림 표시를 재정의하는 앱 확장입니다. 제목, 메시지 본문 및 버튼이 있는 표준 배너 대신, Interface Builder에서 완전히 개발되었거나 UIKit 또는 SwiftUI를 통해 프로그래밍 방식으로 생성된 인터페이스를 표시할 수 있습니다.

표시 전에 콘텐츠를 수정하는 Notification Service Extension과 달리, Content Extension은 시각적 표현만 담당합니다. 확장은 모든 수정 후 준비된 알림을 받아 표시 방법을 결정합니다. 이것이 두 가지 알림 확장 유형의 주요 차이점입니다.

확장은 사용자가 확장 제스처(알림을 아래로 스크롤하거나 기기 모델에 따라 알림을 클릭)를 수행할 때 활성화됩니다. iOS는 확장 프로세스를 시작하고, 지정된 nib 또는 storyboard에서 컨트롤러를 생성한 다음 UNNotificationContentExtension을 통해 알림을 전달합니다.

커스텀 알림 인터페이스 만들기

개발은 Xcode에서 Notification Content Extension 템플릿으로 새 target을 추가하는 것으로 시작됩니다. Xcode는 MainInterface.storyboard 파일과 UNNotificationContentExtension 프로토콜을 구현하는 UIViewController를 상속하는 클래스를 생성합니다.

인터페이스 크기 및 제한 사항

커스텀 영역의 최대 높이는 iPhone(대형 화면 모델의 경우)에서 320포인트, iPad에서 352포인트입니다. 이 경계를 초과하는 콘텐츠는 잘립니다. 다양한 크기에 적응하려면 스크롤 가능한 콘텐츠에 Auto Layout 및 UIScrollView를 사용하는 것이 좋습니다. 너비는 항상 알림 너비와 같으며 기기 회전 시 자동으로 변경됩니다.

Apple Human Interface Guidelines은 경고합니다: 알림 인터페이스는 간결해야 하며 이미지, 플레이어, 지도 또는 빠른 입력 양식과 같은 하나의 주요 요소만 포함해야 합니다. 여러 인터랙티브 요소는 사용자를 압도하고 상호작용을 복잡하게 만듭니다.

메인 애플리케이션과의 연결

App Group—확장과 메인 애플리케이션 간의 데이터 교환을 위한 유일한 메커니즘입니다. App Group의 공유 디렉토리를 통해 캐시된 이미지, 토큰 및 설정을 전송할 수 있습니다. 프로세스 격리로 인해 메인 애플리케이션의 API 직접 호출 또는 해당 UserDefaults에 대한 액세스는 불가능합니다.

swift
class NotificationViewController: UIViewController {

    func didReceive(
        _ notification: UNNotification
    ) {
        guard let attachment = notification
            .request.content.attachments.first()
        else { return }
        if attachment.url.startAccessingSecurityScopedResource() {
            imageView.image = UIImage(contentsOfFile:
                attachment.url.path)
            attachment.url.stopAccessingSecurityScopedResource()
        }
    }
}

UNNotificationContentExtension 프로토콜

UNNotificationContentExtension—커스텀 알림의 수명 주기를 정의하는 주요 프로토콜입니다. 프로토콜은 콘텐츠 수신, 액션 처리 및 인터페이스 관리를 위한 메서드를 제공합니다.

didReceive:with: 메서드

didReceive(_:with:)는 알림을 수신할 때 호출됩니다. 확장은 미디어 플레이어를 관리하기 위한 UNNotification 객체와 UNNotificationContentExtensionMediaPlayPauseButtonType을 받습니다. 이 메서드에서 인터페이스를 설정해야 합니다—이미지 로드, 플레이어 초기화 또는 데이터 표시. 시스템은 실시간으로 알림이 업데이트될 때마다 이 메서드를 호출합니다.

확장에는 실행을 위한 제한된 시간이 있다는 점을 유의해야 합니다—전체 표시 주기에 약 30초입니다. 이 시간 내에 인터페이스가 준비되지 않으면 iOS가 시스템 알림을 표시합니다. 무거운 리소스(네트워크에서 이미지 로드, 비디오 디코딩)의 경우 App Group을 통한 사전 캐싱과 함께 비동기 작업을 사용하는 것이 좋습니다.

미디어 플레이어 관리

프로토콜에는 play/pause 버튼을 위한 선택적 메서드가 포함됩니다: mediaPlay, mediaPausemediaPlayPauseButtonType. 알림에 오디오 또는 비디오 콘텐츠가 포함된 경우, 확장은 시스템 제어 요소가 있는 내장 플레이어를 표시할 수 있습니다. 적절한 버튼 유형을 반환하면 iOS가 자동으로 확장의 오른쪽 상단 모서리에 재생 버튼을 추가합니다.

미디어 첨부 파일 및 처리

UNNotificationAttachment—알림에 첨부된 미디어 데이터를 포함하는 객체입니다. 이미지, 오디오 파일 및 비디오는 서버에서 또는 Notification Service Extension에서 UNNotificationAttachment를 통해 알림 생성 단계에서 추가됩니다.

지원 형식

이미지: JPEG, PNG, GIF, HEIF. 오디오: MP3, AAC, ALAC, WAV. 비디오: MPEG-4, H.264, HEVC. 각 첨부 파일의 최대 크기는 50MB, 알림당 최대 4개의 첨부 파일입니다. 시스템은 알림 표시 전에 백그라운드에서 자동으로 첨부 파일을 다운로드하고 security-scoped 리소스를 통해 확장에 로컬 URL 액세스를 제공합니다.

Apple에 따르면, 확장이 직접 미디어를 다운로드해서는 안 됩니다—시스템이 다운로드를 완료한 후 UNNotificationAttachment에는 이미 로컬 URL이 포함되어 있습니다. 그러나 첨부 파일이 제때 로드되지 않은 경우(예: 연결 불량), 확장은 플레이스홀더 또는 대체 텍스트를 표시할 수 있습니다.

security-scoped 리소스 작업

각 UNNotificationAttachment는 security-scoped URL을 제공하며, 확장은 startAccessingSecurityScopedResource()를 통해 액세스하고 stopAccessingSecurityScopedResource()를 통해 해제해야 합니다. 이러한 메서드는 쌍으로 호출해야 합니다—그렇지 않으면 리소스가 해제되지 않고 액세스 권한이 누출됩니다.

swift
let attachment = notification.request.content.attachments.first()
guard attachment.url.startAccessingSecurityScopedResource()
else { return }
defer { attachment.url.stopAccessingSecurityScopedResource() }
let data = try Data(contentsOf: attachment.url)
imageView.image = UIImage(data: data)

인터랙티브 알림 및 액션

Notification Content Extension은 커스텀 인터랙티브 액션—알림 콘텐츠 아래에 표시되는 버튼—을 지원합니다. 액션은 UNNotificationCategory를 통해 알림 카테고리를 생성할 때 등록되며, 파괴적, 텍스트 또는 백그라운드 유형이 될 수 있습니다.

액션 유형

UNNotificationAction—제목과 선택적 파괴적 플래그가 있는 단순 액션입니다. UNTextInputNotificationAction—텍스트 입력 필드가 있는 액션으로, 예를 들어 메시지에 빠르게 답장하기 위한 것입니다. 두 유형 모두 UNNotificationActionOptions.authenticationRequired 옵션을 지원합니다—실행 전 기기 잠금 해제 필요.

확장은 didReceive(_:withCompletionHandler:) 메서드를 통해 선택된 액션을 수신하며, 액션 식별자와 선택적 텍스트가 포함된 UNNotificationResponse 객체가 전달됩니다. 확장은 응답을 직접 처리하거나 공유 App Group 컨테이너를 통해 메인 애플리케이션으로 전달할 수 있습니다.

swift
let category = UNNotificationCategory(
    identifier: "message",
    actions: [
        UNTextInputNotificationAction(
            identifier: "reply",
            title: "Reply",
            options: .authenticationRequired
        ),
        UNNotificationAction(
            identifier: "mark_read",
            title: "Mark Read",
            options: .foreground
        )
    ],
    intentIdentifiers: []
)

자주 묻는 질문

Notification Content Extension과 Service Extension의 차이점은 무엇인가요?

Content Extension은 알림의 시각적 표시를 담당하고, Service Extension은 표시 전에 콘텐츠를 수정합니다. Content Extension은 Service Extension 후에 작동하며 알림 페이로드를 변경할 수 없습니다.

어떤 프로그래밍 언어가 지원되나요?

Swift 및 Objective-C(UIKit용). iOS 16부터 SwiftUI도 NotificationContentView를 통해 크기 및 구성 수정자와 함께 알림 인터페이스 생성을 지원합니다.

Notification Content Extension에서 SwiftUI를 사용할 수 있나요?

네, iOS 16부터 확장은 UIHostingController를 통해 SwiftUI를 사용할 수 있습니다. 그러나 UIKit의 모든 기능—크기, 제약 조건, security-scoped 리소스—은 유지되며 SwiftUI 콘텐츠에 적용됩니다.

하나의 알림에 몇 개의 미디어 첨부 파일을 추가할 수 있나요?

알림당 최대 4개의 첨부 파일. 각 첨부 파일 크기는 최대 50MB. 지원 형식: 이미지(JPEG, PNG, HEIF), 오디오(MP3, AAC), 비디오(MPEG-4, H.264).

확장에서 메인 애플리케이션으로 데이터를 전송하는 방법은?

App Group을 통해—디스크의 공유 디렉토리. app group 접미사가 있는 UserDefaults도 작동합니다. 확장 프로세스 격리로 인해 메인 애플리케이션 API에 대한 직접 호출은 불가능합니다.

요약

  • Notification Content Extension은 표준 알림 인터페이스를 모든 시각적 요소가 있는 커스텀 인터페이스로 대체합니다
  • 아키텍처는 인터페이스 업데이트를 위한 didReceive 메서드와 함께 UNNotificationContentExtension 프로토콜을 사용합니다
  • UNNotificationAttachment는 자동 백그라운드 다운로드 및 security-scoped 액세스와 함께 미디어 첨부 파일을 제공합니다
  • 인터랙티브 액션은 UNNotificationAction을 통해 텍스트 입력 및 파괴적 작업을 지원합니다
  • 인터페이스 최대 높이는 iPhone에서 320포인트이며, 콘텐츠 적응에는 UIScrollView를 권장합니다
  • 메인 애플리케이션과의 데이터 교환은—App Group 및 디스크의 공유 디렉토리를 통해서만 가능

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기