Flutter iOS запрашивает разрешение на местоположение, ничего не запрашивая - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь запросить разрешение на определение местоположения в приложении, над которым я работаю. Он отлично работает на устройстве Android, но ничего не запрашивает на iOS. Целевая версия iOS - 11, а пакеты, которые я использую, - geolocator: ^5.3.1 и permission_handler: ^5.0.0+hotfix.5.

Вот мой код.

Вот моя служебная функция для запроса разрешения, если статус не granted.

Future<PermissionStatus> getDeviceLocationPermission() async {
 final PermissionStatus permissionStatus =
  await Permission.locationWhenInUse.status;

  if (permissionStatus != PermissionStatus.granted) {
    await Permission.locationWhenInUse.request();
  }

  return permissionStatus;
}

Вот моя служебная функция для сбора сведений о позиции.

Future<Position> getDeviceCurrentLocation(
    {@required PermissionStatus permissionStatus}) async {
  Position position;
  Geolocator geolocator = Geolocator()..forceAndroidLocationManager;

  if (permissionStatus == null) {
    return null;
  }

  if (permissionStatus == PermissionStatus.granted) {
    position = await geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
  }

  return position;
}

Вот как я получаю доступ к этим утилитам внутри виджета с отслеживанием состояния.

getDeviceLocationPermission().then((permissionStatus) {
      print(permissionStatus);
      getDeviceCurrentLocation(permissionStatus: permissionStatus)
          .then((position) {
        print(position);
      });
    });

Вот мои разрешения info.plist для службы определения местоположения.

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

На iOS устройство, он не запрашивает диалоговое окно с просьбой разрешить или запретить доступ, а также возвращает значение null.

Спросите, нужна ли какая-либо другая информация. Может кто-нибудь помочь мне с этим? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 17 мая 2020

Если вы хотите использовать геолокатор, вам не нужно разрешение permission_handler. потому что у геолокатора есть метод _getLocationPermission (), и этот метод получит разрешение на местоположение внутри. Кроме того, я обнаружил, что получение разрешения в симуляторе ios работает неправильно. вы также можете проверить эту проблему . так что вы можете упростить свой код следующим образом:

Future<Position> getDeviceCurrentLocation() async {
  Position position;
  Geolocator geolocator = Geolocator()..forceAndroidLocationManager;

  position = await geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);


  return position;
}

и

getDeviceCurrentLocation()
          .then((position) {
        print(position);
      });
0 голосов
/ 13 мая 2020

Я следил за вашим кодом, а также за тем, который они дали в пакете permission_handler. Запустили оба и воспроизвели проблему в своем коде.

Проблема может быть решена следующим образом. :

Создан общий список c значений разрешений.

List<Permission> lp = Permission.values;

Изменена функция getDeviceLocationPermission, как показано ниже:

Future<PermissionStatus> getDeviceLocationPermission() async {

    Permission _permission = lp.elementAt(5); // 5 = location in use permission

    // The following line then prompts the required alert dialog
    final PermissionStatus permissionStatus = await _permission.request(); 


    /* final PermissionStatus permissionStatus = await Permission.locationWhenInUse.status;

    if (permissionStatus != PermissionStatus.granted) {
      await Permission.locationWhenInUse.request();
    }*/

    return permissionStatus;
}

Примечание: приведенный выше минимальный код необходим для исправьте вашу проблему. В зависимости от ваших требований вы можете раскомментировать условие if.

На мой взгляд, лучший пакет для использования - это location package. Один пакет дает вам обработчик разрешений, а также latlongs, и код довольно прост. См. Ниже:

var location = new Location();
currentLocation = await location.getLocation(); // This prompts the dialog
// __If condition and all
debugPrint(currentLocation.latitude.toString());
...