Как открыть пользовательский URL, такой как Apple TV "videos: //", в WKWebView с веб-страницы - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть приложение, которое полностью состоит из WKWebView, который подключается к веб-странице. На моей веб-странице есть кнопка, которая открывает приложение Apple TV. Это можно сделать в Safari на вашем iPhone, просто вставив «videos: //» для URL. Он откроет приложение AppleTV или предложит установить его.

Когда я пытаюсь сделать то же самое из моего приложения, использующего WKWebView, я получаю: "WKWebViewVC :: didFailProvisionalNavigation Code: -1002 Описание: неподдерживаемый URL"

Я не пытаюсь встроить приложение AppleTV в WKWebView, а просто открыть его и перейти к приложению AppleTV, так же, как если бы вы добавили "videos: //" в сафари.

Я много раз искал StackOverflow и Google и нашел информацию об использовании обработчика нестандартной схемы, но это не помогло с ошибкой. Даже если setURLSchemeHandler работал, я не уверен, что поместить в метод запуска обработчика пользовательской схемы.

webConfiguration.setURLSchemeHandler(CustomSchemeHandler(), forURLScheme: "videos://")

Ошибка, которую я получаю от setURLSchemeHandler: 'NSInvalidArgumentException', причина: '' videos: // 'не является допустимой схемой URL'

Если safari справится с этим, я уверен, что это можно сделать через WKWebView.

1 Ответ

0 голосов
/ 08 апреля 2019

Я понял это. Вам нужно использовать WKNavigationDelegate для WKWebView для обработки запроса на URL "videos: //". Вот метод, который проверяет, содержит ли мой запрос этот URL-адрес и, если это так, перенаправляет его в приложение AppleTV и не открывает его в WKWebView, который не может его обработать.

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

    if let requestUrlString = navigationAction.request.url?.absoluteString {
        if (requestUrlString.contains("videos://")) {
            if UIApplication.shared.canOpenURL(navigationAction.request.url!) {
                    UIApplication.shared.open(navigationAction.request.url!)
                    decisionHandler(.cancel)
                    return
            }
        }
    }
    decisionHandler(.allow)
}
...