WKWebView в iOS: как я могу перехватить клик и получить связанный контент?

В WKWebView , когда пользователь нажимает ссылку, WKWebView к определенным типам файлов (например, файл VCF для контактов или файл ICS для событий календаря), я хотел бы перехватить ссылку, то есть отменить навигацию, а вместо этого отобразить содержимое с использованием специализированного контроллера просмотра.

Например, CNContactViewController может использоваться для отображения контактов, EKEventViewController может использоваться для отображения событий календаря.

Я могу перехватить клик, назначив WKNavigationDelegate и используя decidePolicyForNavigationAction :

 // Swift 2 extension MyController: WKNavigationDelegate { func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> ()) { let url = navigationAction.request.URL! if url.pathExtension == "ics" { decisionHandler(WKNavigationActionPolicy.Cancel) // TODO: download data // TODO: display with EKEventViewController } else if url.pathExtension == "vcf" { decisionHandler(WKNavigationActionPolicy.Cancel) // TODO: download data // TODO: display with CNContactViewController } else { decisionHandler(WKNavigationActionPolicy.Allow) } } } 

Но для того, чтобы отображать файлы специализированных контроллеров, мне нужно сначала загрузить данные с данного url .

Как я могу это сделать?

Поскольку для загрузки требуется аутентификация , для загрузки требуется совместное использование файлов cookie с помощью WKWebView или использование другого метода для совместного использования уже прошедшего проверку сеанса.

Если это помогает: у меня уже есть доступ к WKProcessPool веб-представления и WKWebViewConfiguration . Насколько я понимаю, файлы cookie каким-то образом привязаны к WKProcessPool . Но я не знаю, как использовать это для загрузки контента, например, с помощью NSURLSession .

Он чувствует себя взломанным, но я решил это, если WKWebView выполнил какой-нибудь javascript, который извлекает контент через ajax и возвращает его WKWebView в swift.

Задний план

WKWebView поддерживает вызов WKWebView , который передает результат javascript в WKWebView :

 func evaluateJavaScript(_ javaScriptString: String, completionHandler completionHandler: ((AnyObject?, NSError?) -> Void)?) 

Поскольку на стороне сервера есть jQuery , я использовал это для отправки запроса ajax, например, следующего. Но, конечно, это можно сделать и с ванильным javascript .

 (function(url) { var result = ''; $.ajax({ type: 'GET', url: url, success: function(r) {result = r}, failure: function() {result = null}, async: false }); return result })(url) 

url может быть передан в javascript со строковой интерполяцией Swift .

Расширить WKWebView

Чтобы легко использовать это, я расширил класс WKWebView .

 // Views/WKWebView.swift import WebKit extension WKWebView { func readUrlContent(url: NSURL, completionHandler: (result: String) -> Void) { self.evaluateJavaScript("(function() { var result = ''; $.ajax({type: 'GET', url: '\(url)', success: function(r) {result = r}, failure: function() {result = null}, async: false }); return result })()", completionHandler: { (response, error) -> Void in let result = response as! String completionHandler(result: result) }) } } 

Применение

Из примера вопроса это можно назвать следующим:

 let url = navigationAction.request.URL! if url.pathExtension == "ics" { decisionHandler(WKNavigationActionPolicy.Cancel) webView.readUrlContent(url) { (result: String) in print(result) // TODO: display with EKEventViewController } } 
  • WKWebView, прокрутка веб-страницы вверх
  • Варианты представления веб-сайта, когда веб-сайт / приложение поддерживает универсальные ссылки в iOS 9
  • Почему методы WKNavigationDelegate не вызываются на некоторых сайтах?
  • Очистка файлов cookie для WKWebView на iOS 8.4
  • Установить useragent в WKWebview
  • WKWebview не загружает стили CSS, когда html-код содержит символы Unicode
  • WKWebView не открывается НЕКОТОРЫЕ target = "_ blank" ссылки
  • Ссылки в WKWebView случайным образом не доступны для просмотра
  • Можно ли использовать indexedDB в приложении IOS кордовы?
  • Специальное меню длинных нажатий WKWebView работает, но с некоторыми серьезными проблемами
  • allowBackForwardNavigationGestures = true не работает в xcode 7.1
  • Давайте будем гением компьютера.