ios - que - wkwebview uiwebview




Links abertos do UIWebView no Safari (6)

Eu tenho um UIWebView muito simples com conteúdo do meu pacote de aplicativos. Gostaria que todos os links na visualização da Web fossem abertos no Safari, e não na visualização da Web. Isso é possível?


Adicione isto ao delegado UIWebView:

(editado para verificar o tipo de navegação. você também pode passar pelo file:// pedidos que seriam links relativos)

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }

    return YES;
}

Versão rápida:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if navigationType == UIWebViewNavigationType.LinkClicked {
            UIApplication.sharedApplication().openURL(request.URL!)
            return false
        }
        return true
    }

Versão Swift 3:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.linkClicked {
        UIApplication.shared.openURL(request.url!)
        return false
    }
    return true
}

Versão Swift 4:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
    if navigationType == .linkClicked {
        if let url = request.url {
            UIApplication.shared.openURL(url)
        }
        return false
    }
    return true
}

Atualizar

Como o openURL foi descontinuado no iOS 10:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
        if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
            UIApplication *application = [UIApplication sharedApplication];
            [application openURL:[request URL] options:@{} completionHandler:nil];
            return NO;
        }

        return YES;
}

Aqui está o equivalente Xamarin para iOS da resposta do drawonward.

class WebviewDelegate : UIWebViewDelegate {
    public override bool ShouldStartLoad (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) {
        if (navigationType == UIWebViewNavigationType.LinkClicked) {
            UIApplication.SharedApplication.OpenUrl (request.Url);
            return false;
        }
        return true;
    }
}

No Swift, você pode usar o seguinte código:

extension YourViewController : UIWebViewDelegate {
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if let url = request.URL where navigationType == UIWebViewNavigationType.LinkClicked {
            UIApplication.sharedApplication().openURL(url)
            return false
        }
        return true
    }
}

Certifique-se de verificar o valor da URL e o navigationType.


No meu caso, quero ter certeza de que absolutamente tudo na visualização da Web abre o Safari, exceto a carga inicial e, portanto, eu uso ...

- (BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
     if(inType != UIWebViewNavigationTypeOther) {
        [[UIApplication sharedApplication] openURL:[inRequest URL]];
        return NO;
     }
     return YES;
}

Um comentário rápido para resposta do user306253: cuidado com isso, quando você tenta carregar algo no UIWebView mesmo (ou seja, mesmo a partir do código), este método irá impedir que isso aconteça.

O que você pode fazer para evitar isso (obrigado Wade) é:

if (inType == UIWebViewNavigationTypeLinkClicked) {
    [[UIApplication sharedApplication] openURL:[inRequest URL]];
    return NO;
}

return YES;

Você também pode querer manipular os tipos UIWebViewNavigationTypeFormResubmitted e UIWebViewNavigationTypeFormResubmitted .


A resposta aceita não funciona.

Se sua página carregar URLs por meio de Javascript, o navigationType será UIWebViewNavigationTypeOther . Que, infelizmente, também inclui carregamentos de páginas em segundo plano, como análises.

Para detectar a navegação de páginas, você precisa comparar o [request URL] com o [request mainDocumentURL] .

Esta solução funcionará em todos os casos:

- (BOOL)webView:(UIWebView *)view shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)type
{
    if ([[request URL] isEqual:[request mainDocumentURL]])
    {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    else
    {       
        return YES;
    }
}




mobile-safari