Flutter-geolocator: Error después de aprobar en iOS: PlatformException (PERMISSION_DENIED, Acceso denegado a los datos de ubicación, nulo)

Creado en 30 abr. 2019  ·  12Comentarios  ·  Fuente: Baseflow/flutter-geolocator

🐛 Informe de error

  1. El código solicita la posición, el usuario lo aprueba, el código arroja un error:
    PlatformException (PERMISSION_DENIED, acceso a los datos de ubicación denegado, nulo)

  2. Pero después de solicitar la posición por segunda vez, la posición correcta se devuelve instantáneamente sin diálogo ni errores.

Comportamiento esperado

Se devuelve la posición y no se arrojan errores al solicitar la posición y la aprobación del usuario.

Pasos de reproducción

import 'package:geolocator/geolocator.dart';
try{
   position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
}
catch(error)
{
  print("error in geolocation: $error"); //error in geolocation: PlatformException(PERMISSION_DENIED, Access to location data denied, null)
  print("position: $position"); // position: null
  print("retrying");  // retrying
  try{
    position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
  }
  catch(error)
  {
    await printGeoStatus(5);
    print("2nd error in geolocation $error");
  }
  print("final position: $position"); //flutter: final position: Lat: 59.xyz, Long: 17.xyz

}

Configuración

Versión de Flutter: "Channel dev, v1.5.8"
Versión del geolocalizador: ^ 4.0.2

Plataforma:

  • [x]: iphone: iOS
  • []: robot: Android
ios triage bug

Comentario más útil

Actualmente estoy trabajando en una solución para este y una lista de otros problemas (consulte el n. ° 430 para obtener más detalles). Sin embargo, será una actualización importante.

Actualmente, el lado de iOS está listo y funcionará en el lado de Android ahora.

Todos 12 comentarios

@FlashJonas recientemente hemos refactorizado por completo el complemento geolocator (versión 5.0.0) y me preguntaba si todavía experimenta este problema en la última versión.

@mvanbeusekom Confirmo que el problema aún existe en 5.0.0
acaba de descubrir su paquete a través de los cursos de AppBrewery.

Decidí seguir los documentos de los paquetes y agregué a mi archivo plist las 3 claves:

<key>NSLocationWhenInUseUsageDescription</key>
    <string>This app needs access to location when open.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>This app needs access to location when in the background.</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>This app needs access to location when open and in the background.</string>

Primera llamada a

Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);

pedir permiso al usuario (con 3 opciones):
image

Si presiono "solo mientras uso la aplicación", el terminal registra lo siguiente:

[VERBOSE-2: ui_dart_state.cc (148)] Excepción no controlada: PlatformException (PERMISSION_DENIED, acceso denegado a los datos de ubicación, nulo)

0 Geolocator._handleInvalidPermissions (paquete: geolocator / geolocator.dart: 191: 7)

1 Geolocator.getCurrentPosition (paquete: geolocator / geolocator.dart: 102: 7)

2 _LoadingScreenState.getLocation (paquete: clima / screen / loading_screen.dart: 13:10)

3 _LoadingScreenState.build.(paquete: clima / pantallas / loading_screen.dart: 23: 13)

4 _InkResponseState._handleTap (paquete: flutter / src / material / ink_well.dart: 511: 14)

5 _InkResponseState.build.(paquete: flutter / src / material / ink_well.dart: 566: 30)

6 GestureRecognizer.invokeCallback (paquete: flutter / src / gestures / Recognizer.dart: 166: 24)

7 TapGestureRecognizer._checkUp (paquete: flutter / src / gestures / tap.dart: 240: 9)

8 TapGestureRecognizer.handlePrimaryPointer (paquete: flutter / src / gestures / tap.dart: 177: 9)

9 <…>

La segunda pulsación está bien y la posición se registra sin problemas:

aleteo: Lat: 37.785834, Long: -122.406417

Codigo:
image

Todavía tengo el mismo problema en mi iPhone 5s, 12.2, usando geolocator 5.1.2.
* editar (desarrollo de Flutter Channel, v1.8.4)

// Called after closing welcome alert
Future getFirstLocation() async {
    Position position;
    try {
      position = await Geolocator()
          .getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    } catch (error) {
      print("getfirstlocation error 1");
      try {
        position = await Geolocator()
            .getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
      } catch (error) {
        print("error in geolocation $error");
      }
    }

    print("getfirstlocation position: $position");

    if (position != null) {
     // send to database
    }
  }

Registros de la ejecución del código anterior:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy

Me enfrento al mismo error:
Android (Oneplus 2) - Android 8.1.0 - Geolocalizador 5.1.2
(Se concede permiso de ubicación)

2019-08-15 16:54:22.606 926-1110/system_process E/InputDispatcher: channel '569829a de.paschke.coffeebreak/de.paschke.coffeebreak.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2019-08-15 16:54:56.808 14735-14766/? E/flutter: [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(PERMISSION_DENIED, Access to location data denied, null)
    #0      Geolocator._handleInvalidPermissions (package:geolocator/geolocator.dart:207:7)
    #1      Geolocator.getLastKnownPosition (package:geolocator/geolocator.dart:146:7)
    <asynchronous suspension>
    #2      LocationService.getLastKnownLocation (package:coffee_break/services/location_service.dart:24:51)
    <asynchronous suspension>
    #3      UserStoreBase.checkLastLocation (package:coffee_break/stores/user_store.dart:125:36)

Obtuve el mismo error cuando usé las tres cadenas de permisos. Si solo uso NSLocationWhenInUseUsageDescription, la aplicación volverá a funcionar. Mi mejor suposición es que cuando se usan los tres permisos, la aplicación se inicia y se solicita la ubicación antes de que se le solicite al usuario que la confirme. El comportamiento de la interfaz de usuario parece confirmarlo, pero es solo una suposición. De todos modos, si puede vivir solo con NSLocationWhenInUseUsageDescription, elimine los otros dos.

mismo problema :( en la última versión del canal estable de flutter.

este paquete apesta ...

Mismo error, última versión de flutter en Android 10.

¡Tengo el mismo problema!

Me pregunto si se va a abordar este problema, veo que tiene más de un año y la gente todavía lo enfrenta. Recientemente comencé a aprender Flutter y me encontré con el mismo problema, con exactamente los mismos pasos para reproducirlo.

Cuando selecciono la opción "Solo mientras uso la aplicación" en el indicador de iOS, obtengo una excepción en la consola de flutter, aunque la segunda vez que solicito la ubicación desde la aplicación obtengo los datos de ubicación correctos.

PD usando la última versión 5.3.2+2

Actualmente estoy trabajando en una solución para este y una lista de otros problemas (consulte el n. ° 430 para obtener más detalles). Sin embargo, será una actualización importante.

Actualmente, el lado de iOS está listo y funcionará en el lado de Android ahora.

Esto debería solucionarse en la versión 6.0.0

Puede que sea tarde para responder, pero también me enfrentaba al mismo problema en el que la aplicación no pedía permiso en iOS y funcionaba perfectamente bien en Android.

Debido a que no se solicitó permiso, es por eso que el código de permiso no funcionaba para iOS. Encontré un paquete llamado "location_permissions" que se puede usar para solicitar permiso manualmente.

Los pasos a seguir son los siguientes

  1. Agregue "location_permissions: 3.0.0 + 1" estas dependencias en "pubspec.yaml". Tenga en cuenta que hice eso para flutter 1.22.0, por lo que para flutter 2.0 esto podría ser un problema.
  2. Importar el paquete en el archivo

    importar ' paquete: location_permissions / location_permissions.dart ';

  3. Agregue el siguiente código en la página donde desea solicitar permiso. (Es mejor agregar eso en la primera página de su aplicación).

     <strong i="16">@override</strong>
      void initState() {
       ....
      if (Platform.isIOS) {
        location_permission();
      }
      ....
    

    }

  4. Agregue los siguientes dos métodos en el mismo archivo

    void location_permission () async {
    PermissionStatus final permiso = aguardar _getLocationPermission ();
    if (permiso == PermissionStatus.granted) {
    posición final = aguardar geolocator.getCurrentPosition (
    desireAccuracy: LocationAccuracy.best);

      // Use the position to do whatever...
    }
    

    }

    Futuro_getLocationPermission () async {
    PermissionStatus final permiso = aguardar LocationPermissions ()
    .checkPermissionStatus (nivel: LocationPermissionLevel.location);

    if (permission != PermissionStatus.granted) {
      final PermissionStatus permissionStatus = await LocationPermissions()
          .requestPermissions(
              permissionLevel: LocationPermissionLevel.location);
    
      return permissionStatus;
    } else {
      return permission;
    }
    

    }

Eso es todo, ahora debería aparecer una ventana emergente en la aplicación de iOS que solicitará el permiso de ubicación.

¿Fue útil esta página
0 / 5 - 0 calificaciones