- 测试链接: https://touch.10086.cn/i/mobile/rechargecredit.html?WT.mc_id=1701_CTCZMO591&msisdn=15059170828&token=&ostype=iOS×tamp=20190409113116,并且前端html不可能修改的情况下。我们需要在客户端可以做什么事情 。
- 只记录解决问题的思路
1、正常流程
- 1、无论是点击支付宝、还是微信支付,确认支付是点击不了的。
2、chrome开发者模式
-
1、以手机的模式运行,因为PC模式的话,界面、JS交互和请求对应的URL,有些不一样。
image.png -
2、可以观察到确认支付的类名
htmlpay-but
,在对应的js中,被添加了点击事件
- 3、观察确认支付的点击事件,所做的事情,是把id为
itemForm
的表单进行submit。 - 4、观察html中的form表单的元素
- a、target的对应的是
_blank
- b、提交为post方法
- c、请求的URL
- d、请求的参数
- a、target的对应的是
3、分析流程
0、设置webView
的navigationDelegate
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.request
的HTTPBody
和HTTPBodyStream
的值是为空的。
image.png
3、观察 WebKit源码可以发现, requestHTTPBody
和requestHTTPBodyStream
被清空了。原因是:不通过 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
网友评论