Я опубликовал более подробный вопрос , чтобы попытаться разобраться в сути проблемы, но вкратце:
Я пытаюсь показать PHP / JS веб-приложение (Laravel) через WKWebView. Однако из-за характера свойств перенаправления скрипта единственный код, который я получил для фактического обнаружения изменения URL, - это #keyPath(WKWebView.url)
:
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
webView.uiDelegate = self
webView.addObserver(self, forKeyPath: #keyPath(WKWebView.url), options: .new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(WKWebView.url) {
print("URL Change:", self.webView.url?.absoluteString ?? "# No value provided")
}
}
Однако вывод на консоль всегда одинаков :
URL Change: # No value provided
Итак, я знаю, что KVO для WKWebView.url может запускать перенаправление на основе сценариев в WebView. На самом деле, если вы посмотрите на мой другой вопрос , это единственный код, который может обнаружить такое перенаправление - что странно, потому что при запуске в Safari (как iOS, так и macOS), Панель URL может отражать эти перенаправленные изменения в значении URL. Однако в WKWebView ни одна из функций WKNavigationDelegate не может обнаружить такое изменение URL-адреса.
Есть ли способ получить URL-адрес непосредственно из значения keyPath WKWebView.url при срабатывании? Существуют ли какие-либо альтернативы, не описанные в моем ранее упомянутом вопросе, которые могли бы получить URL?
При попытке получить значение URL из webView.url
, кажется, всегда возвращается ноль.
РЕДАКТИРОВАТЬ: Я могу получить точное значение URL с помощью кода функции ObserverValue:
if let key = change?[NSKeyValueChangeKey.newKey] {
print("URL: \(key)") // url value
}
Однако я не могу преобразовать его как строку или передать его другой функции в противном случае. Есть ли способ установить этот ключ как переменную, если он .contains ("https: //")?