WKWebView不会打开外部链接

所以我正在将我的UIWebView应用程序转换为WKWebView只是为了发现它不会打开外部网站,即dropbox,facebook等。

它在viewDidLoad中加载我的网站,所以这不是问题。

例:

NSURL *nsurl=[NSURL URLWithString:@"example.com"]; NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl]; [webView loadRequest:nsrequest]; webView.navigationDelegate = self; webView.UIDelegate = self; [self.view addSubview:webView]; 

我打过电话:

 -(void)webView:(WKWebView *)webView didStartProvisionalNavigation: (WKNavigation *)navigation {} - (void)webView:(WKWebView *)webView didFinishNavigation: (WKNavigation *)navigation{} 

随着:

 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {} decisionHandler(WKNavigationActionPolicyAllow); 

最后在我的info.plist中我添加了:

 NSAppTransportSecurity  NSAllowsArbitraryLoads  NSExceptionAllowsInsecureHTTPLoads  NSIncludesSubdomains  NSThirdPartyExceptionAllowsInsecureHTTPLoads   

但没有任何作用。 我究竟做错了什么?

任何帮助都将一如既往地受到高度赞赏。

好吧所以我设法得到它,以及一些被遗忘的网站的一些帮助(抱歉)我设法让它全部工作。

所以下面几乎是我在webview中使用的所有内容。

 //Webview Start/Finish Request - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; NSLog(@"didStartProvisionalNavigation: %@", navigation); } - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation { NSLog(@"didReceiveServerRedirectForProvisionalNavigation: %@", navigation); } - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error { NSLog(@"didFailProvisionalNavigation: %@navigation, error: %@", navigation, error); } - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { NSLog(@"didCommitNavigation: %@", navigation); } - (void)webView:(WKWebView *)webView didFinishLoadingNavigation:(WKNavigation *)navigation { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; NSLog(@"didFinishLoadingNavigation: %@", navigation); } - (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { NSLog(@"didFailNavigation: %@, error %@", navigation, error); } - (void)_webViewWebProcessDidCrash:(WKWebView *)webView { NSLog(@"WebContent process crashed; reloading"); } - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { if (!navigationAction.targetFrame.isMainFrame) { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; [self.webView loadRequest:navigationAction.request]; } return nil; } - (void)webView:(WKWebView *)webView didFinishNavigation: (WKNavigation *)navigation{ [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; NSLog(@"didFinish: %@; stillLoading:%@", [self.webView URL], (self.webView.loading?@"NO":@"YES")); } - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { NSLog(@"decidePolicyForNavigationResponse"); decisionHandler(WKNavigationResponsePolicyAllow); } - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { if (decisionHandler) { decisionHandler(WKNavigationActionPolicyAllow); } } 

所以我帮助所有这些帮助某人。

这是这个答案的swift 3.0版本添加这两个代表

 // webView is WKWebview object webView.navigationDelegate = self; webView.uiDelegate = self; 

覆盖这些委托回调方法

  func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation) { UIApplication.shared.isNetworkActivityIndicatorVisible = true print("didStartProvisionalNavigation: \(navigation)") } func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation) { print("didReceiveServerRedirectForProvisionalNavigation: \(navigation)") } func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation, withError error: Error) { print("didFailProvisionalNavigation: \(navigation), error: \(error)") } func webView(_ webView: WKWebView, didFinishLoading navigation: WKNavigation) { UIApplication.shared.isNetworkActivityIndicatorVisible = false print("didFinishLoadingNavigation: \(navigation)") } func _webViewWebProcessDidCrash(_ webView: WKWebView) { print("WebContent process crashed; reloading") } func webView(_ webView: WKWebView,createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView?{ //if  tag does not contain attribute or has _blank then navigationAction.targetFrame will return nil if let trgFrm = navigationAction.targetFrame { if(!trgFrm.isMainFrame){ UIApplication.shared.isNetworkActivityIndicatorVisible = true self.webView.load(navigationAction.request) } } return nil } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!){ UIApplication.shared.isNetworkActivityIndicatorVisible = false print("didFinish: \(String(describing: self.webView.url)); stillLoading:\(self.webView.isLoading ? "NO" : "YES")") } func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (_: WKNavigationResponsePolicy) -> Void) { print("decidePolicyForNavigationResponse") decisionHandler(.allow) } func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (_: WKNavigationActionPolicy) -> Void) { decisionHandler(.allow) } 

Pease检查此方法的返回类型,

 - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { if (!navigationAction.targetFrame.isMainFrame) { [self.webView loadRequest:navigationAction.request]; } return self.webView; } 

由于它是WKWebView,如果您返回webview,它将为您加载URL并为您提供要显示的所需页面。