Как запретить 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.

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

  • Скрыть конкретный DIV на веб-странице в WKWebview
  • Проблема WKWebView с прерывистым пустым экраном
  • Два WKWebViews используют локальное хранилище, но только после перезапуска
  • Настройка категории AVAudioSession не влияет на звук из WKWebView
  • Состояние WKWebView на Кордове iOS 9?
  • как я могу выполнить запрос манифеста с WKWebView
  • WKWebView в интерфейсе Builder
  • Как определить причину сбоя WKWebView
  • Вставить UIView в WKWebView?
  • WKWebView загружает ресурсы из локальной папки документа
  • WKWebView: попытка синхронного запроса javascript из основного потока
  • Давайте будем гением компьютера.