Приложение iOS UIWebView открывает ссылку в Safari

У меня есть приложение для iOS, которое имеет только один вид, и это UIWebView (он открывает основной контент приложения). Я хотел бы, чтобы когда я щелкаю где-то (например, в строке таблицы), приложение открывает конкретную ссылку в браузере Safari, а не внутри UIWebView.

Это выполнимо без написания кода iOS и вместо этого заставить JavaScript открывать эту ссылку в самом Safari?

У меня есть этот код, но он совсем не помогает:

HTML-код

<tr class='link-to-pdf' data-href='www.example.com'>

Код JS:

 $(".link-to-pdf").click(function () {

            var a = document.createElement('a');
            a.setAttribute("href", this.getAttribute("data-href"));
            a.setAttribute("target", "_blank");

            var dispatch = document.createEvent("HTMLEvents");
            dispatch.initEvent("click", true, true);
            a.dispatchEvent(dispatch);

        });

2 ответа

В некоторых случаях вы можете указать все ссылки в вашем JavaScript, которые имеют target="_blank"и передайте их в window.open с параметром _system. Это будет работать как на iOS, так и на Android.

$(document).on('click', 'a[target="_blank"]', function(ev) {
  var url;

  ev.preventDefault();
  url = $(this).attr('href');
  window.open(url, '_system');
});

Или в вашем случае просто замените a.setAttribute("target", "_blank"); с a.setAttribute("target", "_system");

Это работало для меня в древнем проекте, но я не уверен, что он все еще работает (на iOS и Android)

Если приведенный выше ответ не работает для вас, вы можете исправить это способом iOS. Для этого вам необходимо реализовать webView:shouldStartLoadWithRequestUIWebViewDelegate Метод протокола, где проверить ваш URL.

 - (BOOL) webView: (UIWebView *) theWebView shouldStartLoadWithRequest:(NSURLRequest *) request navigationType: (UIWebViewNavigationType) navigationType
{
    NSURL *url = [request URL];
    // check URL in your if condition
    if (...) {
        //open URL in Safari
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    else
        return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
}

Существует ограничение с ответом выше, вам нужно реализовать механизм уведомления приложения ios из JQuery, возможный обходной путь обсуждается здесь: /questions/26505222/jquery-mobile-ne-zapuskaet-webviewdidstartload-i-webviewdidfinishload-posle-vyihoda-s-domashnej-stranitsyi-v-webview/26505247#26505247

Другие вопросы по тегам