Flutter-geolocator: Erro após a aprovação no iOS: PlatformException (PERMISSION_DENIED, acesso aos dados de localização negado, nulo)

Criado em 30 abr. 2019  ·  12Comentários  ·  Fonte: Baseflow/flutter-geolocator

🐛 Relatório de Bug

  1. O código pede a posição, o usuário aprova, o código gera um erro:
    PlatformException (PERMISSION_DENIED, acesso aos dados de localização negado, nulo)

  2. Mas depois de solicitar a posição uma segunda vez, a posição correta é imediatamente retornada sem diálogo ou erros.

Comportamento esperado

A posição é retornada e nenhum erro é gerado ao solicitar a posição e a aprovação do usuário.

Etapas de reprodução

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

}

Configuração

Versão do Flutter: "Channel dev, v1.5.8"
Versão do Geolocator: ^ 4.0.2

Plataforma:

  • [x]: iphone: iOS
  • []: robô: Android
ios triage bug

Comentários muito úteis

Atualmente, estou trabalhando em uma correção para este e uma lista de outros problemas (consulte # 430, para obter mais detalhes). No entanto, será uma grande atualização.

Atualmente, o lado iOS está pronto e funcionará no lado Android agora.

Todos 12 comentários

@FlashJonas recentemente geolocator (versão 5.0.0) e eu gostaria de saber se você ainda enfrenta esse problema na versão mais recente?

@mvanbeusekom Eu confirmo que o problema ainda existe no 5.0.0
acabou de descobrir seu pacote por meio de cursos do AppBrewery.

Decidi seguir a documentação dos pacotes e adicionei ao meu arquivo plist as 3 chaves:

<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>

Primeira chamada para

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

solicitar permissão do usuário (com 3 opções):
image

Se eu pressionar "apenas durante o uso do aplicativo", o terminal registrará o seguinte:

[VERBOSE-2: ui_dart_state.cc (148)] Exceção não tratada: PlatformException (PERMISSION_DENIED, acesso a dados de localização negado, nulo)

0 Geolocator._handleInvalidPermissions (pacote: geolocator / geolocalização.dart: 191: 7)

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

2 _LoadingScreenState.getLocation (pacote: clima / telas / loading_screen.dart: 13: 10)

3 _LoadingScreenState.build.(pacote: clima / telas / loading_screen.dart: 23: 13)

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

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

6 GestureRecognizer.invokeCallback (pacote: flutter / src / gestures / reconhecizer.dart: 166: 24)

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

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

9 <…>

A segunda pressão está ok e a posição é registrada sem problemas:

vibração: Lat: 37,785834, Longo: -122,406417

Código:
image

Ainda tenho o mesmo problema no meu iPhone 5s, 12.2, usando o geolocalizador 5.1.2.
* editar (Flutter Channel dev, 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
    }
  }

Logs de execução do código acima:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy

Eu enfrento o mesmo erro:
Android (Oneplus 2) - Android 8.1.0 - Geolocator 5.1.2
(Permissão de localização é concedida)

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)

Recebi o mesmo erro quando usei todas as três strings de permissão. Se eu usar apenas NSLocationWhenInUseUsageDescription, o aplicativo estará funcionando novamente. Meu melhor palpite é que, ao usar todas as três permissões, o aplicativo é iniciado e solicita a localização antes de o usuário ser solicitado a confirmá-la. O comportamento da interface do usuário parece confirmar isso, mas é apenas um palpite. De qualquer forma, se você pode viver apenas com NSLocationWhenInUseUsageDescription, remova os outros dois.

mesmo problema :( no canal estável da última versão de vibração.

este pacote é uma merda ...

Mesmo erro, última versão do flutter no Android 10.

Eu tenho o mesmo problema!

Eu me pergunto se esse problema vai ser resolvido, vejo que tem mais de um ano e as pessoas ainda o enfrentam. Recentemente comecei a aprender Flutter e me deparei com o mesmo problema, com exatamente as mesmas etapas para reproduzir.

Quando seleciono a opção "Somente ao usar o aplicativo" no prompt do iOS, recebo uma exceção no console de vibração, mesmo que na segunda vez que solicite o local do aplicativo obtenho os dados de localização corretos.

PS usando a versão 5.3.2+2 recente

Atualmente, estou trabalhando em uma correção para este e uma lista de outros problemas (consulte # 430, para obter mais detalhes). No entanto, será uma grande atualização.

Atualmente, o lado iOS está pronto e funcionará no lado Android agora.

Isso deve ser corrigido na versão 6.0.0

Pode ser tarde para responder, mas eu também estava enfrentando o mesmo problema em que o aplicativo não estava pedindo permissão no iOS e estava funcionando perfeitamente no Android.

Porque não foi solicitada permissão, é por isso que o código de permissão não estava funcionando para iOS. Eu encontrei um pacote chamado "location_permissions" que pode ser usado para pedir permissão manualmente.

Os passos a seguir são os seguintes

  1. Adicione "location_permissions: 3.0.0 + 1" a estas dependências em "pubspec.yaml". Observe que fiz isso para o flutter 1.22.0, portanto, para o flutter 2.0, isso pode ser um problema.
  2. Importe o pacote no arquivo

    import ' package: location_permissions / location_permissions.dart ';

  3. Adicione o seguinte código na página onde deseja pedir permissão. (Melhor adicionar isso na primeira página do seu aplicativo.)

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

    }

  4. Adicione os dois métodos a seguir no mesmo arquivo

    void location_permission () async {
    permissão final PermissionStatus = await _getLocationPermission ();
    if (permission == PermissionStatus.granted) {
    posição final = espera geolocator.getCurrentPosition (
    desejadoAccuracy: LocationAccuracy.best);

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

    }

    Futuro_getLocationPermission () async {
    permissão final de PermissionStatus = espera LocationPermissions ()
    .checkPermissionStatus (nível: LocationPermissionLevel.location);

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

    }

É isso agora você deve obter um pop-up no aplicativo iOS que pedirá a permissão de localização.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

seakmengc picture seakmengc  ·  3Comentários

Sammius picture Sammius  ·  4Comentários

dark-chocolate picture dark-chocolate  ·  3Comentários

devalp-pro picture devalp-pro  ·  3Comentários

joesnarky picture joesnarky  ·  3Comentários