거의 알고리즘 일기장

react native에서 android target sdk를 33이상으로 올릴경우 주의할점 (권한 정책 변경으로 인한 문제 해결) 본문

react-native

react native에서 android target sdk를 33이상으로 올릴경우 주의할점 (권한 정책 변경으로 인한 문제 해결)

건우권 2023. 9. 6. 23:25

상황

평화롭게 집에서 코딩하던 권모씨 어느날 이런 메일을 보게 되는데...

"이제 정책적으로 android target sdk를 33이상으로 올려야 하나보다! 뭐 올려봤자 뭐가 문제가 있겠어 그냥 올리지 뭐~"

배포후 며칠뒤
잉?

자 그렇다 내 이야기다 ㅠ

target sdk를 올리면 당연히 breaking change가 있을수도 있었을텐데 왜 그걸 몰랐을까 ㅠㅠ 

이제 이게 어떤 부분이 문제였고 어떻게 해결했는지 설명해보겠다!


문제 찾기

문제가 무엇인지 처음부터 유추해보자


로직이 문제일까??

문제가 되는 부분의 로직은 일기를 이미지로 다운로드할 경우의 로직이었다.

대강 이렇다!

권한 요청을 정상적으로 하고 권한을 제대로 받은 경우에는 돌아가는데 문제 없는 코드이다!

로직적인 문제도 없어 보이고 sdk 33 미만의 시뮬레이터에서는 제대로 돌아갔다.

 

그렇다면 설마.. android target sdk를 올린게 문젠가???

 

그래서 android sdk 31 -> 33일때의 변경사항들을 찾아보기 시작했다...

그렇다.. 미디어 권한이 분리되었는데, 내가 기존에 쓰던 라이브러리인 expo-media-library의 버전은 해당 내용을 지원하지 않았다.


해결방법들 고민과 해결

문제는 찾았으니 해결을 하는건 시간문제다! 해결하기위해 코딩을 하기전에 어떤 해결방법이 있을지 생각해봤다

 

1. expo-media-library 버전을 올린다.

해당 라이브러리를 살펴보니 15.2.x 버전부터 해당 내용을 지원한다.

 

2. 다른 라이브러리를 쓴다.

@react-native-camera-roll/camera-rol 이 모듈이 대체제로 가장 좋아보였다.

 

3. 내가 하나하나 만든다?

이건 내 공부에 도움은 되겠지만, 현재 빠르게 해결해야 하므로 시간낭비라고 생각해서 생략하였다! 

 

1, 2 번을 한번씩 브랜치를 따서 시도해보았는데 결과는 다음과 같다.

 

1번 시도

1번 같은 경우에는 expo에 버전에 관련하여 긴밀하게 묶여있어서 해당 라이브러리의 버전을 올린다고 다가 아니었다.
(버전올리면 터진다 근데 expo 버저닝이 안맞아서 생기는 버그로 보임)

그리고 expo eject를 한 예전 프로젝트이기 때문에 expo에서 제공하는 방식으로 upgrade하는것도 쉽지 않을것으로 판단

탈락

 

2번 시도

1번이 실패하면서 2번밖에 대안이 없었다. 잘 돌아가는 로직을 새로 짜야한다는 부분이 있었지만 대안이 없어서 시도해보았다.

하지만, PermissionsAndroid 이라는 rn의 api를 사용하는데 rn 버전이 0.68이라 해당 권한이 없었다... 

그래서 rn의 permission을 추가하는 부분에 patch-package 모듈을 사용해 권한 추가를 진행했다.

diff --git a/node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js b/node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js
index 227af12..1f83b15 100644
--- a/node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js
+++ b/node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js
@@ -58,6 +58,9 @@ const PERMISSIONS = Object.freeze({
   RECEIVE_WAP_PUSH: 'android.permission.RECEIVE_WAP_PUSH',
   RECEIVE_MMS: 'android.permission.RECEIVE_MMS',
   READ_EXTERNAL_STORAGE: 'android.permission.READ_EXTERNAL_STORAGE',
+  READ_MEDIA_IMAGES: 'android.permission.READ_MEDIA_IMAGES',
+  READ_MEDIA_VIDEO: 'android.permission.READ_MEDIA_VIDEO',
+  READ_MEDIA_AUDIO: 'android.permission.READ_MEDIA_AUDIO',
   WRITE_EXTERNAL_STORAGE: 'android.permission.WRITE_EXTERNAL_STORAGE',
   BLUETOOTH_CONNECT: 'android.permission.BLUETOOTH_CONNECT',
   BLUETOOTH_SCAN: 'android.permission.BLUETOOTH_SCAN',
@@ -98,6 +101,9 @@ class PermissionsAndroid {
     READ_CALL_LOG: string,
     READ_CONTACTS: string,
     READ_EXTERNAL_STORAGE: string,
+    READ_MEDIA_IMAGES: string,
+    READ_MEDIA_VIDEO: string,
+    READ_MEDIA_AUDIO: string,
     READ_PHONE_NUMBERS: string,
     READ_PHONE_STATE: string,
     READ_SMS: string,

이제 제대로 동작한다.


후기

게으름이 만들어낸 참극이었다 ㅠㅠ..

버전을 올릴때는 귀찮아도 확실히 체크하자!!


참고한 사이트들

https://developer.android.com/about/versions/13/behavior-changes-13?hl=ko 

 

동작 변경사항: Android 13 이상을 타겟팅하는 앱  |  Android 개발자  |  Android Developers

Android 13 이상을 타겟팅하는 앱에 영향을 미치는 Android 13의 변경사항을 알아봅니다.

developer.android.com

https://reactnative.dev/docs/permissionsandroid

 

PermissionsAndroid · React Native

Project with Native Code Required

reactnative.dev

https://firsteast.tistory.com/153

 

[RN] RN 버전에 따른 안드로이드 앨범 접근 권한 문제 해결

안드로이드에서 사용자 앨범에 접근하기 위해서는 앨범 접근 권한을 요청해야 합니다. 안드로이드 13 이전 버전에서는 PermissionAndroid에 정의되어 있는 권한 중 READ_EXTERNAL_STORAGE을 통해서 접근할

firsteast.tistory.com

반응형
Comments