Android/실전 회고

[Android/Kotlin] 딱 정리해, targetSdk 33 후 알림 권한요청 (Feat. 푸시 옵트인 작업)

노소래 2022. 12. 25. 05:41

developers

안드로이드 13 이 등장하면서 targetSdk 버전을 올리는 것에 대해 고민이 많아졌다.

세분화된 미디어 권한이나, 구글 플레이 서비스 광고 ID 설정,  포그라운드 서비스, 알림 등등이다. 

그 중에서 오늘은 알림, 특히 알림 권한 요청에 대해 글을 써보려고 한다.

마침 최근에 회사에서는 알림 옵트인 작업을, 사이드 프로젝트에서도 알림 관련작업을 하게 되어 비교적 생생하기 때문이다.

(틀리거나 부족한 게 있다면 공유해주시면 정말 감사합니다.)


Android 13 부터 알림은...

Android 13의 알림은 옵트아웃 모델을 사용하는 이전 Android 버전에서 변경된 옵트인 모델을 사용 (출처: developers)

즉, 안드로이드 13부터 알림은 옵트인이라는 말이다.

안드로이드 12 이하는 옵트아웃(옵트인의 반대)이라 앱 설치하면 알림권한 일단 On 으로 시작인데,

13은 설치하면 일단 Off 이고 유저가 허용해야 On 이 된다는 말이다.

혹시 옵트인이라는 말이 익숙하지 않다면 옵트인 섹션을 읽어본다.


옵트인(Opt-in) 옵트아웃(Opt-out)?

옵트인은 개인정보 처리방식 중 하나로, 유저가 자신의 데이터 수집을 허용하기 전까지 자신의 데이터 수집을 금지하는 제도이다. 

간단하게 생각하면 앱에서 광고 제공을 목적으로 이용자 활동을 추적하고자 할 때, 권한을 요청하는 팝업을 띄워 동의를 받아내는(App Tracking Transparency) 애플의 예를 생각할 수 있다.

알림 옵트인이라고 이름 붙인 말은 뭘까?

우리 서비스가 알림을 보내도 될까? 물어보며 알림 동의를 얻어내고 그 전까지는 푸시를 보낼 수 없다는 말일 것이다.

그래서 결론은 안드로이드 버전 13부터는 앱 설치시 디폴트가 Off 고 후에 런타임 권한요청이든 UI 로 유도하든 해서 유저가 권한을 On 해야한다는 것이다.


어떻게 대응할지 경우의 수에 따라 생각해보기

한국인이 월드컵 16강 진출할 때마다 좋아하는 경우의 수를 나눠보자

하나의 변수는 targetSdk 가 33 이상인지 32 이하인지일 것이다.

다른 하나는 현재 기기 안드로이드 버전이 13인지 12 이하인지이다.

(혹시 안드로이드 버전과, SDK 버전이 헷갈린다면 정리된 링크로 들어가보자)

앱의 targetSdk 32 이하, 기기 안드로이드 버전이  13

이 경우 역시 일단 기기 안드 버전이 13이니 옵트인이다.

그래서 우선 알림은 꺼져있다.

앱을 처음 액티비티 시작될 때 또는 액티비티 시작된 후 첫 알림채널 만들어질 때 시스템에서 런타임 권한 요청처럼 띄워준다. 

그리곤 targetSdk 가 유지되는 한 다시는 알림 런타임 권한요청 다이얼로그를 볼 수 없다...

알림 옵트인 작업을 시작하면서 targetSdk 를 올려야겠다고 체감한 부분이 이 부분이었다.

앱의 targetSdk 32 이하, 기기 안드로이드 버전이 12 이하

그대로라서 스킵

앱의 targetSdk 를 33 으로 올렸을 때

이게 핵심인듯하다.

원하는 타이밍에 권한을 요청할 수 있다.

평소 런타임 권한 요청하듯이 android.permission.POST_NOTIFICATION 권한 요청을 하면 된다.

그리고 안드 버전 코드로 분기해서 13이면 런타임 권한요청하고 12 이하면 요청 안하거나 설정화면으로 보내주면된다. (12 이하인 경우는 기획자의 의도에 따라 다르겠지만.. 이와 관련한 컴케를 잘 하자)

 

간략한 Activity Result API 소개

Activity Result API 사용법은 간단하다.

  • registerForActivityResult 에 ActivityResultContract<I, O>와 콜백을 등록해서 ActivityResultLauncher 를 만든다.
    (여기서는 RequestPermission이라는 ActivityResultContract 상속한 객체)
  • 그 ActivityResultLauncher 객체로 lauch 하는데 인자로 I 타입 객체 주소를 전달한다.
    (여기서는 class RequestPermission : ActivityResultContract<String, Boolean>() 이니까 String 넣어준다.)

(출처)https://developer.android.com/reference/android/Manifest.permission#POST_NOTIFICATIONS

private val requestNotificationPermissionLauncher =
        registerForActivityResult(
            ActivityResultContracts.RequestPermission()
        ) { ok ->
            if (ok) {
                // 알림권한 허용 o
            } else {
                // 알림권한 허용 x. 자유롭게 대응..
            }
        }
        
        
...

fun requestNotificationPermission() {
        if (
            ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.POST_NOTIFICATIONS
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            	// 다른 런타임 퍼미션이랑 비슷한 과정
                if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
                    // 왜 알림을 허용해야하는지 유저에게 알려주기를 권장
                } else {
                	requestNotificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
                }
            } else {
               // 안드로이드 12 이하는 알림에 런타임 퍼미션 없으니, 설정가서 켜보라고 권해볼 수 있겠다.
            }
        }
    }

 


알림 런타임 퍼미션 다이얼로에 대한 유저의 선택에 따른 결과는?

허용 버튼 누름

모든 알림채널이 허용된다.

포그라운드 서비스와 관련된 알림을 게시한다.

허용 안함 버튼 누름

몇 가지 특정 역할을 제외하고는 모든 알림 채널이 차단

사용자가 시스템 설정에서 앱의 모든 알림을 수동으로 사용 중지하는 경우에 발생하는 동작과 비슷

스와이프 닫기 버튼 누름

상태 변경이 되지 않는다.

(즉, 앱 타겟이 32 이하고 기기 안드 버전이 13이면 유저가 따로 설정가서 켜지 않는 이상 권한 요청도 못해보고 꺼져있는 상태라는 것이다..)


반성과 마무리

이상으로 안드 13을 고려한 알림 권한에 대해 알아보았다.

푸시 옵트인 작업을 하며 기획자와 커뮤니케이션할 때 내 안드로이드에 특화된 지식이 얼마나 중요한지 새삼 깨달았다.

기획자가 iOS, AOS, Web 등..의 정책을 알고 기획에 담아내기 힘들 것이기 때문이다. 기획 단계에서 더욱 적극적으로 공부하고 반영할 수 있게 해야겠다고 생각했다.

이외 새로 설치하는 경우, 업데이트하는 경우, 예외사항이나 권장사항도 확인하고 싶다면 이 공식문서 페이지 아래 쪽에서 확인할 수 있다.

 

추가 출처

권한요청

옵트인 알림에 대한 알림 권한