시스템의 앱 알림 ON 버튼이 눌리지 않는다는 이슈가 발생했다.
원인은 Android 13 이상 기기에 대해 알림 관련 마이그레이션 작업이 되어있지 않았던 것이었다.
'이 앱의 알림을 모두 차단했습니다' 문구는 알림 권한이 허용되지 않았을 경우 나타나는 문구이고,
Android 13 이전 기기까지는 알림 권한이 자동으로 허용되었으나 그 이후 기기에서는 권한 허용 알럿창을 노출해 직접 유저에게 허용을 받아야 했다.
따라서, 아래 두 개의 작업을 진행했다.
✔️ 안드로이드 13 마이그레이션 작업
1. Android 13 이상인 경우, 알림 권한 요청
2. 알림 수신 로직에서 Android 13은 Pending Intent 부분 플래그 추가
1. Android 13 이상인 경우, 알림 권한 요청
- Manifest에 해당 권한 추가
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
- MainActivity에서 Android 13 이상인 경우, 권한 알럿 노출
/***
* requestPermission() - 메인 화면에서 권한 요청
* API 33 이상: POST_NOTIFICATIONS
*/
static final int REQ_PERMISSION_PUSH = 1;
private void requestPermission() {
// TIRAMISU(API 33) 이상인 경우, POST_NOTIFICATIONS 권한 요청
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
boolean isDenied = PackageManager.PERMISSION_DENIED == ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS);
if (!isDenied) {
SharedPreferences.Editor editor = sSharedPreferences.edit();
editor.remove(IS_SET_TO_DENY_POST_NOTIFICATIONS);
editor.apply();
}
boolean isAlreadyDeniedNotification = sSharedPreferences.getBoolean(IS_SET_TO_DENY_POST_NOTIFICATIONS, false);
// 거절한 경우 && 이전에 'Don't allow' 버튼을 통해 명시적으로 거절하지 않은 경우
if (isDenied && !isAlreadyDeniedNotification) {
ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.POST_NOTIFICATIONS }, REQ_PERMISSION_PUSH);
}
}
}
'Don't allow' 버튼을 통해 명시적으로 거절한 경우, SharedPreference에 값을 기록해두고 다시 요청하지 않도록 로직을 작성했다.
(onRequestPermissionResult에서 PERMISSION_DENIED인 경우 shouldShowRequestPermissionRationale을 이용해 명시적으로 거절했는지 여부를 판단했다. 참고)
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.POST_NOTIFICATIONS)
2. PendingIntent에 플래그 추가
Android 13 이상인 경우, PendingIntent에 MUTABLE에 대한 플래그를 설정해 주지 않으면 해당 에러가 뜰 것이다.
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.
그냥 에러 문구 그~대로 푸시 알림에 대한 응답 기능 등을 사용하지 않으면, PendingIntent 내용이 변하지 않는다는 뜻의 FLAG_IMMUTABLE 플래그를 넣어주면 된다.
PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
} else {
pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
}
3. Firebase 라이브러리 버전 업데이트
2번 작업을 완료하고 포그라운드 푸시는 정상적으로 수신되었지만, 백그라운드 푸시에서는 여전히 동일 에러가 발생했다. 생각해보니, FirebaseMessagingService 부분에서 우리가 수정한 부분은 포그라운드 푸시에서 처리되는 부분에 대해서만 반영되었던 것이기에!
Firebase 라이브러리도 버전을 최신으로 변경했다.
🙋🏻♀️ 내가 앱 개발자가 되고 싶은 이유 중에 하나가 바로 이런 것이다 ㅎㅎ 인턴 할 때도 Android 14 대응해서 이미지 권한 관련해서 작업할 것이 있었는데, 처음에는 공식 문서도 이해가 잘 안가고 머리가 너무 아팠다. 하지만 팀장님이 그러셨다... 이런 부분을 계속해서 대응해야 하기에 앱 개발자가 필요한 것이라며 ,, !!
다음에는 Android 14 마이그레이션 관련 글도 다시 업로드 해 보아야겠다.
'💻 Android' 카테고리의 다른 글
[Android] Android CI/CD 구축하기 (2) - BuildType으로 개발/운영 환경 분리 (0) | 2024.05.25 |
---|---|
[Android] Android CI/CD 구축하기 (1) - Firebase App Distribution, Play store 테스트 트랙 (0) | 2024.05.25 |
[Android/IOS] 인앱 리뷰 기능 추가하기 (2) | 2023.09.23 |
[Android] 인스타그램 DM으로 공유하기 기능 만들기 (0) | 2023.09.23 |
[Android/MySQL] 안드로이드에서 JDBC 사용하기 (0) | 2022.11.08 |