Flutter-geolocator: Fehler nach Genehmigung unter iOS: PlatformException (PERMISSION_DENIED, Zugriff auf Standortdaten verweigert, null)

Erstellt am 30. Apr. 2019  ·  12Kommentare  ·  Quelle: Baseflow/flutter-geolocator

🐛 Fehlerbericht

  1. Code fragt nach Position, Benutzer genehmigt, Code gibt einen Fehler aus:
    PlatformException (PERMISSION_DENIED, Zugriff auf Standortdaten verweigert, null)

  2. Nachdem Sie die Position ein zweites Mal angefordert haben, wird die richtige Position sofort ohne Dialog oder Fehler zurückgegeben.

Erwartetes Verhalten

Die Position wird zurückgegeben und es werden keine Fehler ausgegeben, wenn nach der Position und der Genehmigung durch den Benutzer gefragt wird.

Reproduktionsschritte

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

}

Aufbau

Flatterversion: "Channel dev, v1.5.8"
Geolocator-Version: ^ 4.0.2

Plattform:

  • [x]: iPhone: iOS
  • []: Roboter: Android
ios triage bug

Hilfreichster Kommentar

Ich arbeite derzeit an einer Lösung für dieses Problem und einer Liste anderer Probleme (siehe # 430 für weitere Details). Es wird jedoch ein großes Update sein.

Derzeit ist die iOS-Seite bereit und wird jetzt auf der Android-Seite funktionieren.

Alle 12 Kommentare

@FlashJonas Vor kurzem haben wir das Plugin geolocator (Version 5.0.0) komplett überarbeitet und ich habe mich gefragt, ob dieses Problem in der neuesten Version noch auftritt.

@mvanbeusekom Ich bestätige, dass das Problem in 5.0.0 noch besteht
Ich habe Ihr Paket gerade durch AppBrewery-Kurse entdeckt.

Ich entschied mich, den Paketdokumenten zu folgen und fügte meiner Plist-Datei die 3 Schlüssel hinzu:

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

Erster Anruf bei

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

Fordern Sie den Benutzer zur Erlaubnis auf (mit 3 Auswahlmöglichkeiten):
image

Wenn ich "nur während der Nutzung der App" drücke, protokolliert das Terminal Folgendes:

[VERBOSE-2: ui_dart_state.cc (148)] Nicht behandelte Ausnahme: PlatformException (PERMISSION_DENIED, Zugriff auf Standortdaten verweigert, null)

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

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

2 _LoadingScreenState.getLocation (Paket: clima / screen / load_screen.dart: 13: 10)

3 _LoadingScreenState.build.(Paket: clima / screen / load_screen.dart: 23: 13)

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

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

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

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

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

9 <…>

Das zweite Drücken ist in Ordnung und die Position wird ohne Probleme protokolliert:

Flattern: Lat: 37.785834, Long: -122.406417

Code:
image

Habe immer noch das gleiche Problem auf meinem iPhone 5s, 12.2, mit Geolocator 5.1.2.
* edit (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
    }
  }

Protokolle vom Ausführen des obigen Codes:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy

Ich habe den gleichen Fehler:
Android (Oneplus 2) - Android 8.1.0 - Geolocator 5.1.2
(Standortgenehmigung wird erteilt)

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)

Ich habe den gleichen Fehler erhalten, wenn alle drei Berechtigungszeichenfolgen verwendet wurden. Wenn ich nur NSLocationWhenInUseUsageDescription verwende, funktioniert die App wieder. Ich gehe davon aus, dass bei Verwendung aller drei Berechtigungen die App gestartet wird und nach dem Speicherort gefragt wird, bevor der Benutzer aufgefordert wird, dies zu bestätigen. Das UI-Verhalten scheint es zu bestätigen, aber es ist nur eine Vermutung. Wenn Sie nur mit NSLocationWhenInUseUsageDescription leben können, entfernen Sie die beiden anderen.

gleiches Problem :( auf der letzten Version stabiler Flatterkanal.

Dieses Paket ist zum Kotzen ...

Gleicher Fehler, letzte Version von Flattern auf Android 10.

Ich habe das gleiche Problem!

Ich frage mich, ob dieses Problem behoben werden soll. Ich sehe, dass es mehr als ein Jahr alt ist und die Leute immer noch damit konfrontiert sind. Vor kurzem habe ich angefangen, Flutter zu lernen, und bin auf dasselbe Problem gestoßen, mit genau denselben Schritten, die reproduziert werden müssen.

Wenn ich an der iOS-Eingabeaufforderung die Option "Nur während der Verwendung der App" auswähle, wird in der Flatterkonsole eine Ausnahme angezeigt, auch wenn ich zum zweiten Mal in der App nach dem Standort frage, erhalte ich die richtigen Standortdaten.

PS mit der neuesten 5.3.2+2 Version

Ich arbeite derzeit an einer Lösung für dieses Problem und einer Liste anderer Probleme (siehe # 430 für weitere Details). Es wird jedoch ein großes Update sein.

Derzeit ist die iOS-Seite bereit und wird jetzt auf der Android-Seite funktionieren.

Dies sollte in Version 6.0.0 behoben sein

Es könnte spät sein zu antworten, aber ich hatte auch das gleiche Problem, bei dem die App in iOS nicht um Erlaubnis bat und in Android einwandfrei funktionierte.

Da nicht um Erlaubnis gebeten wurde, funktionierte der Erlaubniscode für iOS nicht. Ich habe ein Paket mit dem Namen "location_permissions" gefunden, mit dem manuell um Erlaubnis gebeten werden kann.

Die folgenden Schritte folgen

  1. Fügen Sie "location_permissions: 3.0.0 + 1" dieser Abhängigkeiten in "pubspec.yaml" hinzu. Bitte beachten Sie, dass ich dies für Flutter 1.22.0 getan habe, sodass dies für Flutter 2.0 ein Problem sein kann.
  2. Importieren Sie das Paket in die Datei

    ' package: location_permissions / location_permissions.dart ' importieren;

  3. Fügen Sie den folgenden Code auf der Seite hinzu, auf der Sie um Erlaubnis bitten möchten. (Fügen Sie dies besser auf der ersten Seite Ihrer App hinzu.)

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

    }}

  4. Fügen Sie die folgenden zwei Methoden in derselben Datei hinzu

    void location_permission () async {
    endgültige PermissionStatus-Berechtigung = warte auf _getLocationPermission ();
    if (Erlaubnis == PermissionStatus.granted) {
    Endposition = warte auf geolocator.getCurrentPosition (
    gewünschte Genauigkeit: LocationAccuracy.best);

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

    }}

    Zukunft_getLocationPermission () async {
    endgültige PermissionStatus-Berechtigung = warte auf LocationPermissions ()
    .checkPermissionStatus (Ebene: LocationPermissionLevel.location);

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

    }}

Jetzt sollten Sie ein Popup in der iOS-App erhalten, in dem Sie um die Erlaubnis zum Standort gebeten werden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen