반응형

application 에서 실행중에 사용자가 퍼미션을 허용해야만 동작하는 module들이 있습니다.
이를 위해서 잘 만들어진 어플리케이션들은 퍼미션을 허용하는 UI를 제공하게 됩니다.

flutter에서 기본적인 퍼미션 허용하는 UI를 제공하는 방법을 소개합니다.

permission_handler [https://pub.dev/packages/permission_handler]

flutter에 permission_handler 라는 package가 있는데, 이를 이용하면 매우 쉽게 퍼미션을 설정 할 수 있습니다.


순서
Flutter에서 각 기능에 대한 퍼미션 설정을 위해서는 몇가지 파일들을 수정해야 하는데요.
순서를 한번 따라가 보겠습니다.

1. android manifest 에서 필요한 퍼미션을 추가합니다.
[project] /app/profile/AndroidManifest.xml
파일 안을 살펴보면 아래와 같이 use-permission 부분들이 있습니다.
필요한 퍼미션을 이 파일에 추가합니다.
저는 FINE_LOCATION과 BT 관련 퍼미션이 필요해서 다음과 같이 추가 했습니다.

<uses-permission android:name="android.permission.INTERNET"/>
<!-- 추가한 퍼미션 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>



2. permission_handler를 flutter pub 설정 파일에 추가합니다.
[project]/pubspec.yaml
위 파일에 다음과 같이 추가합니다.
permission_handler의 version은 pub.dev 에서 확인하시면 됩니다.

permission_handler: ^10.2.0

그리고 pub get 하기

3. permission 요청 하기
자 이제 모든 준비가 끝났고, 필요한 시점에 퍼미션 요청을 하면 됩니다.
예를 들면 BT scan전에는 BT 퍼미션이 필요하겠죠? 그러면 BT scan 전에 BT 퍼미션을 요청하는 코드를 작성해서 넣으면 됩니다.
퍼미션을 요청 하는 방법은 사용자 편의성을 고려해서 적용하는게 좋겠죠?
매번 이렇게 필요한 기능을 수행할때 퍼미션을 요청 할 수도 있지만,
사용성을 해치지 않는다면, 앱 최초 실행후 전체 퍼미션을 요청하는 것도 하나의 방법입니다.

더 정교하게 permission 요청 로직을 작성할 수 도 있지만, 아래와 같이 간단한 퍼미션 요청 함수를 만들고,
widget build() 에서 호출해도 어플리케이션 동작에 영향을 주지 않을 겁니다.

아래 사용한 permission의 request() 함수는 이미 퍼미션이 있으면 아무것도 하지 않기 떄문입니다.
또 _permissionCheck() 함수는 async로 만들어 놨기 때문에 build 함수의 퍼포먼스에 영향을 주지 않습니다.
( 영향을 주기야 하겠죠~ ^^ 그러나 무시할 수 있을 만큼이란 의미로 받아들이면 좋겠습니다.)

  _permissionCheck() async{

    print("permission check");

    Map<Permission, PermissionStatus> status = await [
      Permission.locationWhenInUse,
      Permission.bluetooth,
      Permission.bluetoothConnect,
      Permission.bluetoothScan
    ].request();
  }
  
  
class DeviceControlPage extends GetView<DeviceController>{
  const DeviceControlPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    Get.put(DeviceController());
    controller.prepare();

    _permissionCheck();
     :



    return Scaffold(
          resizeToAvoidBottomInset : false,
          body: Obx(()=>Column(
          ....
          );
  }



이상 완료!!!

즐거운 코딩 생황~

+ Recent posts