Открытие внешних ссылок в WKWebView (не извне) - PullRequest
0 голосов
/ 17 июня 2020

Мое приложение содержит HTML информационных страниц, открытых в WKWebView, содержащих несколько гиперссылок. Раньше они работали, но перестали работать с недавними выпусками iOS с сообщениями об ошибках, содержащими слова

Could not create sandbox extension
Connection to daemon was invalidated

Когда я применяю делегат WKNavigation со следующим кодом

extension InformationPageController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {
        var policy =  WKNavigationActionPolicy.allow
        if navigationAction.navigationType == .linkActivated {
            //  Neither of commented lines below works! 
            //  webView.load(navigationAction.request)
            //  webView.loadHTMLString(navigationAction.request.url!.absoluteString, baseURL: nil)
            UIApplication.shared.openURL(navigationAction.request.url!)
            policy = .cancel
        }
        decisionHandler(policy)
    }
}

, страницы становятся открываются во внешнем браузере, но не внутри приложения.

Есть ли способ открывать ссылки, как раньше, в том же WKWebView?

1 Ответ

0 голосов
/ 17 июня 2020
  1. Похоже, что в настоящее время WKWebView принимает только протокол https. Если у вас просто http, WKWebView пожалуется на небезопасный протокол и не откроется.

После того, как я изменил http-s на https-s, страницы открылись, но не страницы AppStore. Это приводит к другой проблеме.

Когда URL-адрес начинается с https://apps.apple.com/..., iOS (но не macOS) перенаправляет его на itms-appss://apps.apple.com/... для открытия в приложении AppStore, в результате чего WKWebView выдает ошибку: Redirection to URL with a scheme that is not HTTP(S). Аналогичная проблема с URL-адресами mailto.

Чтобы обойти эти проблемы, я изменил код на следующий:

extension InformationPageController: WKNavigationDelegate {
    static let disallowedUrlPrefixes = ["https://apps.apple.com", "mailto:"]

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {

        var policy =  WKNavigationActionPolicy.allow

        if navigationAction.navigationType == .linkActivated,
            let url = navigationAction.request.url {
            let urlString = url.absoluteString
            if InformationPageController.disallowedUrlPrefixes.first(where:{urlString.starts(with: $0)}) != nil {
                UIApplication.shared.openURL(url)
                policy = .cancel
            }
        }

        decisionHandler(policy)
    }
}

Теперь «проблемные» страницы открываются с помощью внешнего браузера, все остальные открываются в WKWebView. К сожалению, это лучшее, что я могу сейчас придумать.

...