2015-12-22 96 views
3

於是我就在了我的轉化應用的UIWebView來WKWebView的過程中才發現,它不會打開外部網站,即Dropbox的,臉譜等WKWebView不會打開外部鏈接

它加載我站點在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我說:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
    <key>NSExceptionAllowsInsecureHTTPLoads</key> 
    <true/> 
    <key>NSIncludesSubdomains</key> 
    <true/> 
    <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
    <true/> 
</dict> 

然而沒有任何工作。我究竟做錯了什麼?

任何幫助將始終不勝感激。

回答

7

好吧所以我設法得到它,以及從一些被遺忘的網站的一些幫助(對不起)我設法讓它工作。

所以下面幾乎是我在我的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], ([email protected]"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); 
    } 
} 

所以我幫助所有這些幫助某人。

0

皮斯檢查此方法的返回類型,

- (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,如果返回的網頁視圖,它會加載的URL,你,給你想要的頁面顯示。

1

這裏是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 <a> 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) 
}