Ссылки на приложение Itunes не работают с WkWebview - PullRequest
2 голосов
/ 07 ноября 2019

Одна из веб-страниц, которую я загружаю в Wkwebview, имеет следующую ссылку приложения iTunes

 https://itunes.apple.com/gb/app/xx-yy-zz/id435919263?mt=8

, когда она открыта, я получаю следующее предупреждение

enter image description here

и вот ошибка, которую я получил.

{
    "[errorCode]" = 0;
    "[errorDescription]" = "Redirection to URL with a scheme that is not HTTP(S)";
    "[errordetail]" = "Con:myappxxxx:myorder:webview:networkerror";
    "[localizedRecoverySuggestion]" = "";
    "[url]" = "itms-appss://apps.apple.com/gb/app/xx-yy-zz/id435919263";
}

Когда та же ссылка iTunes (https://itunes.apple.com/gb/app/xx-yy-zz/id435919263?mt=8) открывается в UIWebview, я увидел, что URL перенаправляетсяна следующий URL, и приложение открывается в appstore

 itms-appss://itunes.apple.com/gb/app/xx-yy-zz/id435919263?mt=8

Принимая во внимание, что в Wkwebview URL перенаправляется на следующий URL

 itms-appss://apps.apple.com/gb/app/xx-yy-zz/id435919263

Любая помощь приветствуется


Обновление

Я даже попытался выполнить произвольную загрузку в true для обеспечения безопасности транспорта, и проблема все еще существует.

Error Domain = Code = 0 "Перенаправление на URL со схемой, отличной от HTTP(S) "UserInfo = {_ WKRecoveryAttempterErrorKey =, NSErrorFailingURLStringKey = itms-appss: //apps.apple.com/gb/app/xx-yy-zz/id435919263, NSErrorFailingURLKey = itms-appss: //apps.apple.comgb / app / xx-yy-zz / id435919263, NSLocalizedDescription = Перенаправление на URL со схемойэто не HTTP (S)}

Ответы [ 3 ]

1 голос
/ 13 ноября 2019

Я думаю, что вы можете попытаться перехватить ссылку itunes в методах делегатов wkwebview и открыть URL с помощью openURL

Приведенный ниже исходный код откроет любые ссылки itms-appss в wkwebview. Не забудьте соответствовать WKNavigationDelegate

   - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    if ([webURL.scheme isEqualToString:@"itms-appss"])
        {
                UIApplication *app = [UIApplication sharedApplication];
    if ([app canOpenURL:webURL])
    {
        [self.webviewObj stopLoading];
        [app openURL:[NSURL URLWithString:[webURL absoluteString]]];
        decisionHandler(WKNavigationActionPolicyCancel);
     } else{
        decisionHandler(WKNavigationActionPolicyCancel);
       }
        }
    else
       {
            decisionHandler(WKNavigationActionPolicyAllow);
        }
     return;
    }
1 голос
/ 15 ноября 2019

WKWebView кажется по умолчанию не обрабатывать схемы URL, не относящиеся к http (s) . Таким образом, вы должны перехватить запрос, используя webView(_:decidePolicyFor:decisionHandler:), и проверить URL, который можно загрузить с помощью WKWebView. Если URL-адрес не является URL-адресом (http), то вы должны открыть URL-адрес на open(_:options:completionHandler:).

Вот пример кода.

Назначьтевигателегейт для вашего экземпляра WKWebView.

webView.navigationDelegate = self

Реализация метода WKNavigationDelegate.

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

    // if the url is not http(s) schema, then the UIApplication open the url
    if let url = navigationAction.request.url,
        !url.absoluteString.hasPrefix("http://"),
        !url.absoluteString.hasPrefix("https://"),
        UIApplication.shared.canOpenURL(url) {

        UIApplication.shared.open(url, options: [:], completionHandler: nil)
        // cancel the request
        decisionHandler(.cancel)
    } else {
        // allow the request
        decisionHandler(.allow)
    }
}
0 голосов
/ 08 ноября 2019

Попробуйте добавить в свой info.plist:

Транспорт для приложений Настройки безопасности - Разрешить произвольную загрузку = да

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
...