개발 공부를 하면서 저는 특히나 이 권한 부분에서 많이 헤매고 어려움을 겪었던 기억이 있어 내용을 정리해보고 싶었습니다.
개인적으로 저는 모바일 개발에 있어 각 디바이스별로 권한이나 버전 등의 제한이 있고, 이에 맞춰 개발을 진행해야 한다는 특징이 가장 어려운 점 중 하나가 아닐까 생각하곤 합니다..
블로그에 기록하는 건 생각보다 큰 결심이 필요하지만.. 기록해두면 그만큼 제가 유용하게 참고하는 경우가 많기도 하고 다른 분들이 보며 참고할 수 있는 자료가 되기에 정말 유익한 것 같습니다!! 헤헤
그럼 바로 플러터에서 각 기기의 권한에 접근하는 방법에 대해서 알아보도록 하겠습니다.
1. 패키지 가져오기
https://pub.dev/packages/permission_handler
permission_handler | Flutter package
Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.
pub.dev
permission_handler 패키지를 가져옵니다.
가져오는 방법은 알고계시다시피 pubspec.yaml 파일에서 해당 패키지를 추가해주시면 됩니다.
이 패키지를 사용하면 기존보다 훨씬 더 빠르게 권한에 접근이 가능합니다!
혹시 제 글을 보고 이해가 되지 않는다면 패키지에 작성되어 있는 가이드를 참고하는 것도 좋은 방법입니다!
2. 권한 셋팅하기
IOS인지 Android인지에 따라 다르지만, 두 기종 모두 권한에 접근하기 위해서는 설정을 변경해야합니다.
생각보다 간단하니 잘 따라와주시면 되겠습니다.
- IOS
1. ios/Podfile 경로로 이동하여 아래의 코드를 붙여넣어줍니다.
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 at: 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.calendarWriteOnly, PermissionGroup.calendar (iOS 16 and below)]
# 'PERMISSION_EVENTS=1',
## dart: [PermissionGroup.calendarFullAccess, PermissionGroup.calendar (iOS 17 and above)]
# 'PERMISSION_EVENTS_FULL_ACCESS=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
ios는 안드로이드와 다르게 선택적으로 권한을 풀어주어야 합니다.##로 주석처리된 내용을 통해 어떤 권한인지 살펴보고, 자신이 사용할 권한의 주석을 제거해주면 됩니다!
## dart: PermissionGroup.camera
'PERMISSION_CAMERA=1',
예시로 카메라의 권한을 얻어보았습니다. 이렇게 #을 제거해주면 간단하게 끝이 납니다!^^
2. 권한 사용을 얻기 위해 키 값을 추가합니다. (중요)
ios/Runner/Info.plist 폴더로 들어가고, 자신이 사용하고자 하는 권한의 키 값과 안내될 문구(string)를 삽입해줍니다.
<key>NSCameraUsageDescription</key>
<string>카메라의 권한을 해제합니다.</string>
위처럼 작성해주시면 됩니다!
권한의 키값은 다음 표를 참고하셔도 되고, 패키지에 포함되어 있는 표를 참고하셔도 됩니다.
표를 보시면 Podfile에는 오른쪽 값을, info,plist에는 중간에 있는 값을 사용하여 해당 권한을 사용할 수 있다는 것을 알 수 있습니다!
권한 | info.plist | Podfile |
PermissionGroup.calendar (< iOS 17) | NSCalendarsUsageDescription | PERMISSION_EVENTS |
PermissionGroup.calendarWriteOnly (iOS 17+) | NSCalendarsWriteOnlyAccessUsageDescription | PERMISSION_EVENTS |
PermissionGroup.calendarFullAccess (iOS 17+) | NSCalendarsFullAccessUsageDescription | PERMISSION_EVENTS_FULL_ACCESS |
PermissionGroup.reminders | NSRemindersUsageDescription | PERMISSION_REMINDERS |
PermissionGroup.contacts | NSContactsUsageDescription | PERMISSION_CONTACTS |
PermissionGroup.camera | NSCameraUsageDescription | PERMISSION_CAMERA |
PermissionGroup.microphone | NSMicrophoneUsageDescription | PERMISSION_MICROPHONE |
PermissionGroup.speech | NSSpeechRecognitionUsageDescription | PERMISSION_SPEECH_RECOGNIZER |
PermissionGroup.photos | NSPhotoLibraryUsageDescription | PERMISSION_PHOTOS |
PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse | NSLocationUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription | PERMISSION_LOCATION |
PermissionGroup.notification | PermissionGroupNotification | PERMISSION_NOTIFICATIONS |
PermissionGroup.mediaLibrary | NSAppleMusicUsageDescription, kTCCServiceMedia |
-Android
1. android/gradle.properties 경로의 파일로 들어가 다음과 같은 내용을 추가해줍니다
android.useAndroidX=true
android.enableJetifier=true
2. android/app/build.gradle 파일로 들어가 중간정도에 있는 complieSdkVersion을 33으로 맞춰줍니다.
안드로이드의 셋팅은 이렇게 간단하게 끝납니다!
이전까지는 androidmanifest.xml파일에서의 권한 설정도 진행해주었는데, 버전이 업그레이드되면서 작업이 필요없게 되었습니다.
하지만 예외적으로 해당 작업이 수동으로 필요한 경우가 있습니다.
그런 경우에는 아래 링크를 참고하여 자신의 권한에 맞게 androidmanifest.xml 파일을 수정해주시면 됩니다
3. rebuild
수정된 사항을 적용하기위해 재빌드를 진행합니다!
4. 적용하기
권한을 요청해봅니다.
//권한 상태 개별 요청하기
var status = await Permission.contacts.request();
//여러 개의 권한 요청하기
Map<Permission, PermissionStatus> statuses = await [
Permission.locationWhenInUse,
Permission.photos,
Permission.notification,
].request();
이렇게 권한을 요청할 수 있고, 권한의 상태는 사용자의 선택에 따라 여러가지로 나뉩니다.
denied -거부.
granted - 승인
restricted - OS자체에서의 엑세스 거부입니다. 사용자가 임의로 이 상태를 변경할 수 없습니다(ios만 지원)
limited - 제한됨(사진 권한에서만 사용되는 값으며, 제한된 사용권한을 의미. ios 14이상만 지원)
permanentlyDenied - 영구적으로 거부됨. 권한 대화 상자가 더 이상 표기되지 않으며, 사용자가 설정에서 권한을 변경하지 않는 이상 변경이 불가합니다.(아이폰 11이상: 사용자가 2번 거부했다면 해당 상태가 활성화 /.안드로이드 11이상: 사용자가 다시는 요청을 표시하지 않음을 선택했는지를 확인)
provisional -임시로 일시적 권한을 부여합니다. (안드로이드 12버전 이상에서 지원)
ios가.. 참. 까다롭습니다...^^,,,
여기까지 Permission_handler을 사용하여 권한 설정을 진행해보았습니다.
생각보다 간단하지만 각 OS별로 다른 환경 셋팅이 필요하고, 표기되는 상태도 다르다보니 코드를 작성하는 데 있어서 생각보다 복잡할 . 수있습니다.
다음번에는 firebase를 통한 알림 기능에 관해서 포스팅해보도록 하겠습니다.
잘못된 내용이나 피드백이 있다면 감사하게 받도록 하겠습니다!^!^
'개발 > 플러터(Flutter)' 카테고리의 다른 글
[플러터(Flutter)]- Firebase로 푸쉬 알림 보내보기(2)_Flutter에서 Firebase 를 쓰기 위한 토큰을 받아보자! (1) | 2024.02.25 |
---|---|
[플러터(Flutter)]- Firebase로 푸쉬 알림 보내보기(1)_Firebase와 Flutter를 연결해보자 (0) | 2024.02.18 |
[플러터(Flutter)]- Build와 다양한 BuildWidget 알아보기 (0) | 2024.01.26 |
[플러터(Flutter)] - Http에서 json 타입의 데이터 가져오기(GET) (2) | 2023.11.29 |
[플러터(Flutter)] - Http,dio 라이브러리로 json 타입, formdata타입 데이터 전송(POST)하기 (3) | 2023.11.28 |