대부분의 운영 체제에서 권한은 설치시에만 요구하도록 지원합니다.
하지만 앱의 정상실행을 위해서는 실행되는 동안에도 필요 권한(런타임 권한요청)을 사용자에게 요청해야합니다 .
permission_handler 는 크로스 플랫폼(iOS, Android) API를 제공합니다.
사용자가 권한을 부여할 수 있도록 기기의 앱 설정을 열 수도 있습니다.
Android에서는 권한을 요청하는 근거를 보여줄 수 있습니다.
1. Setting
해당 API를 사용하기 위해서는 project내에 기본적으로 권한을 요구하도록 설정이 필요합니다.
1) AOS
1. "gradle.properties" 파일에 다음을 추가합니다. (기본사항이라 변경 불필요, 확인)
android.useAndroidX=true
android.enableJetifier=true
2. compileSdkVersion"android/app/build.gradle" 파일에서 33으로 설정했는지 확인하세요.
( permission_handler: ^10.0.0 최신버전이 아닌경우에는 다름)
android {
compileSdkVersion 33
...
}
3. AndroidManifest.xml에 필요한 권한을 추가 합니다.
안드로이드 모든 권한종류와 설정법 확인은 이 글을 참조
2) IOS
1. Podfile파일 에 다음을 추가합니다 .
- 아래 권한 목록중 필요한 부분만 주석을 제거하여 사용 (값이 1로 설정되었는지도 체크)
post_install do |installer|
installer.pods_project.targets.each do |target|
... # Here are some configurations automatically generated by flutter
# Start of the permission_handler configuration
target.build_configurations.each do |config|
# You can enable the permissions needed here. For example to enable camera
# permission, just remove the `#` character in front so it looks like this:
#
# ## dart: PermissionGroup.camera
# 'PERMISSION_CAMERA=1'
#
# Preprocessor definitions can be found in: https://github.com/Baseflow/flutter-permission-handler/blob/master/permission_handler_apple/ios/Classes/PermissionHandlerEnums.h
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## 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'
]
end
# End of the permission_handler configuration
end
end
2. Info.plist 동기화
사용 하고자 하는 권한을 작성했다면,
그에 맞는 권한을 요구하는 설명값도 반드시 Info.plist 파일에 명시하고 작성해주어야 합니다.
<!-- 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>
아래는 Podfile에서의 상수값과 Info.plist 에서의 값의 맵핑표입니다.
PermissionGroup.calendar | NSCalendars사용 설명 | PERMISSION_EVENTS |
PermissionGroup.reminders | NSReminders사용 설명 | PERMISSION_REMINDERS |
PermissionGroup.contacts | NSContacts사용 설명 | PERMISSION_CONTACTS |
PermissionGroup.camera | NSCamera사용 설명 | PERMISSION_CAMERA |
PermissionGroup.마이크 | NSMicrophone사용 설명 | PERMISSION_MICROPHONE |
PermissionGroup.speech | NSSpeechRecognitionUsageDescription | PERMISSION_SPEECH_RECOGNIZER |
PermissionGroup.photos | NSPhotoLibrary사용 설명 | PERMISSION_PHOTOS |
PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse | NSLocationUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription | PERMISSION_LOCATION |
PermissionGroup.notification | 권한 그룹 알림 | PERMISSION_NOTIFICATIONS |
PermissionGroup.mediaLibrary | NSAppleMusicUsageDescription, kTCCServiceMediaLibrary | PERMISSION_MEDIA_LIBRARY |
PermissionGroup.sensors | NSMotion사용 설명 | PERMISSION_SENSORS |
PermissionGroup.bluetooth | NSBluetoothAlwaysUsageDescription, NSBluetoothPeripheralUsageDescription | PERMISSION_BLUETOOTH |
PermissionGroup.appTrackingTransparency | NSUserTracking사용 설명 | PERMISSION_APP_TRACKING_TRANSPARENCY |
PermissionGroup.criticalAlerts | PermissionGroupCriticalAlerts | PERMISSION_CRITICAL_ALERTS |
명확하게 앱에서 필요로하는 권한들을 명시하여 설정해주었다면,
이제부터 사전작업, 기본셋팅이 끝났습니다.
2. 설치
$ flutter pub add permission_handler
또는 pubspec.yaml에 다음과 같은 줄 추가
dependencies:
permission_handler: ^10.0.0
flutter pub get 후에 아래와 같이
import하면 사용이 가능합니다.
import 'package:permission_handler/permission_handler.dart';
3. Example Code
QR코드 스캔을 위해 카메라 권한을 명시하여 셋팅해주었고,
권한요청을 담당하는 Class를 만들어 아래와 같은 함수를 작성하였습니다.
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
class PermissionManage{
/// 카메라 권한 요청
Future<bool> requestCameraPermission(BuildContext context) async {
// 권한 요청
PermissionStatus status = await Permission.camera.request();
// 결과 확인
if(!status.isGranted) { // 허용이 안된 경우
showDialog(
context: context,
builder: (BuildContext context) {
// 권한없음을 다이얼로그로 알림
return AlertDialog(
content: const Text("권한 설정을 확인해주세요."),
actions: [
TextButton(
onPressed: () {
openAppSettings(); // 앱 설정으로 이동
},
child: const Text('설정하기')),
],
);
});
return false;
}
return true;
}
}
함수는 비동기처리 키워드가 필요하며
권한요청은 Permission.camera.request(); 로 합니다.
해당 결과는 undetermined, granted, denied, restricted 가 있으며
안드로이드는 추가로 permanentlyDenied 이 있다.
위 코드는 권한이 거부되었을때,
권한설정을 확인해달라는 문구와 함께 설정창으로 이동하게 해주는 openAppSettings 까지 추가되어있다.
위에 코드를 이해했다면,
공식문서에서 Platform OS별로 권한을 요청하는 코드를 제공합니다.
해당 코드를 확인하시고 베이스로 사용하시길 바랍니다.
https://pub.dev/packages/permission_handler/example
'Study > Flutter' 카테고리의 다른 글
[Flutter] 로그 도우미 logger 사용법 (0) | 2022.08.02 |
---|---|
[Flutter] QR 코드 생성, 스캔 (0) | 2022.07.29 |
[Flutter] Permission 그룹 권한의 종류와 허용법 (AOS / IOS) (0) | 2022.07.19 |
[Flutter] floatingActionButton 플로팅 버튼 크기 설정 (0) | 2022.07.15 |
[Flutter] 앱 전체 테마 설정 (배경, 글꼴, 텍스트 스타일, 색상 등) (0) | 2022.07.08 |