Missing permissions required by NotificationManagerCompat.notify: android.permission.POST_NOTIFICATIONS
Android 12 까지는 앱에서 별도의 권한을 받지 않고 Notification 을 띄울 수 있었다. (활성화 상태가 디폴트값)
앱 설정에서 Notification 알림 활성을 통해 Notification 권한을 조정했다.
그러나
Android 13 부터는 Notificatioin 권한이 기본적으로 비활 상태이며 유저가 권한을 허용해주어야만 활성화 상태가 된다.
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"
AndroidManifest 에서 Notificatioin 권한을 요청할 수 있다. Target SDK API 33 이상에서만 권한 수가가 가능하며, 그 이후는 기존 안드로이드 권한 요청과 동일하다.
기존 안드로이드 OS에서는 따로 알림 관련된 권한 요청이 없었다.
POST_NOTIFICATIONS 해당 권한 요청을 아무리 보내도 권한 알림 팝업은 노출되지 않는다.
알림 권한은 기존과 동일하게 설정에 들어가서 활성화/비활성화를 진행하며 기본 앱 진입 시 무조건 활성화 상태로 진입되게 된다.
Android 13 부터는 Notification 권한이 존재한다. 그러나 Target SDK 33 이상부터 알림 관련 퍼미션을 정의할 수 있다. (android.permission.POST_NOTIFICATIONS)
Target SDK 32 이하인 앱이 Android 13 디바이스에 설치된다면
notificationChannel을 등록할 때 자동으로 알림 권한 팝업이 노출된다.
PendingIntent은 다른 애플리케이션(또는 동일한 애플리케이션의 다른 구성요소)에서 수행할 작업을 나타내는 클래스이다. 일반적으로 알림을 사용하여 사용자가 앱의 액티비티로 이동하거나 특정 작업을 수행하는 데 사용된다.
Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
에뮬레이터가 31버전 이상이므로 위와 같은 이슈를 확인했다.
PendingIntent 를 생성할 때, s+(버전 31 이상)를 타겟팅하려면 flag_immutable 또는 flag_mutable 중 하나를 지정해야 한다.
공식 문서에 의하면, 일부 변경이 가능한 PendingIntent 에 의존하는 경우에만 FLAG_MUTABLE을 사용하고, 다른 경우에는 FLAG_IMMUTABLE 사용을 강력히 권고한다.
PendingIntent 를 보호할 수 있다. 다른 앱으로 PendingIntent 를 전달하거나, 백그라운드 작업에서 사용할 때 유용하다. 불변이므로 안전하게 공유 가능하며 보안에 유리하다.
즉, 안전하게 보호된 PendingIntent 르 사용하려고 할 때 유용.
PendingIntent 를 업데이트하고 변경할 수 있다. 동적으로 PendingIntent 를 조작해야 할 때 유용하다. 특정 액션에 대한 PendingIntent 를 만들었는데, 사용자가 액션을 변경하면 그에 맞게 PendingIntent 를 업데이트할 수 있다.
즉, 동적인 상황에서 PendingIntent 를 업데이트하고 변경할 때 유용
이미 존재하는 PendingIntent가 있을 경우, 해당 PendingIntent를 업데이트하여 사용하도록 설정한다. 동일한 요청 코드를 가지고 여러 번 PendingIntent를 생성할 때, 이전에 생성된 PendingIntent를 업데이트하여 사용할 수 있어, 성능 향상과 메모리 누수를 방지한다.
val intent = Intent(this, MainActivity::class.java)
val pendingIntent: PendingIntent? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
} else {
PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
API 레벨이 23 이상인 경우에만 FLAG_IMMUTABLE 를 사용하여 불변성을 가진 PendingIntent를 생성한다. 한 번 설정된 후에는 변경할 수 없으므로, 안전한 보안성을 보장한다.
API 레벨이 23 미만인 경우에는 적용되지 않고, 이전과 동일하게 FLAG_UPDATE_CURRENT 를 사용하여 PendingIntent를 생성한다.