美文网首页
WKWebView post无法提交参数的问题

WKWebView post无法提交参数的问题

作者: 耿杰 | 来源:发表于2019-04-10 10:07 被阅读0次

    1、正常流程

    • 1、无论是点击支付宝、还是微信支付,确认支付是点击不了的。
    无响应.gif
    2、chrome开发者模式
    • 1、以手机的模式运行,因为PC模式的话,界面、JS交互和请求对应的URL,有些不一样。


      image.png
    • 2、可以观察到确认支付的类名pay-but,在对应的js中,被添加了点击事件

      html
    js代码
    • 3、观察确认支付的点击事件,所做的事情,是把id为itemForm的表单进行submit。
    • 4、观察html中的form表单的元素
      • a、target的对应的是_blank
      • b、提交为post方法
      • c、请求的URL
      • d、请求的参数
    image.png
    3、分析流程
    0、设置webViewnavigationDelegate
    self.webView.navigationDelegate = self;
    
    1、WKWebView对于链接、请求包含__blank属性,是不会自动loadRequest的。所以有以下两种解决方法
    /**
     是否允许这个导航
     */
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
    {
        //如果是跳转一个新页面
        if (navigationAction.targetFrame == nil)
        {
            [webView loadRequest:navigationAction.request];
        }
    
        decisionHandler(WKNavigationActionPolicyAllow);
    }
    
    
    /**
     如果请求包含 target="__blank"的话,就会走这个代理
     */
    - (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
    {
        if (!navigationAction.targetFrame.isMainFrame)
        {
            [webView loadRequest:navigationAction.request];
        }
        return nil;
    }
    
    2、使用以上任一方法,DEBUG的时候,可以发现navigationAction.requestHTTPBodyHTTPBodyStream的值是为空的。
    image.png
    3、观察 WebKit源码可以发现, requestHTTPBodyrequestHTTPBodyStream被清空了。原因是:不通过 IPC发送HTTP Body的原因是想获得更好的性能
    image.png
    4、为了解决post提交不能带参数的问题和_blank的问题。 把post提交改为get提交,target对应的_blank移除掉。最终解决办法:在didFinishNavigation中,也就是网页加载完毕的时候,执行以下的JS。
    
    /* 网页导航加载完毕 */
    - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
    {
        [webView evaluateJavaScript:@"var a = document.getElementsByTagName('form');for(var i=0;i<a.length;i++){a[i].setAttribute('target','');a[i].setAttribute('method','get');}" completionHandler:^(NSString * _Nullable data, NSError * _Nullable error) {
            NSLog(@"error:%@", error);
        }];
        NSLog(@"navigation:%@", navigation);
    }
    
    
    • 5、最终gif图


      成功.gif

    相关文章

      网友评论

          本文标题:WKWebView post无法提交参数的问题

          本文链接:https://www.haomeiwen.com/subject/okpgiqtx.html