当我实现DecisionPolicyForNavigationAction委托methond时,Post请求在WKWebView中将无效

时间:2018-12-19 03:05:03

标签: ios post uiwebview wkwebview

我的系统版本是iOS 11.2.6,但我认为更高的版本具有相同的外观。 我像这样在wkwebview中发布了一个请求,效果很好

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url]];
    request.HTTPMethod = @"POST";
    request.HTTPBody = [postStr dataUsingEncoding:NSUTF8StringEncoding];

    WKWebView *webView = [[WKWebView alloc]initWithFrame:rectDown];
    webview.frame = self.view.frame;
    [webview loadRequest:request];
    [self.view addSubview:webview];

但是如果我像down那样实现了DecisionPolicyForNavigationAction委托方法,则nodejs服务器将无法接收任何发布数据

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

我想重用wkwebview对象,任何有好的主意吗?

另外,我发现当我第一次加载发布请求并重新加载然后再次重新加载时,它总是可以正常工作,但是如果我重用wkwebview加载任何其他url(如google),那么它将无法加载发布请求了。如果不实现委托define.PolicyForNavigationAction方法,它将始终正常运行。 那么,这是decisionPolicyForNavigationAction和重用wkwebview之间的冲突吗?

当删除wkwebview的控制器时,我使用此代码格式化重用wkwebview

-(void)webFormat{
    if (@available(iOS 9.0,*)) {
        NSSet *websiteDataTypes = [NSSet setWithObjects:WKWebsiteDataTypeDiskCache,
                                   WKWebsiteDataTypeOfflineWebApplicationCache,
                                   WKWebsiteDataTypeMemoryCache,
                                   nil];

//        NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
        NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];

        [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{

        }];
    }

    [self.configuration.userContentController removeScriptMessageHandlerForName:kScriptHandlerName];
    [self.configuration.userContentController removeAllUserScripts];

    [self stopLoading];
    [self loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 

    self.scrollView.delegate = nil;
    [self setUIDelegate:nil];

}

1 个答案:

答案 0 :(得分:0)

我通过添加代码来解决此问题

self.navigationDelegate = nil

在webFormat函数中。即使在运行webFormat函数时,self.navigationDelegate也已经为零;我认为当viewController移除时,作为wkwebview的navigationDelegate,它会在角落留下一些东西并影响webview的下一次加载。