Notification Permission은 앱이 사용자에게 푸시 알림 및 로컬 알림을 보내는 데 필요한 권한입니다. Android 13 및 iOS 12부터 앱은 시스템 대화 상자를 통해 런타임에 이 권한을 요청해야 합니다. Android Developers, 2024에 따르면, 명시적인 사용자 동의 없이 앱은 Android 13 이상 기기에서 알림을 표시할 수 없습니다.
핵심 요점
Notification Permission은 앱이 사용자에게 알림을 보내는 기능을 제어하는 시스템 권한입니다. Android 13 이전에는 모든 앱이 요청 없이 알림을 표시할 수 있었습니다 — 매니페스트에서 권한을 선언하는 것만으로 충분했습니다. 그러나 스팸 및 성가신 알림이 증가함에 따라 Google은 iOS와 유사한 필수 런타임 요청을 도입했습니다.
iOS에서는 iOS 8부터 알림 권한이 필수였으며, iOS 12부터 임시 알림(Provisional Notification)이 도입되었습니다 — 소리 없이 전달되고 명시적 요청 없이 알림 센터에 표시되는 무음 알림입니다. 임시 알림을 통해 개발자는 전체 권한을 요청하기 전에 사용자에게 알림의 가치를 보여줄 수 있습니다.
Localytics (2024)에 따르면 iOS 사용자의 61%와 Android 사용자의 55%가 요청 후 푸시 알림 수신에 동의합니다. 승인 전환율은 요청 컨텍스트에 직접적으로 의존합니다: 첫 번째 가치 있는 상호작용 후에 권한을 요청하는 앱은 첫 실행 시 요청하는 앱보다 40% 더 많은 승인을 받습니다.
알림 권한의 진화는 플랫폼이 이 통신 채널에 대한 앱의 접근을 단계적으로 제한한 방식을 보여줍니다. 이러한 진화를 이해하면 개발자가 다양한 OS 버전을 올바르게 처리하는 데 도움이 됩니다.
Android 13(2022) 이전에는 모든 앱이 사용자 동의 없이 알림을 표시할 수 있었습니다. Android 8.0(2017)은 알림 채널을 도입했고, Android 12(2021)는 성가신 알림의 자동 차단을 추가했으며, 마지막으로 Android 13은 런타임에 POST_NOTIFICATIONS를 요청하는 것을 필수화했습니다. targetSdkVersion이 33 미만인 앱의 경우 시스템이 자동으로 권한을 부여하지만, Google Play는 2023년 8월부터 targetSdkVersion을 33+로 업데이트해야 합니다.
iOS 8(2014)은 UIUserNotificationSettings를 통한 필수 권한 요청을 도입했습니다. iOS 10(2016)은 리치 알림을 지원하는 UNUserNotificationCenter를 발표했습니다. iOS 12(2018)는 임시 알림 및 그룹화된 알림을 추가했습니다. iOS 15(2021)는 포커스 모드를 도입하여 앱 권한과 관계없이 알림을 차단할 수 있습니다. App Tracking Transparency(iOS 14.5)는 알림과 관련이 없지만 권한 요청의 전반적인 문화에도 영향을 미쳤습니다.
현재 두 플랫폼 모두 런타임 Notification Permission 요청이 필요합니다. 개발자는 더 이상 알림의 자동 활성화에 의존할 수 없습니다. 사용자는 어떤 앱이 알림을 보낼 수 있는지 완전히 제어할 수 있습니다. Android의 알림 채널과 iOS의 알림 카테고리를 통해 사용자는 수신하는 알림 유형을 세밀하게 조정할 수 있습니다.
Android에서의 Notification Permission은 매니페스트에 선언된 POST_NOTIFICATIONS 권한을 통해 활성화되며, Android 13+의 경우 런타임 요청이 이어집니다.
Android 13+의 경우 AndroidManifest.xml에서 POST_NOTIFICATIONS 권한을 선언해야 합니다. Android 12 및 이하 버전과의 하위 호환성을 위해 권한은 시스템에 의해 자동으로 부여됩니다 — 추가 조치가 필요하지 않습니다.
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
POST_NOTIFICATIONS 권한 요청은 Activity Result API를 통해 수행됩니다. SDK 버전을 확인하는 것이 중요합니다: Android 12 및 이하에서는 요청이 필요하지 않습니다 — 권한이 자동으로 부여된 것으로 간주됩니다.
private val notificationPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
createNotificationChannel()
showPushNotification()
} else {
logPermissionDenied()
}
}
fun requestNotificationAccess() {
if (Build.version.SDK_INT <= Build.VERSION_CODES.S_V2) {
// Android 12 및 이하 — 권한이 자동으로 부여됨
showNotification()
return
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
showNotification()
} else {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
Android 8.0+에서는 앱이 첫 번째 알림을 보내기 전에 NotificationChannel을 통해 알림 채널을 생성해야 합니다. 채널에는 IMPORTANCE_NONE부터 IMPORTANCE_HIGH까지의 중요도 수준이 있으며, 이는 알림이 소리 및 배너와 함께 표시될지 여부를 결정합니다. 사용자가 앱에 대한 알림을 비활성화한 경우 설정에서 다시 활성화될 때까지 새 채널이 적용되지 않습니다. 메시지, 광고, 시스템 이벤트 등 다양한 유형의 알림에 대해 별도의 채널을 만드는 것이 좋습니다.
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID_MESSAGES,
"메시지",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "새 메시지 알림"
enableVibration = true
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
iOS에서의 Notification Permission은 UNUserNotificationCenter를 통해 요청됩니다. Apple은 2단계 접근 방식을 권장합니다: 먼저 임시 알림을 요청하고, 가치를 입증한 후 전체 권한을 요청합니다.
임시 알림은 소리나 배너 없이 알림 센터에 나타나는 무음 알림입니다. 사용자의 명시적 동의가 필요하지 않으며, 전체 요청 전에 앱이 알림의 가치를 입증할 수 있도록 합니다. 여러 임시 알림을 받은 후 사용자는 알림 자체의 메뉴를 통해 전체 알림을 활성화할 수 있습니다.
import UserNotifications
func requestNotificationPermission() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
if let error = error {
print("Notification error: \(error.localizedDescription)")
return
}
if granted {
registerForRemoteNotifications()
} else {
handleDeniedPermission()
}
}
}
func requestProvisionalOnly() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.provisional, .alert, .badge, .sound]) { granted, error in
// 임시 — 사용자가 대화 상자를 보지 않음
// 알림 센터에 소리 없이 알림 도착
registerForRemoteNotifications()
}
}
iOS의 현재 Notification Permission 상태는 UNUserNotificationCenter.current().getNotificationSettings를 통해 확인할 수 있습니다. .authorized, .denied, .provisional 또는 .notDetermined 상태는 앱이 올바른 동작을 선택할 수 있게 합니다. 첫 번째 거부 후 시스템 대화 상자가 다시 표시되지 않습니다 — UIApplication.openSettingsURLString을 통해 사용자를 설정으로 리디렉션해야 합니다. Apple은 또한 특정 시나리오에 대해 임시 알림을 제공하는 .ephemeral 상태(iOS 17+)를 처리할 것을 권장합니다.
모범 사례는 Notification Permission 요청 시 승인 전환율을 높이고 사용자 이탈을 줄이는 것을 목표로 합니다. 잘못된 요청은 앱이 알림을 보낼 수 있는 능력을 상실시킬 뿐만 아니라 앱 삭제로 이어질 수 있습니다.
가장 일반적인 안티패턴은 앱 첫 실행 시 Notification Permission을 요청하는 것입니다. 사용자는 아직 앱의 가치를 이해하지 못하며 거부할 가능성이 매우 높습니다. 최적의 시점은 사용자가 첫 번째 가치 있는 작업(주문, 메시지 전송, 업데이트 구독)을 수행한 후입니다. 사후 가치 프롬프트는 승인 전환율을 65-75%까지 높입니다.
시스템 대화 상자 전에 사용자가 받게 될 알림의 예시와 함께 자체 화면을 표시하세요. 텍스트와 아이콘이 포함된 향후 알림의 목업을 표시합니다. 사용자가 알림이 유용하고 방해가 되지 않을 것임을 알면 동의할 가능성이 더 높아집니다. 사전 권한 화면의 알림 미리보기는 전환율을 35-50% 높이는 효과적인 기술입니다.
iOS에서 적극적으로 임시 알림을 요청하면 사용자의 명시적 동의 없이 알림을 전달할 수 있습니다. 사용자가 이러한 알림에서 가치를 발견하면 알림의 컨텍스트 메뉴를 통해 전체 알림을 활성화할 수 있습니다. Apple은 뉴스 앱, 날씨 앱 및 알림이 거래적이 아닌 정보 제공적인 다른 서비스에 이 접근 방식을 권장합니다. Apple WWDC 2024에 따르면 이 접근 방식은 전체 승인 전환율을 20-30% 증가시킵니다.
자주 묻는 질문
거부 후 시스템 대화 상자가 다시 표시되지 않습니다. 알림을 활성화하는 유일한 방법은 Android에서는 Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)를 통해, iOS에서는 UIApplication.openSettingsURLString을 통해 사용자를 시스템 설정으로 리디렉션하는 것입니다. 지침과 이동 버튼이 있는 화면을 표시하세요.
Android 12 및 이하에서는 Notification Permission이 필요하지 않습니다 — 모든 앱이 요청 없이 알림을 보낼 수 있습니다. 그러나 사용자는 언제든지 시스템 설정을 통해 알림을 비활성화할 수 있습니다. Android 13부터 targetSdkVersion 33+의 경우 런타임 요청이 필수입니다.
NotificationChannel은 Android 8.0에서 도입된 알림 카테고리입니다. 각 채널에는 이름, 설명, 중요도 수준 및 그룹이 있습니다. 사용자는 앱의 모든 알림을 비활성화하지 않고 개별 채널을 비활성화할 수 있습니다. 예를 들어 “새 메시지” 채널과 “프로모션 메일” 채널을 다르게 구성할 수 있습니다.
Android 13+에서 POST_NOTIFICATIONS 없이 NotificationManager.notify를 호출하면 시스템에서 무시됩니다. iOS에서 UNUserNotificationCenter 권한 없이는 알림이 전달되지 않습니다. 예외: iOS의 Provisional(소리 없음, 알림 센터만) 및 Android 12-(권한 불필요).
Android에서는 NotificationManagerCompat.areNotificationsEnabled()를 사용합니다. iOS에서는 UNUserNotificationCenter.current().getNotificationSettings를 호출하고 authorizationStatus 속성을 확인합니다. Android의 경우 추가로 채널 중요도를 확인합니다: NotificationChannel.getImportance()가 IMPORTANCE_NONE이 아니어야 합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.