Flutter에서 permission_handler 사용법 완벽 가이드
Flutter로 앱을 만들다 보면 꼭 필요한 기능이 있어요. 바로 사용자에게 권한(permission)을 요청하는 기능인데요. 예를 들어 위치를 가져오거나, 카메라를 켜거나, 마이크를 사용할 때 꼭 권한을 먼저 받아야 해요. 이때 사용하는 게 바로 permission_handler 패키지예요!
✅ 이 글에서 배울 내용
- permission_handler 설치 방법
- 안드로이드와 iOS 설정
- 권한 요청 및 상태 확인 코드
- 실전 예제: 카메라 권한 요청
- 자주 묻는 질문(FAQ)
📦 permission_handler 설치 방법
- pubspec.yaml에 패키지 추가
- 최신 버전 확인은 pub.dev/permission_handler에서!
터미널에서 다음 명령어로 설치를 마무리해 주세요.
flutter pub get
혹은 VS Code를 사용해서 개발하시는 분들은, pubspec.yaml 파일을 저장하기만 해도
자동으로 flutter pub get이 실행돼요!
Output View에서 오른쪽의 토글에서 flutter(project name) 을 클릭해서 탭을 전환해서 확인해보면,
자동으로 flutter pub get --no-example이 실행된 결과를 확인할 수 있습니다.
확인해보면 +permission_handler 12.0.0+1 버전이 잘 설치됐어요.
dependencies 설치 중에 에러가 발생하는 것도 이 View를 통해서 확인할 수 있습니다.
설치가 끝났다면 이제 각 플랫폼별로 설정을 해줘야 해요.
⚙️ Android와 iOS 설정하기
공식 문서를 따라서 설치를 진행하는 과정을 자세하게 설명해볼게요.
오늘은 2가지 권한을 요청해볼게요. 바로 카메라와 마이크 사용권한이에요.
Android
현재 일자 기준으로는 Android는 추가로 설정을 진행할 것이 없어요.
android/app/src/main/AndroidManifest.xml 파일에 pemission_handler 사용을 위해 필요한 권한을 추가해주시면 됩니다.
manifest 태그 밑에 바로 추가해주시면 돼요. <application> 태그 밖에 써주세요!
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
iOS
iOS도 마찬가지로 권한을 설정해야 하지만, iOS에서는 2가지 작업을 진행해주셔야 해요.
먼저 ios/Runner/Info.plist 파일에 permission_handler 사용을 위해 필요한 권한을 일단 설정해볼까요?
Info.plist에는 권한 팝업이 뜰 때 사용자에게 "왜 이 권한이 필요한가?" 에 대해서 설명하는 문구가 필요해요.
여기에 설정한 문구대로 실제로 권한 요청 팝업이 나타날 때 그대로 보여요.
<key>NSCameraUsageDescription</key>
<string>이 앱은 카메라를 사용해야 해요</string>
<key>NSMicrophoneUsageDescription</key>
<string>이 앱은 마이크를 사용해야 해요</string>
두번째로는 ios/Podfile에 permission_handler에서 사용하는 매크로 설정을 해줘야 합니다.
공식 문서의 iOS 토글을 열어서, 첫번째 스텝의 target.build_configuration... 부분을 복사해서
아래 사진처럼 똑같이 ios/Podfile의 post_install에 붙여넣어주세요.
이 작업을 통해서, permission_handler iOS빌드에 내가 어떤 권한을 사용할 것인지 알려주는 거랍니다.
자세히 확인해보면 'PERMISSION_*=1' 이라고 쭉 나열되어있어요.
내가 필요한 것 빼고는 다 없애주시면 되는데, "나 이 권한은 안써~" 라고 표시하는 방법은 총 3가지입니다.
- 필요한 것 뺴고 삭제한다.
- 필요한 것 빼고는 주석 처리해놓는다.
- 필요한 것 빼고는 'PERMISSION_*=0'으로 0으로 변경한다.
저희는 카메라랑 마이크빼고는 아래와 같이 다 지워줄게요.
이제 Android와 iOS에서 permission_handler를 사용하기 위한 설정은 다 마쳤습니다.
이제 실제로 코드를 작성해서 권한 요청이 잘 되는지 확인해볼까요?
전체 코드
// permission_request_view.dart
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
class PermissionRequestView extends StatefulWidget {
const PermissionRequestView({super.key});
@override
_PermissionRequestViewState createState() => _PermissionRequestViewState();
}
class _PermissionRequestViewState extends State<PermissionRequestView> {
PermissionStatus? _cameraStatus;
@override
void initState() {
super.initState();
}
Future<void> _requestCameraPermission() async {
var status = await Permission.camera.request();
setState(() {
_cameraStatus = status;
});
if (status.isGranted) {
print("카메라 접근 허용됨!");
} else if (status.isPermanentlyDenied) {
openAppSettings(); // 설정창으로 유도
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
_requestCameraPermission();
},
child: Text('카메라 권한 요청'),
),
Text(_cameraStatus.toString()),
],
),
),
);
}
}
코드 설명
아주 간단한 page를 하나 만들어서 테스트 해볼게요.
권한 요청을 할 수 있는 버튼 하나와 권한 상태를 보여주는 텍스트 두 개의 위젯으로 구성된 화면입니다.
버튼을 누르면, Permission.camera.request()를 통해서 권한 요청팝업을 띄우게 돼요.
아까 Info.plist에 적어둔 권한 요청 문구가 잘 보이는 것을 확인할 수 있어요.
유저가 권한을 허용했다면 아래처럼 가운데에 PermissionStatus.granted 상태가 잘 보이게 됩니다.
반대로 유저가 권한을 거절했다면 PermissionStatus.isPermanentlyDenied 상태가 표시되면서
openAppSettings함수를 호출해서 자동으로 앱 설정이 열리도록 구현했어요.
사용자가 권한을 거절했을 경우 앱 설정창으로 유도할 수도 있어요. 이 기능도 permission_handler가 지원해줘서 정말 편하답니다.
🙋 자주 묻는 질문 (FAQ)
Q. 사용자가 권한을 거절하면 어떻게 해야 하나요?
A. isPermanentlyDenied 상태일 경우 설정창으로 유도할 수 있어요.
Q. 여러 권한을 한 번에 요청할 수 있나요?
A. 네! Permission.camera.request()뿐 아니라
await [Permission.camera, Permission.microphone].request();처럼 배열로 한 번에 요청 가능해요.
✨ 마무리하며
오늘은 Flutter 앱을 만들 때 꼭 필요한 permission_handler 패키지에 대해서 함께 알아봤어요.
처음엔 권한 요청이 어렵게 느껴질 수 있지만, 하나하나 따라 해보면 생각보다 간단하다는 걸 느끼셨을 거예요 😊
앞으로 위치, 카메라, 마이크, 파일 접근 등 다양한 권한을 다뤄야 할 일이 많을 텐데요.
이번 포스트를 잘 참고해서 앱 개발에 자신감을 가져보세요!
다음에는 실전 프로젝트에서 자주 쓰이는 권한 처리 꿀팁이나 에러 대처 방법도 소개해볼게요.
혹시 궁금한 점이 있다면 댓글이나 메일로 언제든지 질문해 주세요. 도움이 되었다면 좋아요와 공유도 부탁드려요 🙌
다음 포스트에서 또 만나요!