iOS flutter app don't ask for permissions and returns permission status unknown

6,418

Your Pod file is incorrect. It's comments say: # You can remove unused permissions here # for more infomation: https://github.com/Baseflow/flutter-permission-handler/blob/develop/permission_handler/ios/Classes/PermissionHandlerEnums.h # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0'

So, if you want to not use location services and don't want to ask for location services related permission then only write below line: 'PERMISSION_LOCATION=0',

Since you have written above line, while building Pod will exclude code from permission_handler package related to location permission. Hence even if you invoke permission popup for location from flutter code it will always return permission staus unknown.

Share:
6,418
Code Runner
Author by

Code Runner

I am software developer in C# with more than 2 years experience and right now i working as mobile developer with xamarin in Ontario,Canada.

Updated on December 06, 2022

Comments

  • Code Runner
    Code Runner over 1 year

    I am using a permission_handler 4.4.0(latest update) plugin to handle permissions on mobile devices which works perfectly on android devices but when i am trying to ask for permissions on iOS it doesn't show permission pop on device and returns the permission status unknown. I think so it might be missing into the info.plist or pod file but I followed and double checked the both files but I didn;t find anything wrong but i uploaded code for that files if someone finds anything missing or wrong into files. please look into the code and let me know your suggestions. Thanks in advance guys.

    info.plist

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>$(DEVELOPMENT_LANGUAGE)</string>
        <key>CFBundleExecutable</key>
        <string>$(EXECUTABLE_NAME)</string>
        <key>CFBundleIdentifier</key>
        <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleName</key>
        <string>driverapp</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
        <string>$(FLUTTER_BUILD_NAME)</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
        <string>$(FLUTTER_BUILD_NUMBER)</string>
        <key>LSRequiresIPhoneOS</key>
        <true/>
        <key>UILaunchStoryboardName</key>
        <string>LaunchScreen</string>
        <key>UIMainStoryboardFile</key>
        <string>Main</string>
        <key>UISupportedInterfaceOrientations</key>
        <array>
            <string>UIInterfaceOrientationPortrait</string>
            <string>UIInterfaceOrientationLandscapeLeft</string>
            <string>UIInterfaceOrientationLandscapeRight</string>
        </array>
        <key>UISupportedInterfaceOrientations~ipad</key>
        <array>
            <string>UIInterfaceOrientationPortrait</string>
            <string>UIInterfaceOrientationPortraitUpsideDown</string>
            <string>UIInterfaceOrientationLandscapeLeft</string>
            <string>UIInterfaceOrientationLandscapeRight</string>
        </array>
        <key>UIViewControllerBasedStatusBarAppearance</key>
        <false/>
        <key>io.flutter.embedded_views_preview</key>
        <true/>
        <!-- Permission options for the `location` group -->
        <key>NSLocationWhenInUseUsageDescription</key>
        <string>Need Location for Route Map and AppMarker Jobs</string>
        <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
        <string>Need Location for Patrolling and AppMarker Jobs</string>
        <key>NSLocationUsageDescription</key>
        <string>Need Location for Patrolling and AppMarker Jobs</string>
        <key>NSLocationAlwaysUsageDescription</key>
        <string>Need Location for Patrolling feature</string>
        <key>PermissionGroupNotification</key>
        <string>To show the notifications</string>
    </dict>
    </plist>
    
    

    podfile

    # Uncomment this line to define a global platform for your project
     platform :ios, '10.0'
    
    # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
    ENV['COCOAPODS_DISABLE_STATS'] = 'true'
    
    project 'Runner', {
      'Debug' => :debug,
      'Profile' => :release,
      'Release' => :release,
    }
    
    def parse_KV_file(file, separator='=')
      file_abs_path = File.expand_path(file)
      if !File.exists? file_abs_path
        return [];
      end
      generated_key_values = {}
      skip_line_start_symbols = ["#", "/"]
      File.foreach(file_abs_path) do |line|
        next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
        plugin = line.split(pattern=separator)
        if plugin.length == 2
          podname = plugin[0].strip()
          path = plugin[1].strip()
          podpath = File.expand_path("#{path}", file_abs_path)
          generated_key_values[podname] = podpath
        else
          puts "Invalid plugin specification: #{line}"
        end
      end
      generated_key_values
    end
    
    target 'Runner' do
      # Flutter Pod
    
      copied_flutter_dir = File.join(__dir__, 'Flutter')
      copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
      copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
      unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
        # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
        # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
        # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
    
        generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
        unless File.exist?(generated_xcode_build_settings_path)
          raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
        end
        generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
        cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
    
        unless File.exist?(copied_framework_path)
          FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
        end
        unless File.exist?(copied_podspec_path)
          FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
        end
      end
    
      # Keep pod path relative so it can be checked into Podfile.lock.
      pod 'Flutter', :path => 'Flutter'
    
      # Plugin Pods
      pod 'Firebase/Analytics'
      pod 'Firebase/Database'
      # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
      # referring to absolute paths on developers' machines.
      system('rm -rf .symlinks')
      system('mkdir -p .symlinks/plugins')
      plugin_pods = parse_KV_file('../.flutter-plugins')
      plugin_pods.each do |name, path|
        symlink = File.join('.symlinks', 'plugins', name)
        File.symlink(path, symlink)
        pod name, :path => File.join(symlink, 'ios')
      end
    end
    
    # Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system.
    install! 'cocoapods', :disable_input_output_paths => true
    
    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.0'
          config.build_settings['ENABLE_BITCODE'] = 'NO'
    
    
          # You can remove unused permissions here
          # for more infomation: https://github.com/BaseflowIT/flutter-permission-handler/blob/develop/ios/Classes/PermissionHandlerEnums.h
          # e.g. when you don't need camera permission, just add 'PERMISSION_CAMERA=0'
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
            '$(inherited)',
    
            ## dart: PermissionGroup.calendar
            # 'PERMISSION_EVENTS=0',
    
            ## dart: PermissionGroup.reminders
            # 'PERMISSION_REMINDERS=0',
    
            ## dart: PermissionGroup.contacts
            #  'PERMISSION_CONTACTS=0',
    
            ## dart: PermissionGroup.camera
            # 'PERMISSION_CAMERA=0',
    
            ## dart: PermissionGroup.microphone
            # 'PERMISSION_MICROPHONE=0',
    
            ## dart: PermissionGroup.speech
            # 'PERMISSION_SPEECH_RECOGNIZER=0',
    
            ## dart: PermissionGroup.photos
            # 'PERMISSION_PHOTOS=0',
    
            ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
             'PERMISSION_LOCATION=0',
    
            ## dart: PermissionGroup.notification
             'PERMISSION_NOTIFICATIONS=0',
    
            ## dart: PermissionGroup.mediaLibrary
            # 'PERMISSION_MEDIA_LIBRARY=0',
    
            ## dart: PermissionGroup.sensors
            # 'PERMISSION_SENSORS=0'
          ]
        end
      end
    end
    

    flutter code

    Future<bool> checkForDevicePermission() async {
        var status = await PermissionManager.checkForPermissions(
            Platform.isAndroid? PermissionManager.androidPermissionsList:PermissionManager.iOSPermissionsList);
        if (status != null) {
    //status returned here is PermissionStatus.unknown for all permissions 
    //further code
           }
    }
    
    //PermissionManager Function
    static Future<Map<PermissionGroup, PermissionStatus>> checkForPermissions(
          List<PermissionGroup> permissions) async {
        List<PermissionGroup> neededPermissions = List<PermissionGroup>();
        for (var permission in permissions) {
          permissionStatus =
              await PermissionHandler().checkPermissionStatus(permission);
          if (permissionStatus == PermissionStatus.unknown ||
              permissionStatus == PermissionStatus.denied) {
            neededPermissions.add(permission);
          }
        }
        if (neededPermissions != null && neededPermissions.length > 0) {
    //getting the all permission status means granted or denied for which are requested to user
          try {
            Map<PermissionGroup, PermissionStatus> permissionsStatusList =
                await PermissionHandler().requestPermissions(neededPermissions);
            print(permissionsStatusList);
            return permissionsStatusList;
          } catch (e) {
            print(e.toString());
            return null;
          }
        } else {
          return null;
        }
      }
    

    There is no error logs in debug console when it asks for permissions

    • newbie
      newbie almost 4 years
      did you managed to resolve you issue? I am facing similar issue though
    • Code Runner
      Code Runner almost 4 years
      try to use the latest update of permission_handler plugin it might solve it because at that time I just added temperory fix because I didn't find out the permanent fix at that time that's why I haven't added as answer. Try it and and If it works just add as an answer. Hopefully it works. Thanks
    • newbie
      newbie almost 4 years
      I am using the latest plug in infact the same issue nothing still.
    • Code Runner
      Code Runner almost 4 years
      First try to make sure you have purpose strings and all the pod file changes updated and clean your build still no success then there is only way to create issue on plugin repository and you might get someone who can help from there because as I have created question there is no reply from anyone or they didn't face this problem.
    • newbie
      newbie almost 4 years
      I followed the exact steps in that we website . Yes I did accordingly too. Hope some one can help on this.
    • Code Runner
      Code Runner almost 4 years
      If you don't mind to put some code which can reproduce the same bug then feel free to edit my question so I or anyone else who looks at code and might find any issue in your code or can provide some fix.
    • newbie
      newbie almost 4 years
      where you would like me to put the codes? Over here ? I cant edit your question either.
    • Code Runner
      Code Runner almost 4 years
      ohh then just create new question that's fine as well. and mention your question link here.
    • newbie
      newbie almost 4 years
      infact I just posted a related question here ready stackoverflow.com/questions/63054221/…
    • newbie
      newbie almost 4 years
      You can maybe answer on it or comment cause I dont know why its down vote I have done my research and google
  • Code Runner
    Code Runner over 3 years
    Thanks. I have already figured out but it will be good for some who is stuck.
  • railon
    railon over 3 years
    Thanks @krunal-gandhi, you made me double-check my podfile! I had a look and thought it should be correct. But you reminded me, that if I NEED a permission, than the '#' need to be in front! This should be the accepted answer!