Flutter-geolocator: Ошибка после утверждения в iOS: PlatformException (PERMISSION_DENIED, доступ к данным местоположения запрещен, null)

Созданный на 30 апр. 2019  ·  12Комментарии  ·  Источник: Baseflow/flutter-geolocator

🐛 Отчет об ошибке

  1. Код запрашивает позицию, пользователь утверждает, код выдает ошибку:
    PlatformException (PERMISSION_DENIED, доступ к данным о местоположении запрещен, null)

  2. Но после запроса позиции во второй раз правильная позиция немедленно возвращается без диалога или ошибок.

Ожидаемое поведение

Позиция возвращается, и при запросе позиции и утверждения пользователя ошибки не выдаются.

Шаги размножения

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

}

Конфигурация

Версия Flutter: "Channel dev, v1.5.8"
Версия геолокатора: ^ 4.0.2

Платформа:

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

Самый полезный комментарий

В настоящее время я работаю над исправлением этой и ряда других проблем (подробнее см. # 430). Однако это будет серьезное обновление.

На данный момент часть iOS готова и теперь будет работать на стороне Android.

Все 12 Комментарий

@FlashJonas недавно мы полностью реорганизовали плагин geolocator (версия 5.0.0), и мне было интересно, возникла ли у вас эта проблема в последней версии?

@mvanbeusekom Я подтверждаю, что проблема все еще существует в 5.0.0
только что обнаружил ваш пакет на курсах AppBrewery.

Я решил следовать документации пакетов и добавил в свой файл plist 3 ключа:

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

Первый звонок

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

запрашивать у пользователя разрешение (с 3 вариантами):
image

Если я нажимаю «только при использовании приложения», терминал регистрирует следующее:

[VERBOSE-2: ui_dart_state.cc (148)] Необработанное исключение: PlatformException (PERMISSION_DENIED, доступ к данным о местоположении запрещен, null)

0 Geolocator._handleInvalidPermissions (пакет: geolocator / geolocator.dart: 191: 7)

1 Geolocator.getCurrentPosition (пакет: geolocator / geolocator.dart: 102: 7)

2 _LoadingScreenState.getLocation (пакет: clima / screen / loading_screen.dart: 13: 10)

3 _LoadingScreenState.build.(пакет: clima / screen / loading_screen.dart: 23:13)

4 _InkResponseState._handleTap (пакет: flutter / src / material / ink_well.dart: 511: 14)

5 _InkResponseState.build.(пакет: flutter / src / material / ink_well.dart: 566: 30)

6 GestureRecognizer.invokeCallback (пакет: flutter / src / gestures / распознаватель.dart: 166: 24)

7 TapGestureRecognizer._checkUp (пакет: flutter / src / gestures / tap.dart: 240: 9)

8 TapGestureRecognizer.handlePrimaryPointer (пакет: flutter / src / gestures / tap.dart: 177: 9)

9 <…>

Второе нажатие нормально, и позиция регистрируется без проблем:

флаттер: широта: 37.785834, долгота: -122.406417

Код:
image

Все еще есть та же проблема на моем iPhone 5s, 12.2, с использованием геолокатора 5.1.2.
* редактировать (разработчик 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
    }
  }

Журналы выполнения вышеуказанного кода:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy

У меня такая же ошибка:
Android (Oneplus 2) - Android 8.1.0 - Геолокатор 5.1.2
(Разрешение на местоположение предоставлено)

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)

Я получил ту же ошибку при использовании всех трех строк разрешений. Если я использую только NSLocationWhenInUseUsageDescription, приложение снова работает. Я предполагаю, что при использовании всех трех разрешений приложение запускается и запрашивает местоположение, прежде чем пользователя попросят его подтвердить. Поведение пользовательского интерфейса, кажется, подтверждает это, но это всего лишь предположение. В любом случае, если вы можете жить только с NSLocationWhenInUseUsageDescription, удалите два других.

такая же проблема :( на последней версии стабильный канал флаттера.

этот пакет отстой ...

Та же ошибка, последняя версия флаттера на Android 10.

У меня такая же проблема!

Интересно, будет ли решаться эта проблема, я вижу, что ей больше года, и люди все еще сталкиваются с ней. Недавно я начал изучать Flutter и столкнулся с той же проблемой, но повторить ее нужно точно так же.

Когда я выбираю опцию «Только при использовании приложения» в приглашении iOS, я получаю исключение в консоли флаттера, даже если во второй раз, когда я запрашиваю местоположение из приложения, я получаю правильные данные о местоположении.

PS с использованием последней версии 5.3.2+2

В настоящее время я работаю над исправлением этой и ряда других проблем (подробнее см. # 430). Однако это будет серьезное обновление.

На данный момент часть iOS готова и теперь будет работать на стороне Android.

Это должно быть исправлено в версии 6.0.0.

Возможно, было поздно отвечать, но я также столкнулся с той же проблемой, когда приложение не запрашивало разрешение в iOS и отлично работало в Android.

Поскольку у него не спрашивали разрешения, поэтому код разрешения не работал для iOS. Я нашел пакет с именем «location_permissions», который можно использовать для запроса разрешения вручную.

Шаги, которые нужно сделать, следующие

  1. Добавьте "location_permissions: 3.0.0 + 1" эти зависимости в "pubspec.yaml". Обратите внимание, что я сделал это для flutter 1.22.0, поэтому для flutter 2.0 это может быть проблемой.
  2. Импортируйте пакет в файл

    import ' package: location_permissions / location_permissions.dart ';

  3. Добавьте следующий код на страницу, где вы хотите запросить разрешение. (Лучше добавить это на самой первой странице вашего приложения.)

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

    }

  4. Добавьте следующие два метода в один файл

    void location_permission () async {
    последнее разрешение PermissionStatus = ожидание _getLocationPermission ();
    if (разрешение == PermissionStatus.granted) {
    final position = await geolocator.getCurrentPosition (
    желаемая точность: LocationAccuracy.best);

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

    }

    Будущее_getLocationPermission () async {
    последнее разрешение PermissionStatus = ожидание LocationPermissions ()
    .checkPermissionStatus (уровень: LocationPermissionLevel.location);

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

    }

Вот и все, теперь вы должны получить всплывающее окно в приложении iOS, которое будет запрашивать разрешение местоположения.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги