안드로이드/이거 나만 몰랐어?

안드로이드 권한 관련 이야기

강한 맷돼지 2024. 5. 17. 11:20

"이거 나만 몰랐어?" 1편이다.

 

1편의 주제는 바로바로 권한

최근 권한은 나와 연이 깊다. 트립드로우 때도 지도, 위치

최근 동네산책에서도 지도, 위치. 아주 그냥 위치권한만 하루종일 유저한테 물어보고있다.

 

어쨋든 이러한 권한을 요구하면서 얻은 팁? 혹은 정보에 대해 공유해보려한다.

 

1. 사용자가 권한이 있는 상태에서 권한을 제거하면 프로세스가 종료됨(앱이꺼짐)

오류처리를 하다보면 기획자분이 사용자가 위치권한을 꺼버렸을때 상황을 상정해서 이런저런 처리를 요구한다.

 

그러면 아마 우리의 생각은 이렇게 미칠것이다. 

1. 설정을 갖다와야 권한을 끄니까 사용자가 설정 나갔다오겠네

2. 그럼 onResume에다가 권한 체크 로직을 넣고 권한없을때 상황을 상정해서 처리해볼까?

 

이렇게 꾸역꾸역 작업을 하는데 이 노력은 결실을 맺지 못한다.

왜냐하면 이 로직자체를 탈수가 없기 때문이다.

 

그 이유는 다름이 아니라 부여되어있는 일회성 권한을 끄는순간 무조건 프로세스가 종료된다.

이는 앱의 재시작을 의미하기 때문에 켜져있던 액티비티가 다시 새롭게 그려지는 과정을 거친다.

즉 최근 화면(recent tasks)을 통해서 다시 앱의 태스크에 접근하여도 이미 프로세스가 종료되었기 때문에 내부 액티비티는 onResume부터 시작하는것이 아닌 onCreate 부터 로직을 다시 탄다.

(onCreate부터 다시 시작함 -> 아마 이정도 권한 처리를 했다면 화면진입시에 권한 관련 처리는 해놨을 가능성이 커서 로직이 의미없어지는 경우가 많다.)

 

이로 인하여 나는 이중처리를 하고 추후 관련 처리를 모두 경험하며 "이거 나만 몰랐어?"를 외치게 되었다.

 

 

 

2. 그럼 일회성 권한이 뭐가 있는데?

위에서 일회성 권한의 경우 끄면 프로세스가 종료후 다시 시작된다고 말했다.

그럼 다시 시작되는 일회성 권한에는 뭐가 있는데? 라는 생각이 당연스럽게 들게된다.

 

일단 일회성 권한이 뭐냐하면 안드로이드를 쓰다보면 이런 다이얼로그를 만나봤을것이다.

 

안드로이드 11(API30) 부터 생긴 시스템 권한 요청을 보면 "이번만 허용" 이라는 선택항목이 생긴 다이얼로그를 본적이 있을것이다.

이걸 포함하는 권한 다이얼로그가 뜨는게 일회성 권한이다.

 

이러한 일회성 권한에는 3가지가 있다

1. 위치

2. 마이크

3. 카메라

 

사실 이러한 권한이야 필요할때 쓰는거지만 이러한 항목을 다룬다면 1번의 프로세스가 다시 시작되는것을 고려해야한다는 것이다.

 

 

3. 권한 2번이상 물어보면 "영구 거부"로 간주

이거야 뭐 요즘에는 다 아는거겠지만 정확히 몇번이고 어떻게해야 다시 물어봐지는지 이런건 맨날 헷갈린다.

공식문서의 글을 일단봐보자.

동시에 앱은 권한을 거부하겠다는 사용자의 결정을 존중해야 합니다. Android 11(API 수준 30)부터 사용자가 앱이 기기에 설치된 전체 기간 동안 특정 권한에 관해 거부를 두 번 이상 탭하면 앱에서 그 권한을 다시 요청하는 경우 사용자에게 시스템 권한 대화상자가 표시되지 않습니다. 이러한 사용자의 작업은 '다시 묻지 않음'을 의미합니다. 이전 버전에서는 사용자가 이전에 '다시 묻지 않음' 체크박스 또는 옵션을 선택한 경우를 제외하고 앱에서 권한을 요청할 때마다 사용자에게 시스템 권한 대화상자가 표시되었습니다.

사용자가 권한 요청을 두 번 이상 거부하면 영구 거부로 간주됩니다. 따라서 사용자가 특정 기능에 액세스해야 하는 경우에만 권한을 요청하는 것이 매우 중요합니다. 그러지 않으면 의도와 달리 권한을 다시 요청하지 못하게 될 수 있습니다.

어떤 상황에서는 사용자의 조치가 없어도 권한이 자동으로 거부될 수 있습니다. 마찬가지로 권한이 자동으로 부여될 수도 있습니다. 자동 동작에 관해 어떤 가정도 하지 않는 것이 중요합니다. 앱에서 권한이 필요한 기능에 액세스해야 할 때마다 앱에 여전히 권한이 부여되어 있는지 확인합니다.

 

걍 두번이상 물어보면 영구 거부란다.

영구 거부상태에서는 시스템 다이얼로그가 뜨지않아 킹받게한다.

 

이때 테스트를 위해서 다시 다이얼로그가 뜨게하려면 그냥 설정에서 데이터를 지워버리면 다시뜬다.

 

또한 이런것들에 대처해야하는데 방법은 굉장히 여러가지이다.

ex) 시스템적으로 권한을 요구하는 다이얼로그가 뜨기이전 자체적인 바텀시트를 띄워주고 이후 만약 권한 부여 거부시 설정으로 이동시키는 다이얼로그를 띄워준다던지 

어쨋든 방법을 강구해야한다. 방법은 사용자가 사용하기 편하게 가면되지 않을까 싶다.

 

4. 테스트를 위하여 권한 부여

adb를 이용하여 모든 런타입 권한을 부여하는 방법도 있다는데? 쓸까싶기는 하지만 뭐 알아둬서 나쁠건 없으니까

 

5. 정확히 따지면 권한은 아니지만 위치를 다룰때 "위치 설정 ON/OFF" 까지 에러처리를 염두하자

아니 쓸데없이 이런거 왜만들었나 싶은데 안드로이드에서는 위치권한 뿐만 아니라 위치를 와이파이마냥 껏다켰다 할수있게 하는 위치 설정 ON/OFF 기능이있다.

 

 

바로 이놈이다.

이 설정이 꺼져있으면 권한이 없는것과 마찬가지로 위치를 가져올 수 없다.

고로 위치권한 체크할때 이것또한 체크해야한다.

 

-> 이거 시스템상에서 위치설정 키라고 요구하는 다이얼로그를 띄워줄 수 있다.

 

이런 다이얼로그를 띄울수 있다.

 

뭐 이런거 대충 회사 유틸코드에 아마 있을것이다. 없으면 대충 이블로그 참고해서 예쁘게 만들어보면 되지않을까 싶다.