当我实现decisionPolicyForNavigationAction委托方法时,WKWebView中的Post请求将无效

Posted

技术标签:

【中文标题】当我实现decisionPolicyForNavigationAction委托方法时,WKWebView中的Post请求将无效【英文标题】:When I implement the decidePolicyForNavigationAction delegate methond,the Post request will be invalid in WKWebView 【发布时间】:2018-12-19 03:05:02 【问题描述】:

我的系统版本是 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 像谷歌然后它不能加载发布请求了.如果不实现委托decisionPolicyForNavigationAction方法,它总是可以正常工作。 那么,这是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】:

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

self.navigationDelegate = nil

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

【讨论】:

以上是关于当我实现decisionPolicyForNavigationAction委托方法时,WKWebView中的Post请求将无效的主要内容,如果未能解决你的问题,请参考以下文章

当我使用反应钩子实现选择任何复选框时,启用按钮有啥问题? [复制]

当我尝试实现身份验证时出现 Firebase.app() 错误

为啥当我使用hibernate时这个类应该实现java.io.Serializable?

当我尝试实现依赖字段时,Django select2没有找到结果

当我去声明/实现时,IntelliJ Rider 总是有两个相同的目标

当我使用 glBlitFramebuffer 实现 MSAA 时收到 INVALID OPERATION