Как запретить WKWebView неоднократно запрашивать разрешение на доступ к местоположению?

У меня есть WKWebView в моем приложении, и когда я начинаю просматривать www.google.com или любой другой веб-сайт, требующий службы определения местоположения, появляется всплывающее окно с запросом разрешения на доступ к местоположению устройства, даже если я уже принял поделитесь своим местоположением.

Единственное, что я сделал для управления этим местоположением, это то, что я добавил атрибут NSLocationWhenInUseUsageDescription в свой info.plist .

Я не мог найти ответы в Интернете, поэтому любая идея была бы очень оценена.

Оказывается, это довольно сложно, но возможно. Вы должны ввести код JavaScript, который перехватывает запросы на navigator.geolocation и переносит их в ваше приложение, а затем получает местоположение с помощью CLLocationManager , а затем вводит местоположение обратно в JavaScript.

Вот краткая схема:

  1. Добавьте WKUserScript в конфигурацию WKWebView которая переопределяет методы navigator.geolocation . Введенный JavaScript должен выглядеть так:

     navigator.geolocation.getCurrentPosition = function(success, error, options) { ... }; navigator.geolocation.watchPosition = function(success, error, options) { ... }; navigator.geolocation.clearWatch = function(id) { ... }; 
  2. С WKUserContentController.add(_:name:) добавьте обработчик сообщения сценария в ваш WKWebView . Вложенный JavaScript должен вызывать ваш обработчик следующим образом:

     window.webkit.messageHandlers.locationHandler.postMessage('getCurrentPosition'); 
  3. Когда веб-страница запрашивает местоположение, этот метод будет userContentController(_:didReceive:) поэтому ваше приложение будет знать, что веб-страница запрашивает местоположение. Найдите свое местоположение с помощью CLLocationManager как обычно.

  4. Теперь пришло время ввести местоположение обратно к запрашивающему JavaScript с помощью webView.evaluateJavaScript("didUpdateLocation({coords: {latitude:55.0, longitude:0.0}, timestamp: 1494481126215.0})") . Конечно, ваш введенный JavaScript должен иметь функцию didUpdateLocation готовую запустить сохраненный hanlder.

Довольно длинный алгоритм, но он работает!

  • WKWebView и NSURLProtocol не работают
  • Установить useragent в WKWebview
  • Как автомасштабировать содержимое WKWebView?
  • Как определить размер содержимого WKWebView?
  • WKProcessPool можно хранить на постоянной основе с помощью NSUserDefaults или что-то еще?
  • Какие типы файлов поддерживаются WKWebView?
  • Добавить заголовок запроса ко всем исходящим запросам в WKWebView
  • Входной файл HTML в приложении iOS, отключить опцию «взять фотографию»
  • Длительное нажатие приводит к ошибке / предупреждению, когда WKWebView пытается представить WKActionSheet
  • Можно ли использовать кеш между WKWebViews?
  • Получить текущее использование памяти WKWebView?
  • Interesting Posts

    Передача данных между контроллерами интерфейса в WatchKit

    Zbar SDK – отсутствует требуемая архитектура x86_64

    Я преобразовал CAF в формат AAC с помощью TPAACAudioConverter, но преобразованная длительность файла равна 0

    Как сделать расширение для нескольких классов Swift

    AFNetworking «Неопределенные символы для архитектуры i386» Ошибка

    Как избежать клавиш жесткого кодирования для шифрования (Objective C)?

    Запуск подпроцесса в iOS?

    Ссылка Branch.io для iOS не передает данные после установки, но работает для холодного запуска

    В чем разница между переменной swift и функцией при использовании закрытия в переменной?

    Пользовательская анимация для размотки segue при отмене нескольких шагов назад – проблемы и что это правильный способ сделать это?

    Растянуть фоновое изображение для UIButton

    NSDate сбой на симуляторах менее 5 с на версиях iOS 8.4 и 9.3

    Xcode 7 UI Test Order

    Как кэшировать AVPlayerItem (видео) для повторного использования в UITableview

    Добавление внутренней тени к вершине UIView

    Давайте будем гением компьютера.