앱을 개발함에 있어서, 장치에 대한 다양한 권한이 필수적으로 요구될 때가 있다.
권한을 설치시에 요구하는 경우, 설치 시간 권한(Install-time permissions)
앱을 설치하여 사용중에 요구하는 경우, 런타임 권한(Runtime permissions) 으로 구분한다.
일반적으로 AndroidManifest.xml 에 명시되면 설치 시간 권한(Install-time permissions)을 요청하게 되며,
사용중 권한을 요구하는 경우에는 대부분 외부 라이브러리인 permission_handler 를 이용해서 런타임 권한을 요청한다.
먼저 안드로이드에서 얻을 수 있는 권한의 종류를 살펴보자.
권한은 개별권한으로 요청 할 수 도 있지만. 다양한 개별권한을 한번에 그룹권한으로 요청 할 수도 있다.
이 글에서는 편의를 위해 너무 많은 개별권한을 나열하지 않고, 단순히 그룹 권한에 종류만 다루려 한다.
1. AOS 권한 종류
그룹 권한 종류
- ACTIVITY_RECOGNITION - 활동 인식과 관련된 권한에 사용됩니다.
- CALENDAR - 사용자의 캘린더와 관련된 런타임 권한에 사용됩니다.
- CALL_LOG - 전화 통신 기능과 관련된 권한에 사용됩니다.
- CAMERA - 카메라에 접근하거나 장치에서 이미지/동영상을 캡처하는 것과 관련된 권한에 사용됩니다.
- CONTACTS - 이 장치의 연락처 및 프로필과 관련된 런타임 권한에 사용됩니다.
- LOCATION - 장치 위치에 액세스할 수 있는 권한에 사용됩니다.
- MICROPHONE - 장치에서 마이크 오디오에 액세스하는 것과 관련된 권한에 사용됩니다.
- NEARBY_DEVICES - 주변 블루투스 장치를 검색하고 연결하는 데 필요합니다.
- NOTIFICATIONS - 알림 게시와 관련된 권한에 사용됩니다.
- PHONE - 전화 통신 기능과 관련된 권한에 사용됩니다.
- READ_MEDIA_AURAL - 공유 저장소에서 오디오 파일을 읽는 데 필요합니다.
- READ_MEDIA_VISUAL - 공유 저장소에서 이미지 및 비디오 파일을 읽을 수 있는 데 필요합니다.
- SENSORS - 신체 또는 환경 센서에 액세스하는 것과 관련된 권한에 사용됩니다.
- SMS - 사용자의 SMS 메시지와 관련된 런타임 권한에 사용됩니다.
- STORAGE - 공유 외부 저장소와 관련된 런타임 권한에 사용됩니다.
여기 공식 사이트에서 API 레벨에 따른 개별 권한들에 지원 여부를 확인하며 사용하길 바랍니다.
2. AOS 그룹 권한 요청법
안드로이드의 경우 아래파일을 찾아 예시와 같이 추가해주시면 됩니다.
파일 위치 : PROJECT > android/app/main/AndroidManifest.xml
사용법 : <uses-permission android:name="android.permission-group.그룹권한상수값" />
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lee.woosuk">
<!-- 개별 권한 요청 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 그룹 권한 요청-->
<uses-permission android:name="android.permission-group.STORAGE" />
<application
..생략..
3. IOS 그룹 권한 종류와 사용법
IOS는 기기가 없어 해보지못했지만, 두 가지 작업을 해야한다고 한다.
1. Podfile을 수정해야한다
파일 위치: Project Folder > iOS > Podfile
방법 : 아래와 같이 필요한 권한을 1값을 가지도록 설정해준다. (주석 # 제거 필요)
## dart: PermissionGroup.calendar
# 'PERMISSION_EVENTS=1',
## dart: PermissionGroup.reminders
# 'PERMISSION_REMINDERS=1',
## dart: PermissionGroup.contacts
# 'PERMISSION_CONTACTS=1',
## dart: PermissionGroup.camera
# 'PERMISSION_CAMERA=1',
## dart: PermissionGroup.microphone
# 'PERMISSION_MICROPHONE=1',
## dart: PermissionGroup.speech
# 'PERMISSION_SPEECH_RECOGNIZER=1',
## dart: PermissionGroup.photos
# 'PERMISSION_PHOTOS=1',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
# 'PERMISSION_LOCATION=1',
## dart: PermissionGroup.notification
# 'PERMISSION_NOTIFICATIONS=1',
## dart: PermissionGroup.mediaLibrary
# 'PERMISSION_MEDIA_LIBRARY=1',
## dart: PermissionGroup.sensors
# 'PERMISSION_SENSORS=1',
## dart: PermissionGroup.bluetooth
# 'PERMISSION_BLUETOOTH=1',
## dart: PermissionGroup.appTrackingTransparency
# 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
## dart: PermissionGroup.criticalAlerts
# 'PERMISSION_CRITICAL_ALERTS=1'
2. Info.plist 에 사용하고자하는 권한이 왜 필요한지 설명을 넣는다
(아래 string태그 안에 타당한 이유가 없는 경우, 앱 배포가 거절된다고 한다.)
<!-- Permission options for the `location` group -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>Need location when in use</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Always and when in use!</string>
<key>NSLocationUsageDescription</key>
<string>Older devices need location.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Can I have location always?</string>
<!-- Permission options for the `mediaLibrary` group -->
<key>NSAppleMusicUsageDescription</key>
<string>Music!</string>
<key>kTCCServiceMediaLibrary</key>
<string>media</string>
<!-- Permission options for the `calendar` group -->
<key>NSCalendarsUsageDescription</key>
<string>Calendars</string>
<!-- Permission options for the `camera` group -->
<key>NSCameraUsageDescription</key>
<string>camera</string>
<!-- Permission options for the `contacts` group -->
<key>NSContactsUsageDescription</key>
<string>contacts</string>
<!-- Permission options for the `microphone` group -->
<key>NSMicrophoneUsageDescription</key>
<string>microphone</string>
<!-- Permission options for the `speech` group -->
<key>NSSpeechRecognitionUsageDescription</key>
<string>speech</string>
<!-- Permission options for the `sensors` group -->
<key>NSMotionUsageDescription</key>
<string>motion</string>
<!-- Permission options for the `photos` group -->
<key>NSPhotoLibraryUsageDescription</key>
<string>photos</string>
<!-- Permission options for the `reminder` group -->
<key>NSRemindersUsageDescription</key>
<string>reminders</string>
<!-- Permission options for the `bluetooth` -->
<key>NSBluetoothAlwaysUsageDescription</key>
<string>bluetooth</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>bluetooth</string>
<!-- Permission options for the `appTrackingTransparency` -->
<key>NSUserTrackingUsageDescription</key>
<string>appTrackingTransparency</string>
이렇게 진행하면 앱설치시 필요권한을 물어 얻을수 있다.
4. AOS / IOS 그룹 권한 비교
Type | Android | iOS |
unknown (Only ReturnType) |
- | - |
calendar (0) 달력 관리 |
Calendar | Calendar (Events) |
camera (1) 사진 찍기, 비디오 녹화 |
Camera | Photos (Camera Roll and Camera) |
contacts (2) 연락처 관리 |
Contacts | Address Book |
location (3) 현재 기기 위치 |
Fine And Coarse Location | CoreLocation (Always and WhenInUse) |
locationAlways (4) 현재 기기 위치 |
Fine and Coarse Location | CoreLocation (Always) |
locationWhenInUse (5) 현재 기기 위치 |
Find And Coarse Location | CoreLocation (WhenInUse) |
microphone (7) 오디오 녹음 |
Microphone | Microphone |
speech (13) 오디오 말하기 (글자 읽어주기) |
Microphone | Speech |
phone (8) 전화 걸기, 관리 |
Phone | x |
reminders (10) 미리 알림 |
x | Reminders |
sensors (11) 심박수 및 신체 센서 |
Body Sensors | CoreMotion |
sms (12) 문자 보내기, 보기 |
Sms | x |
storage (14) 사진, 미디어, 파일 접근 |
External Storage | x |
photos (9) 미디어 라이브러리 |
x | MPMediaLibrary |
도표 출처 : https://dalgonakit.tistory.com/110
참조 사이트
https://github.com/Baseflow/flutter-permission-handler/tree/master/permission_handler
https://developer.android.com/reference/android/Manifest.permission#constants
https://pub.dev/packages/permission_handler
아래의 다음글에서 런타임 권한요청을 위한 flutter에 permission_handler 사용법을 다루겠습니다.
https://bangu4.tistory.com/348
'Study > Flutter' 카테고리의 다른 글
[Flutter] QR 코드 생성, 스캔 (0) | 2022.07.29 |
---|---|
[Flutter] 앱 권한 관리 permission_handler 사용법 (AOS / IOS) (0) | 2022.07.19 |
[Flutter] floatingActionButton 플로팅 버튼 크기 설정 (0) | 2022.07.15 |
[Flutter] 앱 전체 테마 설정 (배경, 글꼴, 텍스트 스타일, 색상 등) (0) | 2022.07.08 |
[Flutter] 화면 / 이미지 슬라이더 사용법 (carousel) (0) | 2022.07.04 |