Behavior changes : Apps targeting Android 13 or higher
Android 13 이상을 타겟팅한다면 변경된 동작을 올바르게 지원하도록 앱을 수정해야 한다. developer 사이트를 참고하여 변경된 내용을 정리해 보았다.
아래에 정리된 내용 외에 다른 내용도 있지만, 현재 프로젝트에서 필요한 부분들만 정리했다. 추가적인 부분은 developer 사이트를 참고하자.
1. 알림 권한
이전에는 앱을 설치하면 기본적으로 알림을 띄우는 게 가능했지만, API 33 이상에서는 Notification 런타임 권한이 추가되었고, 위 권한으로 앱의 알림 발송을 사용자가 제어할 수 있도록 변경되었다.
Permission에 POST_NOTIFICATIONS을 통해 사용자에게 permission을 받아야만 앱에서 알림을 보내는 것이 가능하다.(default 값이 false이므로 승인을 해야만 알림 발송 가능)
manifest
<manifest ...>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application ...>
...
</application>
</manifest>
앱에서 사용자에게 POST_NOTIFICATIONS 권한을 요청하기 위한 코드
requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), REQUEST_CODE)
다이얼로그 권한 허용의 동작
- 허용 선택
- 허용 안 함 선택
- 버튼을 누르지 않고 다이얼로그를 스와이프 하여 없애는 경우
사용자는 위의 3가지 행위가 가능하다.
허용을 선택하게 되면 모든 알림 채널이 허용되므로, 앱에서 발송하는 모든 알림을 수신할 수 있다.
허용 안 함을 선택하게 되면, 몇 가지 특정 역할을 제외하고는 모든 알림이 차단된다. 이때 주의해야 할 점이 앱에서 사용자가 한 번이라도 허용 안 함 탭을 선택할 경우,
- 앱을 제거한 후 재설치
- Android 13 이상을 타겟팅하도록 앱을 업데이트
위의 두 가지 경우가 아니라면, 알림이 다시 표시되지 않는다.
주의
API 32 이하인 앱의 경우, 사용자가 대화상자를 스와이프 하여 없애는 경우 알림 권한의 상태가 변경되지 않는다.
Android 13 이상을 실행하는 기기에 앱을 설치하면 앱의 알림이 기본적으로 사용 중지된다. 위에 설명했던 대로 default가 false이므로 개발자가 새 권한을 요청하고 사용자가 앱에 권한을 부여한 후에 알림을 수신할 수 있는 것이다.
API 33 이상인 앱의 경우, 사용자가 퍼미션 다이얼로그의 허용 안 함을 두 번 누르기 전까지는 퍼미션 팝업을 계속 띄울 수 있다.
만약, 사용자가 허용 안 함을 두 번 눌러서 더 이상 팝업이 나오지 않는 경우 사용자가 앱 설정에 직접 들어가서 권한을 허용해 줘야 알림을 수신할 수 있는 것이다.
알림(옵트인, 옵트아웃)
: API 33부터 알림 설정이 설치한 직후 Off이고, 유저가 알림을 허용해야 ON이 됨.
옵트인이란, 개인정보 처리방식 중 하나로 유저가 자신의 데이터 수집을 허용하기 전까지 자신의 데이터 수집을 금지하는 제도
옵트아웃이란, 정보주체의 동의를 받지 않고 개인정보를 처리하는 방식. 단, 정보주체가 거부 의사를 밝힌 경우에는 개인정보 처리를 바로 중지해야 함
2. READ_EXTERNAL_STORAGE의 세분화
미디어 파일 전체에 접근할 수 있는 READ_EXTERNAL_STORAGE이 더 이상 사용되지 않고, 3개로 분리됨
- READ_MEDIA_IMAGES : 이미지, 사진 파일 접근 권한
- READ_MEDIA_VIDEO : 비디오 파일 접근 권한
- READ_MEDIA_AUDIO : 오디오 파일 접근 권한
SDK 33 이상을 지원하는 앱은 READ_EXTERNAL_STORAGE를 세분화하여 위의 세 가지 권한을 사용자에게 요청해야 한다.
3. IntentFilter와 일치하지 않는 Intente를 차단
Android 13 이상을 타겟팅하는 다른 앱의 내보낸 구성요소로 인텐트를 전송하면 이 인텐트는 수신앱의 <intent-filter> 요소와 일치하는 경우에만 전달된다. 즉, 일치하지 않는 인텐트는 차단되는 것이다.
startActivity()를 실행하는 앱의 타겟 API가 중요한 것이 아니라, 실행되는 액티비티를 갖고 있는 앱의 TargetSDK가 33이라면 변경사항이 적용된다.
암시적 Intent는 IntentFilter와 일치할 경우에만 실행되기 때문에 명시적 Intente를 주목하면 된다.
해결법
- Intente와 IntentFilter가 일치하도록 수정
- Intente에 Component 이외에 Action, Category 같은 정보는 모두 제거
참고
동작 변경사항: Android 13 이상을 타겟팅하는 앱 | Android 개발자 | Android Developers
Android 13 이상을 타겟팅하는 앱에 영향을 미치는 Android 13의 변경사항을 알아봅니다.
developer.android.com