WKWebView post无法提交参数的问题

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 儿时 你一针一针 将溢出屋顶的青烟拢起 织成人间烟火的丰盛 我是三月的风筝 你的目光如线 引我去的 都是无际的晴天...
    霁青青霁阅读 2,732评论 0 3
  • 呼……呼…… 凌晨两点半,又一次被阵阵巨大的的呼噜声所吵醒,直到现在为止,我试尽了所有我认为可行的方法进行入睡,但...
    奋斗中的少年高小攀攀阅读 3,146评论 0 0
  • 一场无过错的败诉 片花: 婚,离不了,民政局成被告 被告:民政局工会主席山军:...我们没有任何过错。。。。 证,...
    冯丽_5015阅读 3,214评论 0 0
  • 前言 轮子用多了,发现各种问题就想自己造轮子了,方便自己的同时还能让其他开发者使用。Android有两种存放lib...
    fengyongge阅读 4,249评论 0 1