본문 바로가기
Web

Android target33으로 변경 및 Push Notification 권한 추가

by Jun_N 2023. 12. 1.

 

Android 13 / target 33 업데이트 및 알림 설정 Plugin 작업, Permission Setting 추가

개요

안드로이드 13 이상 (TargetSdk 33) 부터 알림이 자동으로 거부되며 알림 허용 권한을 추가하려면 targetSdk의 버전을 33으로 올려야만 했습니다. 안드로이드 자체적으로도 33으로 올리지 않는다면 더이상 업데이트를 해주지 않겠다고 협박(?)을 당했기에 작업을 시작하게 되었습니다.


targetSdkVersion 33 변경

기존에 target이 30이었기 때문에 30 → 31로 변경됐을때 변경된 부분과, 33으로 올렸을때 변경해야 되는 부분을 확인해야 합니다.

 

target 30 → target 31

아래는 30에서 31로 변경됐을때 변경되는 작업들입니다.

JOBDA APP에서는 intent filters를 사용하고 있었기 때문에 android:exported를 true로 설정해 주었습니다. 나머지 기능들은 딱히 사용하고 있지 않았기에 추가로 업데이트는 하지 않았습니다.



Target 33에서는 미디어 파일 엑세스에 경우 READ_EXTERNAL_STORAGE 권한만 사용하는것이 아니라 미디어 유형에 따라서 권한을 새로 요청받아야 합니다. JOBDA에서 기능적으로 이미지/사진/파일/동영상 업로드가 모두 필요했기에 셋다 추가해주었습니다.


알림 권한 요청하기

SDK 33부터는 알림이 자동으로 거부되며 알림 허용 권한을 추가하기 위해 알림 권한을 따로 요청해야 합니다. 이러한 변경 사항은 불법 광고와 같은 보안 이슈로 인해 도입되었습니다.

SDK 33 이상에서는 POST_NOTIFICATIONS 권한을 추가로 요청해야만 알림 관리를 가능하게 합니다. 앱의 기본 설정은 알림을 거부하는 상태이며, 사용자로부터 알림을 허용받으려면 추가적인 권한 요청 기능을 구현해야 합니다.

TedPermission 라이브러리를 사용하여 알림 허용 권한을 추가하는 작업을 진행했으며, 이 라이브러리를 통해 사용자에게 권한을 요청하는 프로세스를 간소화하고 효율적으로 처리할 수 있었습니다. 이렇게 함으로써 앱은 SDK 33부터 도입된 알림 권한 관련 변경 사항에 대응하고 사용자에게 알림 허용을 요청할 수 있게 되었습니다.

  1. build.gradle에 TedPermission 추가

GitHub — ParkSangGwon/TedPermission: Easy check permission library for Android Marshmallow

 

2. requestPermission 코드 작성

private void requestPermission() {
  PermissionListener permissionlistener = new PermissionListener() {
    @Override
    public void onPermissionGranted() {
        Toast.makeText(MainActivity.this, "알림 설정이 완료되었습니다.", Toast.LENGTH_SHORT).show();
    }
@Override
  public void onPermissionDenied(List<String> deniedPermissions) {
      Toast.makeText(MainActivity.this, "알림 설정이 거부되었습니다.", Toast.LENGTH_SHORT).show();
  }
  };
  TedPermission.with(this)
    .setPermissionListener(permissionlistener)
    .setDeniedMessage("알림 설정이 거부되었습니다.\\n [설정] > [권한] 에서 권한을 허용할 수 있어요.")
    .setPermissions(Manifest.permission.POST_NOTIFICATIONS) // 허용하려는 permission 작성
    .check();
}

TedPermission을 활용해서 알림 설정 권한을 요청받는 함수를 작성합니다. 알림 설정이 완료/거부 됐을 경우 custom으로 텍스트를 조정할 수 있고 유저에게 알림을 허용했을때 어떤 베네핏이 있는지 알려주며 권한 허용을 유도할 수 있습니다.

  • setRationalMessage() : 권한체크 하기전 Dialog 메시지 설정
  • setDeniedMessage() : 권한 거부했을 때 띄울 Dialog 메시지 설정
  • setDeniedCloseButtonText() : 권한 거부 시 뜨는 Dialog의 [닫기]버튼 텍스트 설정
  • setGotoSettingButtonText() : 권한 거부 시 [설정]버튼 텍스트 설정
  • setGotoSettiongButton() : 권한 거부 시 [설정]버튼을 보여줄지 설정 (true / false)

setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) 처럼 ,로 여러개 요청해야함.

 

3. 알림 [설정] 창을 열고 현재 알림 상태 (허용인지 거부인지)를 알기 위해 Plugin을 작성하였다.

Capacitor3 버전 문제로 안드로이드의 실시간 알림 상태를 받아오는데 문제가 있었고 Native쪽 코드를 건드려 작업했습니다. getSystemService에서 NOTIFICATION_SERVICE의 상태를 받아와 해당 APP의 알림을 허용했는지 여부를 파악합니다.

@CapacitorPlugin(
    name = "AndroidPostNotificationsPermission",
    permissions = {
        @Permission(strings = { "Manifest.permission.POST_NOTIFICATIONS" }, alias = "postNotifications")
    }
)
public class AndroidPostNotificationsPermissionPlugin extends Plugin {
@PluginMethod
    public void areNotificationsEnabled(PluginCall call) {
        NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
        boolean areEnabled = false;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            areEnabled = notificationManager.areNotificationsEnabled();
        }
        JSObject result = new JSObject();
        result.put("enabled", areEnabled);
        call.resolve(result);
    }
}

Build.VERSION_CODES.N는 33버전을 의미합니다.

React 내부적으로 사용되는 코드

// MyPageNoice.tsx
export interface AndroidPostNotificationsPermissionPlugin {
  areNotificationsEnabled(): Promise<{ enabled: boolean }>;
}
const AndroidPostNotificationsPermission = registerPlugin<AndroidPostNotificationsPermissionPlugin>('AndroidPostNotificationsPermission', {});
...
const checkNotificationPermission = async () => {
    const permStatus = await PushNotifications.checkPermissions();
    let response = { enabled: false };
    try {
      **response = await AndroidPostNotificationsPermission.areNotificationsEnabled();**
    } catch (e) {
      console.error(e);
    }
    if (MobileAppUtil.currentPlatform === 'android') {
      if (response.enabled) setUserNotificationPermission(true);
      else setUserNotificationPermission(false);
    } else if (permStatus.receive === 'granted') setUserNotificationPermission(true);
    else setUserNotificationPermission(false);
  };

response = await AndroidPostNotificationsPermission.areNotificationsEnabled();

Plugin에서 작성한 areNotificationsEnabled를 통해 받아온 알림 여부에 따라서 Toggle state값을 저장합니다.

 

4. permission 권한 추가 (사실 4번이 아니라 제일 처음에 추가해줘야함. 0번)

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- target33 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> 
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<!-- 알림 허용 권한 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

결론

안드로이드 13 이상부터 알림 권한이 자동으로 거부되는 문제에 대한 대응을 위해 targetSdkVersion을 33으로 변경하였습니다. 이로 인해 변경된 부분과 작업 내용을 아래와 같이 정리할 수 있습니다:

  1. Target 30 → Target 31 변경:
  • 앱에서 intent filters를 사용하고 있었으므로 android:exported를 true로 설정하여 변경 작업을 진행했습니다.
  • 나머지 기능들은 변경하지 않았는데, 해당 기능들을 사용하지 않았기 때문입니다.

 

2. Target 31 → Target 33 변경:

  • 안드로이드 13 이상을 타겟팅하는 앱에서 미디어 파일 엑세스를 위해 READ_EXTERNAL_STORAGE 권한뿐만 아니라 미디어 유형에 따라 새로운 권한을 추가로 요청해야 했습니다. 이미지/사진/파일/동영상 업로드가 필요하므로 해당 권한들을 추가하였습니다.

 

3. 알림 권한 요청:

  • SDK 33부터는 알림이 자동으로 거부되므로, 알림 허용 권한을 추가하기 위해 알림 권한을 요청하였습니다.
  • TedPermission 라이브러리를 사용하여 알림 설정 권한을 요청받는 함수를 작성하였으며, 권한이 부여되거나 거부될 때에 대한 메시지를 사용자에게 표시할 수 있도록 설정하였습니다.

 

4. 실시간 알림 상태 확인:

  • 안드로이드의 실시간 알림 상태를 확인하기 위해 AndroidPostNotificationsPermissionPlugin을 작성하였으며, 해당 플러그인을 활용하여 알림 허용 상태를 받아오고 사용자에게 표시할 수 있도록 구현하였습니다.

 

이로써 SDK 33으로 업데이트하여 안드로이드 사용자들에게 알림 허용 권한을 유도할 수 있게 되었고, 안드로이드 13 이상 버전에서의 알림 관련 문제를 해결하였습니다.