Notification Content Extension은 표준 푸시 알림 인터페이스를 커스텀 UIView로 대체할 수 있는 iOS 확장 기능입니다. 개발자는 콘텐츠 표시를 완전히 제어할 수 있습니다: 이미지, 비디오, 애니메이션, 커스텀 폰트 및 인터랙티브 요소.Apple Developer, 2025에 따르면, Notification Content Extension은 알림의 제한된 공간에서 모든 UIKit 인터페이스를 지원합니다.
핵심 포인트
Notification Content Extension은 푸시 알림의 표시 템플릿을 커스텀 UIView로 대체하는 iOS 앱 확장 기능입니다. 콘텐츠가 제목, 부제목 및 본문으로 제한되는 일반 알림과 달리, 확장 기능은 좌표가 있는 지도, 그래프, 이미지 갤러리 또는 입력 양식 등 모든 UIKit 인터페이스를 표시할 수 있습니다.
iOS가 지정된 categoryIdentifier와 함께 푸시 알림을 수신하면, 시스템은 이 카테고리에 등록된 확장 기능이 있는지 확인합니다. 있다면 — 시스템은 별도 프로세스에서 확장 기능을 시작하고 알림 콘텐츠를 전달합니다. 확장 기능은 표준 대신 자체 인터페이스를 표시합니다. 사용자는 기본 애플리케이션을 열지 않고 커스텀 인터페이스와 상호 작용합니다.
Notification Content Extension을 Notification Service Extension과 혼동하지 않는 것이 중요합니다. Service Extension은 알림 표시 전에 콘텐츠를 처리합니다(첨부 파일 다운로드, 복호화). Content Extension은 준비된 콘텐츠를 받은 후 인터페이스를 대체합니다. 두 확장 기능은 함께 작동할 수 있습니다: Service Extension이 데이터를 준비하고 Content Extension이 이를 표시합니다.
| 특성 | Content Extension | Service Extension |
|---|---|---|
| 목적 | 커스텀 알림 UI | 표시 전 콘텐츠 수정 |
| 실행 시간 | 사용자가 알림을 보는 동안 | 백그라운드에서 최대 30초 |
| 인터페이스 | 완전한 UIKit UIView | 인터페이스 없음 |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Notification Content Extension은 제한된 리소스로 격리된 프로세스에서 작동합니다. 확장 기능은 App Group을 제외하고 NSUserDefaults를 통해 기본 애플리케이션의 저장소에 접근할 수 없습니다. 확장 기능의 크기는 압축 해제 상태에서 50 MB로 제한됩니다. 콘텐츠 표시 시간도 제한되어 있으며, 확장 기능이 합리적인 시간 내에 업데이트를 완료하지 않으면 시스템이 이를 종료합니다.
Xcode에서 확장 기능을 생성하려면 Notification Content Extension 유형의 새 target을 추가해야 합니다. Xcode는 UIViewController를 상속하고 UNNotificationContentExtension을 구현하는 컨트롤러와 함께 MainInterface.storyboard를 자동으로 생성합니다.
Xcode에서 File → New → Target → Notification Content Extension을 선택합니다. 확장 기능의 이름, 언어(Swift 또는 Objective-C)를 지정하고 프로젝트가 동일한 개발자 팀에 연결되어 있는지 확인합니다. target 생성 후 MainInterface.storyboard, Info.plist 및 컨트롤러 파일의 세 파일이 포함된 폴더가 나타납니다.
확장 기능의 Info.plist에는 UNNotificationExtensionCategory 키를 가진 NSExtensionAttributes 배열을 반드시 지정해야 합니다. 이 배열에는 확장 기능이 활성화될 알림 카테고리의 식별자가 포함됩니다. 선택적 키인 UNNotificationExtensionInitialContentSizeRatio는 올바른 위치 지정을 위해 커스텀 인터페이스의 초기 종횡비를 설정합니다.
target 확장 기능에서 깔끔한 아키텍처를 유지하는 것이 좋습니다: 컨트롤러용 별도 폴더, 커스텀 View용 별도 폴더. 확장 기능은 별도의 바이너리이므로 기본 애플리케이션의 코드에 직접 접근할 수 없습니다. 코드 공유를 위해 별도의 프레임워크를 생성하거나 데이터용 App Group을 사용하세요.
UNNotificationContentExtension은 Notification Content Extension의 컨트롤러가 구현해야 하는 프로토콜입니다. 유일한 필수 메서드는 알림 수신 시 호출되는 didReceive(_:with:)입니다. 컨트롤러는 알림과 데이터로 업데이트해야 하는 준비된 뷰 컨트롤러를 받습니다.
확장 기능 컨트롤러는 UIViewController를 상속하고 UNNotificationContentExtension을 구현해야 합니다. Storyboard 또는 xib는 이 컨트롤러에 연결됩니다. 알림 수신 시 didReceive 메서드가 콘텐츠를 전달하고 컨트롤러가 뷰를 업데이트합니다.
import UIKit
import UserNotifications
import UserNotificationsUI
class CustomNotificationViewController: UIViewController {
@IBOutlet var titleLabel: UILabel!
@IBOutlet var customImageView: UIImageView!
func didReceive(
notification: UNNotification
) {
let content = notification.request.content
titleLabel.text = content.title
loadAttachment(content.attachments.first)
}
private func loadAttachment(attachment: UNNotificationAttachment?) {
guard let url = attachment?.URL else { return }
if let image = UIImage(contentsOfFile: url.path) {
customImageView.image = image
}
}
}
extension CustomNotificationViewController: UNNotificationContentExtension {
func didReceive(
notification: UNNotification
) {
didReceive(notification: notification)
}
}
시스템은 Info.plist의 UNNotificationExtensionInitialContentSizeRatio 키와 현재 콘텐츠를 기반으로 커스텀 인터페이스의 크기를 결정합니다. 최소 초기 크기를 위해 이 키를 0.1로 설정하고, 콘텐츠 로드 후 preferredContentSize를 통해 크기를 변경하는 것이 좋습니다.
Notification Content Extension은 인터페이스 생성에 완전한 자유를 제공합니다. UITableView, MKMapView, WKWebView, UIStackView 등 모든 UIKit 구성 요소를 사용할 수 있습니다. 그러나 알림의 제한된 공간을 고려하고 성능을 최적화하는 것이 중요합니다.
인기 있는 사용 사례 중 하나는 위치 정보가 있는 지도를 표시하는 것입니다. 이를 위해 확장 기능의 Storyboard에 MKMapView를 추가하고 컨트롤러가 알림 콘텐츠에서 좌표를 전달합니다. 확장 기능의 target에 MapKit을 추가하는 것을 잊지 마세요. 지도 사용 시 확장 기능의 메모리 제한을 고려하세요 — 복잡한 타일 로딩이 사용 가능한 리소스를 초과할 수 있습니다.
Notification Content Extension은 크기 변경, 이동 및 요소 투명도를 포함한 UIView 애니메이션을 지원합니다. 알림의 확장 모드 진입 시 콘텐츠 등장 애니메이션을 시작할 수 있습니다. 애니메이션은 짧아야 하며(0.5초까지) 사용자의 알림 상호 작용을 방해하지 않아야 합니다. 무한 애니메이션은 피하세요 — 배터리를 소모하고 성능을 저하시킵니다.
확장 기능은 완전한 UIViewController이므로 제스처 및 탭 핸들러를 추가할 수 있습니다. UIKit 제스처(UITapGestureRecognizer, UIButton)는 표준적으로 작동합니다. 애플리케이션 실행이 필요한 작업에는 확장 기능 델리게이트 또는 userNotificationCenter를 사용하세요. 인터랙티브 요소는 제한된 공간에서 편안한 탭을 위해 충분히 커야 합니다 — Apple 권장사항에 따른 최소 터치 대상 크기는 44x44 포인트입니다.
미디어 콘텐츠는 Notification Content Extension의 핵심 기능입니다. 알림에는 커스텀 인터페이스에 표시되는 이미지, GIF, 오디오 및 비디오가 포함될 수 있습니다. 첨부 파일은 UNNotificationAttachment를 통해 전달되며, 서버가 페이로드를 통해 추가하거나 Notification Service Extension이 다운로드 후 추가할 수 있습니다. JPEG, PNG, MPEG-4 및 MP3 형식이 지원됩니다.
이미지를 표시하려면 알림 콘텐츠에서 UNNotificationAttachment를 가져와 로컬 URL에서 로드하면 됩니다. 확장 기능은 로컬 파일에만 접근할 수 있다는 점을 기억하세요 — 원격 리소스는 사전에 Service Extension이 다운로드해야 합니다. 최대 크기 — iOS 15+에서 50 MB, 이후 업데이트에서 제한이 변경됩니다. 여러 이미지를 지원하려면 다른 식별자를 가진 UNNotificationAttachment를 사용하고 UIPageViewController를 통해 표시하세요.
커스텀 인터페이스에 이미지를 표시하기 위해 확장 기능은 알림 콘텐츠에서 UNNotificationAttachment를 가져와 로컬 URL에서 로드합니다. 첨부 파일은 사전에 Notification Service Extension에 의해 다운로드되어야 합니다 — Content Extension은 네트워크 접근 권한이 없습니다. 미디어 첨부 파일 최대 크기 — iOS 15+에서 50 MB, 이전 버전에서는 제한이 10 MB였습니다. 확장 기능은 첨부 파일이 없을 경우 적절히 처리하고 폴백 인터페이스를 표시해야 합니다. 저해상도 이미지를 미리 로드하려면 Service Extension이 첨부 전에 생성한 썸네일 버전을 사용하세요.
iOS는 AVPlayerLayer를 통해 Notification Content Extension에서 비디오 재생을 지원합니다. 확장 기능은 알림 내에 컨트롤 버튼이 있는 비디오 플레이어를 표시할 수 있습니다. 이는 특히 감시 애플리케이션, 스트리밍 또는 콘텐츠 미리보기에 유용합니다. 사용자가 이 알림에서 미디어 콘텐츠를 기대하는 경우 자동 재생은 소리 없이 허용됩니다. 비디오 플레이어 구현 시 컨트롤 요소(재생/일시정지, 진행 표시줄, 닫기 버튼)를 추가하세요. 비디오가 자동으로 소리와 함께 시작되지 않는지 확인하세요 — 이는 Apple의 사용자 경험 권장사항을 위반합니다. 여러 이미지의 슬라이드쇼를 위해 페이지 넘김 전환 옵션이 있는 UIView.transition을 통해 애니메이션 전환을 사용하세요.
Notification Content Extension은 약 50 MB의 메모리 제한이 있는 제한된 환경에서 작동합니다. 성능 최적화를 위해 이미지 지연 로딩을 사용하고, 메인 스레드에서 무거운 계산을 피하며, 간단한 제약 조건으로 Auto Layout을 적용하세요. 이미지 처리나 데이터 분석과 같은 무거운 작업은 백그라운드 큐(DispatchQueue.global)에서 실행하세요. 메모리 제한을 초과하면 시스템이 확장 기능을 종료하고 사용자에게 표준 알림이 표시됩니다. 출시 전에 Instruments(Allocations 및 Time Profiler)를 통해 확장 기능을 프로파일링하고 다양한 iOS 버전의 실제 기기에서 메모리 사용량을 확인하는 것이 좋습니다.
자주 묻는 질문
네, iOS 16부터 Notification Content Extension은 UIHostingController를 통해 SwiftUI를 지원합니다. 그러나 확장 기능에서 SwiftUI 지원이 제한적이므로 복잡한 인터페이스에는 UIKit이 더 안정적인 선택입니다.
알림 페이로드의 categoryIdentifier가 확장 기능 Info.plist의 UNNotificationExtensionCategory와 일치하는지 확인하세요. 또한 확장 기능이 메인 앱 target에 추가되고 올바르게 서명되었는지 확인하세요.
App Group — 공유 저장소(UserDefaults suite) 또는 파일 컨테이너를 사용하세요. 기본 애플리케이션과 확장 기능은 동일한 개발자 그룹에 속하고 App Groups 기능이 활성화되어 있어야 합니다.
미디어 제어를 위해 didReceive(_:with:) with UNNotificationContentExtensionMediaPlayPauseButtonType 메서드를 사용하거나 델리게이트를 통해 업데이트를 요청하세요. 새 알림 없이 전체 콘텐츠 업데이트는 불가능합니다.
Xcode에서 확장 기능의 target을 선택하고 시뮬레이터에서 실행하세요. 일반 애플리케이션처럼 lldb와 중단점을 사용하세요. 테스트를 위해 Firebase Console을 통해 푸시 알림을 보내거나 로컬에서 Pusher를 통해 보내세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.