Ios WKWebView赢得';不要打开外部链接

Ios WKWebView赢得';不要打开外部链接,ios,web,navigation,wkwebview,Ios,Web,Navigation,Wkwebview,因此,我正在将我的UIWebView应用程序转换为WKWebView,结果发现它无法打开外部网站,如dropbox、facebook等 它在viewDidLoad中加载我的站点,所以这不是问题 例如: NSURL *nsurl=[NSURL URLWithString:@"example.com"]; NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl]; [webView loadRequest:nsrequest]; web

因此,我正在将我的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中,我添加了:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionAllowsInsecureHTTPLoads</key>
    <true/>
    <key>NSIncludesSubdomains</key>
    <true/>
    <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
    <true/>
</dict>
NSAppTransportSecurity
NSAllowsArbitraryLoads
N异常低安全Http负载
n包括多个域
N第三方异常低安全Http负载
但什么都不管用。我做错了什么


我们将一如既往地感谢您的任何帮助。

好的,所以我设法得到了它,还有一些被遗忘的网站的帮助(对不起),我设法使它一切正常

下面是我在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);
    }
}

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

请检查此方法的返回类型

- (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并为您提供所需的显示页面。

以下是此答案的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)
}
func网络视图(webView:WKWebView,didStartProvisionalNavigation:WKNavigation){
UIApplication.shared.isNetworkActivityIndicatorVisible=true
打印(“didStartProvisionalNavigation:\(导航)”)
}
func webView(webView:WKWebView,DidReceiveServerRedirectFor临时导航导航:WKNavigation){
打印(“DidReceiveServerRedirectFor临时导航:\(导航)”)
}
func webView(webView:WKWebView,DIDFail临时导航:WKNavigation,withError错误:错误){
打印(“临时导航:\(导航),错误:\(错误)”)
}
func webView(webView:WKWebView,didFinishLoading导航:WKNavigation){
UIApplication.shared.isNetworkActivityIndicatorVisible=false
打印(“didFinishLoadingNavigation:\(导航)”)
}
func webViewWebProcessDidCrash(webView:WKWebView){
打印(“WebContent进程崩溃;重新加载”)
}
func webView(webView:WKWebView,createWebViewWith配置:WKWebViewConfiguration,用于导航操作:WKNavigationAction,windowFeatures:WKWindowFeatures)->WKWebView{
//如果标记不包含属性或为空,则navigationAction.targetFrame将返回nil
如果让trgFrm=navigationAction.targetFrame{
如果(!trgFrm.isMainFrame){
UIApplication.shared.isNetworkActivityIndicatorVisible=true
self.webView.load(navigationAction.request)
}
}
归零
}
func webView(webView:WKWebView,didfish导航:WKNavigation!){
UIApplication.shared.isNetworkActivityIndicatorVisible=false
打印(“didfish:\(字符串(描述:self.webView.url));仍然加载:\(self.webView.isLoading?“否”:“是”))
}
func webView(uwebview:WKWebView,decisionpolicyfornavigationresponse:WKNavigationResponse,decisionHandler:@escaping(WKNavigationResponsePolicy)->Void){
打印(“decidePolicyForNavigationResponse”)
决策处理程序(.allow)
}
func webView(uwebview:WKWebView,导航操作的决策策略:WKNavigationAction,决策处理程序:@escaping(uwkNavigationActionPolicy)->Void){
决策处理程序(.allow)
}