본문 바로가기

소프트웨어 /Flutter

[Flutter] Permission_handler ios 15 버전에서 location 권한 요청하기

반응형

기존 앱 테스트 시 ios 14.2 버전인 기기를 사용하고 있었는데 permisson_handler 라는 패키지를 사용하여 위치 권한을 가져올 수 있었다.

 

그런데 ios 15.2 기기를 사용 시 위처럼 위치 권한을 요청하는 코드를 구성해도 기기에서 권한 요청 창이 뜨지 않는 것이다.......

 

리얼 ios 너무 싫다..

 

그래서 패키지 사이트를 찾아보니

 

PodFile에 다음을 추가해야 한다고 한다.

 

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      ... # Here are some configurations automatically generated by flutter

      # 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/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
end

<perisson_handler> 사이트

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

 

14.2에서 동작한 내 코드를 보자면

 

<기존 PodFile>

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    ## dart: PermissionGroup.bluetooth
       'PERMISSION_BLUETOOTH=0'
  end
end

 

따로 위치 권한을 세팅해두지 않았다. 물론 info.plist에 위치 권한은 추가해둔 상태.

 

그래서 맨 위 사이트에 있는 코드로 PodFile에 위치권한도 추가 했더니 flutter.h 파일이 없다는 둥 별별 이상한 에러들이 다 뜨더라...

 

이건 아니다 싶어 다른 코드를 찾아보았다..

 

post_install do |installer|
  installer.pods_project.targets.each do |target|
        flutter_additional_ios_build_settings(target)
        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'
            #
            # When enabled here, corresponding metadata should be added to info.plist
            config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
                '$(inherited)',

                ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
                 'PERMISSION_LOCATION=1',

                ## dart: PermissionGroup.bluetooth
                 'PERMISSION_BLUETOOTH=1',
            ]
        end
    end
end

이 코드를 삽입하니 에러 없이 위치 권한 요청도 잘 되었다.

 

물론 permission_handler를 사용해 권한 요청을 할 땐 아래와 같이 해주면 된다.

 

await Permission.location.request();

 

 

++++

위와 같이 해도 위치 권한이 뜨지 않는다면 다음을 plist 파일에 추가해주자.

Availability - ios 14.0+이상

<key>NSLocationDefaultAccuracyReduced</key>
    <true/>

 

true 이면 모든 핵심 위치 서비스에서 정확도가 낮은 수준에서 서비스를 받아 구체적이 아닌 대략적인 위치만 파악할 수 있고

false 이면 전체 위치 정확도를 묻는 메시지가 표시된다. 앱이 사용자의 구체적인 위치를 사용하도록 허용한다.

 

즉, 위치 정확도 수준을 제어하기 위한 것.

 

진심 ios 넘 까다롭다............. 곧 출시인데 15버전으로 테스트 안해봤으면 어쩔뻔..?