Minha solução é cancelar a navegação e carregar a solicitação com loadRequest: novamente. Isso virá com o comportamento semelhante ao UIWebView, que sempre abre uma nova janela no quadro atual.
Implemente o WKUIDelegatedelegado e defina-o como _webview.uiDelegate. Em seguida, implemente:
Essa solução funcionou para mim. Não se esqueça de definir a UIDelegatepropriedade, já que este método é declarado em WKUIDelegatenot WKNavigationDelegate.
Taketo Sano
1
Ok, vejo que as pessoas querem usar o WKWebView assim. Implementei a possibilidade de abrir target = _blank-Links no mesmo WKWebView (como mostrado acima) em meu projeto github.com/sticksen/STKWebKitViewController .
stk
5
@ChristopherPickslay ao usar este método com o meu WKWebView o url do pedido está sempre em branco, então o webview direciona para uma página em branco, alguma ideia?
Jason Murray
1
Quando a solicitação '_blank' é enviada de um formulário com dados de postagem, acho que os dados de postagem serão perdidos !!! Qualquer ajuda? @Cloud Wu
Andrew
66
A resposta de @Cloud Xu é a resposta correta. Apenas para referência, aqui está em Swift:
// this handles target=_blank links by opening them in the same view
func webView(webView:WKWebView!, createWebViewWithConfiguration configuration:WKWebViewConfiguration!, forNavigationAction navigationAction:WKNavigationAction!, windowFeatures:WKWindowFeatures!)->WKWebView!{if navigationAction.targetFrame ==nil{
webView.loadRequest(navigationAction.request)}returnnil}
como você o escreveria se preferisse abri-lo no Safari? Além disso, o que preciso fazer referência no controlador de visualização para fazer isso funcionar?
Não é uma duplicata real. Existem diferenças na opcionalidade dos parâmetros que não estão em conformidade com o protocolo Swift 4.1 WKUIDelegate na resposta que você vinculou.
yakattack de
Olá, Quando estou carregando o WKWebview com o URL do Pinterest, não consigo abrir "Continuar com o Facebook". Agora posso clicar e obter as informações sobre "Continuar com o Google". Me ajude por favor.
Nrv
Estou enfrentando o mesmo problema com wkwebview; login e redirecionamento não funcionaram no meu aplicativo. Qualquer ajuda ?
Jamshed Alam
1
por favor, alguém pode me ajudar, eu designei o delegado uiDelegate para wkwebview, mas seu método de criar visualização da web com configuração não está sendo chamado
chetan panchal
25
Adicione-se como WKNavigationDelegate
_webView.navigationDelegate =self;
e implemente o seguinte código no retorno de chamada delegado decidePolicyForNavigationAction: decisionHandler:
-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler
{//this is a 'new window action' (aka target="_blank") > open this URL externally. If we´re doing nothing here, WKWebView will also just do nothing. Maybe this will change in a later stage of the iOS 8 Betaif(!navigationAction.targetFrame){
NSURL *url = navigationAction.request.URL;UIApplication*app =[UIApplication sharedApplication];if([app canOpenURL:url]){[app openURL:url];}}
decisionHandler(WKNavigationActionPolicyAllow);}
PS: Este código é do meu pequeno projeto STKWebKitViewController, que envolve uma IU utilizável em torno de WKWebView.
Ocorreu um erro de digitação. Um ponto está faltando entre WKNavigationActionPolicy e Permitir
frango
@stk Como posso saber se o UIApplication vai abrir um link no aplicativo Safari? Se for um link da Appstore - preciso abri-lo no aplicativo Appstore, mas se for uma página da web normal - preciso abri-lo no mesmo WKWebView stackoverflow.com/questions/29056854/…
BergP
1
@LeoKoppelkamm Não é um erro de digitação, mas é Objective-C e não Swift. ;)
Ayan Sengupta
1
Isso funciona para links, mas não parece detectar novas janelas abertas com JavaScript, ou seja,window.open(url, "_blank")
Crashalot
@Crashalot Você encontrou a solução para window.open?
Sam
14
Se você já definiu o WKWebView.navigationDelegate
WKWebView.navigationDelegate = self;
você só precisa implementar:
-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler
{
BOOL shouldLoad =[self shouldStartLoadWithRequest:navigationAction.request];// check the url if necessaryif(shouldLoad && navigationAction.targetFrame ==nil){// WKWebView ignores links that open in new window[webView loadRequest:navigationAction.request];}// always pass a policy to the decisionHandler
decisionHandler(shouldLoad ?WKNavigationActionPolicyAllow:WKNavigationActionPolicyCancel);}
dessa forma, você não precisa implementar o método WKUIDelegate.
Confirmo que o código Swift de Bill Weinman está correto. Mas preciso mencionar que você também precisa delegar o UIDelegate para que funcione, caso você seja novo no desenvolvimento de iOS como eu.
Algo assim:
self.webView?.UIDelegate=self
Portanto, há três lugares em que você precisa fazer alterações.
Digite seu código, é:self.webView.UIDelegate = self
Henrik Petterson
Não tenho certeza se está implícito, mas para que essa linha de código funcione no iOS 10, você ViewControllerprecisa herdar WKUIDelegate. ieclass ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate
ltrainpr
4
Você também pode enviar outro controlador de visualização ou abrir uma nova guia, etc:
É necessário definir vc.url? Não estou configurando e a visualização da web está sendo carregada corretamente. Além disso, na minha experiência, só vejo createWebViewWithConfigurationquando navigationAction.targetFrameé chamado nil. Você pode descrever um cenário em que isso não seja verdade?
Mason G. Zhwiti
@ MasonG.Zhwiti Eu estava usando ativamente WKWebViews para um projeto no outono passado, mas desde então não fiz nada com eles - então realmente não posso responder sua pergunta. No momento em que postei o acima, funcionou. Não consigo entender como isso funciona sem definir o vc.url embora.
David H
Acho que funciona sem, porque você está retornando a visualização da web que criou e, em seguida (estou supondo), o que quer que seja solicitado a você criar se encarrega de usar a visualização da web para carregar a URL em questão.
oi, depois de fazer o login com o facebook, como abrir a janela de compartilhamento do facebook de forma semelhante? Fiz login com a criação de novo wkwebview, agora o usuário está conectado. Agora, como controlar a janela de compartilhamento?
Como você pode ver, o que fazemos aqui é apenas abrir uma nova webViewcom a nova url e controlar a possibilidade de ser fechada, apenas se precisar que uma resposta dessa second webviewseja exibida na primeira.
Encontrei alguns problemas que não podem ser resolvidos apenas com o webView.load(navigationAction.request). Então, eu uso a criação de um novo webView para fazer e funciona bem.
**Use following function to create web view**
func initWebView(configuration:WKWebViewConfiguration){let webView =WKWebView(frame:UIScreen.main.bounds, configuration: configuration)
webView.uiDelegate =self
webView.navigationDelegate =self
view.addSubview(webView)self.webView = webView
}**InViewDidLoad:**if webView ==nil{ initWebView(configuration:WKWebViewConfiguration())}
webView?.load(url: url1)**WKUIDelegateMethod need to be implemented**
extension WebViewController:WKUIDelegate{
func webView(_ webView:WKWebView, createWebViewWith configuration:WKWebViewConfiguration,for navigationAction:WKNavigationAction, windowFeatures:WKWindowFeatures)->WKWebView?{// push new screen to the navigation controller when need to open url in another "tab"print("url:\(String(describing: navigationAction.request.url?.absoluteString))")iflet url = navigationAction.request.url, navigationAction.targetFrame ==nil{let viewController =WebViewController()
viewController.initWebView(configuration: configuration)
viewController.url1 = url
DispatchQueue.main.async{[weak self]inself?.navigationController?.pushViewController(viewController, animated:true)}return viewController.webView
}returnnil}}
extension WKWebView{
func load(url: URL){ load(URLRequest(url: url))}}
Respostas:
Minha solução é cancelar a navegação e carregar a solicitação com loadRequest: novamente. Isso virá com o comportamento semelhante ao UIWebView, que sempre abre uma nova janela no quadro atual.
Implemente o
WKUIDelegate
delegado e defina-o como_webview.uiDelegate
. Em seguida, implemente:fonte
UIDelegate
propriedade, já que este método é declarado emWKUIDelegate
notWKNavigationDelegate
.A resposta de @Cloud Xu é a resposta correta. Apenas para referência, aqui está em Swift:
fonte
Para usar a versão mais recente do Swift 4.2+
Estenda sua aula com WKUIDelegate
Definir delegado para webview
Implementar método de protocolo
fonte
Adicione-se como WKNavigationDelegate
e implemente o seguinte código no retorno de chamada delegado decidePolicyForNavigationAction: decisionHandler:
PS: Este código é do meu pequeno projeto
STKWebKitViewController
, que envolve uma IU utilizável em torno de WKWebView.fonte
window.open(url, "_blank")
Se você já definiu o WKWebView.navigationDelegate
WKWebView.navigationDelegate = self;
você só precisa implementar:
dessa forma, você não precisa implementar o método WKUIDelegate.
fonte
Nenhuma dessas soluções funcionou para mim, resolvi o problema ao:
1) Implementando WKUIDelegate
2) Definir o delegado UIDelegate do wkWebview
3) Implementação do método createWebViewWithConfiguration
fonte
Cloud xu
a resposta de resolve meu problema.Caso alguém precise da versão equivalente do Swift (4.x / 5.0), aqui está:
Claro que você tem que definir
webView.uiDelegate
primeiro.fonte
Confirmo que o código Swift de Bill Weinman está correto. Mas preciso mencionar que você também precisa delegar o UIDelegate para que funcione, caso você seja novo no desenvolvimento de iOS como eu.
Algo assim:
Portanto, há três lugares em que você precisa fazer alterações.
fonte
self.webView.UIDelegate = self
ViewController
precisa herdarWKUIDelegate
. ieclass ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate
Você também pode enviar outro controlador de visualização ou abrir uma nova guia, etc:
fonte
vc.url
? Não estou configurando e a visualização da web está sendo carregada corretamente. Além disso, na minha experiência, só vejocreateWebViewWithConfiguration
quandonavigationAction.targetFrame
é chamadonil
. Você pode descrever um cenário em que isso não seja verdade?Com base na resposta de allen huang
Detalhes
Alvos
target=“_blank”
push
ver controlador com webView se o controlador atual tivernavigationController
present
ver controlador com webView em todos os outros casosSolução
Amostra completa
adicione em sua configuração de segurança de transporte Info.plist
Storyboards
Versão 1
Versão 2
fonte
Isso funcionou para mim:
Como você pode ver, o que fazemos aqui é apenas abrir uma nova
webView
com a nova url e controlar a possibilidade de ser fechada, apenas se precisar que uma resposta dessasecond webview
seja exibida na primeira.fonte
Encontrei alguns problemas que não podem ser resolvidos apenas com o
webView.load(navigationAction.request)
. Então, eu uso a criação de um novo webView para fazer e funciona bem.fonte
fonte