본문 바로가기
Study/Flutter

[Flutter] 앱 권한 관리 permission_handler 사용법 (AOS / IOS)

대부분의 운영 체제에서 권한은 설치시에만 요구하도록 지원합니다. 

하지만 앱의 정상실행을 위해서는 실행되는 동안에도 필요 권한(런타임 권한요청)을 사용자에게 요청해야합니다 .

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  

 

permission_handler | Flutter Package

Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.

pub.dev