J'ai une UIWebView très simple avec le contenu de mon bundle d'application. Je souhaite que tous les liens de la vue Web s'ouvrent dans Safari plutôt que dans la vue Web. Est-ce possible?
ios
uiwebview
mobile-safari
David Beck
la source
la source
Réponses:
Ajoutez ceci au délégué UIWebView:
(modifié pour vérifier le type de navigation. vous pouvez également transmettre des
file://
demandes qui seraient des liens relatifs)Version rapide:
Version Swift 3:
Version Swift 4:
Mettre à jour
Comme il
openURL
est déconseillé dans iOS 10:la source
switch
est préférable pour les types d'énumérationSi quelqu'un se demande, la solution de Drawnonward ressemblerait à ceci dans Swift :
la source
UIWebViewDelegate
Un petit commentaire sur la réponse de user306253: attention à cela, lorsque vous essayez de charger quelque chose dans UIWebView vous-même (c'est-à-dire même à partir du code), cette méthode empêchera que cela se produise.
Ce que vous pouvez faire pour éviter cela (merci Wade), c'est:
Vous pouvez également gérer les types
UIWebViewNavigationTypeFormSubmitted
etUIWebViewNavigationTypeFormResubmitted
.la source
Les autres réponses ont un problème: elles dépendent de l'action que vous effectuez et non du lien lui-même pour décider de le charger dans Safari ou dans la vue Web.
Maintenant, parfois, c'est exactement ce que vous voulez, ce qui est bien; mais d'autres fois, surtout si vous avez des liens d'ancrage dans votre page, vous voulez vraiment n'ouvrir que des liens externes dans Safari, et pas des liens internes. Dans ce cas, vous devez vérifier la
URL.host
propriété de votre demande.J'utilise ce morceau de code pour vérifier si j'ai un nom d'hôte dans l'URL en cours d'analyse, ou s'il est incorporé en html:
Vous pouvez bien sûr adapter l'expression régulière à vos besoins.
la source
if (request.URL?.scheme != "file")
Dans Swift, vous pouvez utiliser le code suivant:
Assurez-vous de vérifier la valeur de l'URL et le navigationType.
la source
Voici l'équivalent Xamarin iOS de la réponse de drawonward.
la source
La réponse acceptée ne fonctionne pas.
Si votre page charge des URL via Javascript, ce
navigationType
sera le casUIWebViewNavigationTypeOther
. Ce qui, malheureusement, inclut également des chargements de page d'arrière-plan tels que l'analyse.Pour détecter la navigation dans les pages, vous devez comparer le
[request URL]
à[request mainDocumentURL]
.Cette solution fonctionnera dans tous les cas:
la source
Rejet de l'application Remarque:
Enfin
UIWbView
est mort et Apple ne l'acceptera plus.Apple a commencé à envoyer des e-mails à tous les propriétaires d'applications qui utilisent toujours
UIWebView
:Utilisation d'API obsolète - Apple cessera d'accepter les soumissions d'applications utilisant des
UIWebView
API.Apple prend la confidentialité des utilisateurs très au sérieux et il est évident qu'ils n'autoriseront pas la visualisation Web non sécurisée .
Supprimez donc UIWebView de votre application dès que possible. ne pas utiliser essayer d'utiliser
UIWebView
dans une nouvelle application créée et je préfère utiliserWKWebView
si possibleExemple:
la source
Dans mon cas, je veux m'assurer qu'absolument tout dans la vue Web ouvre Safari sauf la charge initiale et donc j'utilise ...
la source