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 em vez de na visualização da Web. Isso é possível?
ios
uiwebview
mobile-safari
David Beck
fonte
fonte
Respostas:
Adicione isso ao delegado UIWebView:
(editado para verificar o tipo de navegação. você também pode passar por
file://
solicitações que seriam links relativos)Versão rápida:
Versão Swift 3:
Versão Swift 4:
Atualizar
Como
openURL
foi preterido no iOS 10:fonte
switch
é preferível para tipos de enumSe alguém se perguntar, a solução de Drawnonward seria assim em Swift :
fonte
UIWebViewDelegate
Um comentário rápido à resposta do usuário306253: cuidado com isso, quando você tenta carregar algo no UIWebView por conta própria (ou seja, mesmo a partir do código), esse método impedirá que isso aconteça.
O que você pode fazer para evitar isso (obrigado Wade) é:
Você também pode querer lidar com os tipos
UIWebViewNavigationTypeFormSubmitted
eUIWebViewNavigationTypeFormResubmitted
.fonte
As outras respostas têm um problema: elas dependem da ação que você executa e não no próprio link para decidir se o carregam no Safari ou na visualização na web.
Agora, às vezes, é exatamente isso que você deseja, o que é bom; mas outras vezes, especialmente se você tiver links âncora em sua página, você deseja realmente abrir apenas links externos no Safari, e não internos. Nesse caso, você deve verificar a
URL.host
propriedade da sua solicitação.Eu uso esse trecho de código para verificar se tenho um nome de host na URL que está sendo analisada ou se ele está incorporado em html:
Obviamente, você pode adaptar a expressão regular para atender às suas necessidades.
fonte
if (request.URL?.scheme != "file")
No Swift, você pode usar o seguinte código:
Verifique o valor da URL e o navigationType.
fonte
Aqui está o equivalente do Xamarin iOS à resposta do drawonward.
fonte
A resposta aceita não funciona.
Se sua página carregar URLs via Javascript,
navigationType
seráUIWebViewNavigationTypeOther
. Que, infelizmente, também inclui carregamentos de páginas em segundo plano, como análises.Para detectar a navegação da página, você precisa comparar
[request URL]
com o[request mainDocumentURL]
.Esta solução funcionará em todos os casos:
fonte
Rejeição de aplicativo Nota:
Finalmente
UIWbView
está morto e a Apple não aceitará mais.A Apple começou a enviar e-mails para todo o proprietário do aplicativo que ainda está usando
UIWebView
:Uso preterido da API - a Apple deixará de aceitar envios de aplicativos que usam
UIWebView
APIs.A Apple leva a privacidade do usuário muito a sério e é óbvio que eles não permitirão visualizações inseguras da web .
Portanto, remova o UIWebView do seu aplicativo o mais rápido possível. não use tente usar
UIWebView
no novo aplicativo criado e eu prefiro usarWKWebView
se possívelExemplo:
fonte
No meu caso, quero garantir que absolutamente tudo na visualização da Web abra o Safari, exceto o carregamento inicial e, portanto, uso ...
fonte