iOS11 WKWebView问题汇总

2020-01-21 02:38:15刘景俊

意思就是WKWebView的这个代理方法被多次调用了。


if ([requestString hasPrefix:@"easy-js:"]) {
  [self handleRequestString:requestString webView:(EasyJSWebView *)webView.superview];
  decisionHandler(WKNavigationActionPolicyCancel);
 }
 if ([self.realDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)])
 {
  [self.realDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];
 }
 decisionHandler(WKNavigationActionPolicyAllow);//崩在这里

简单分析一下被多次调用的原因:

1、系统判断这个方法被多次执行,主要是看decisionHandler()是否被多次执行;
2、由于if判断里会执行decisionHandler(),最后一行代码也会执行decisionHandler(),并且self.realDelegate中也会执行decisionHandler(),这就导致了decisionHandler()这个handler可能会被多次执行。
那解决问题的方向就是修改代码保证WKWebView单次LoadRequest只调一次此代理方法~

修改如下:


 if ([requestString hasPrefix:@"easy-js:"]) {
  [self handleRequestString:requestString webView:(EasyJSWebView *)webView.superview];
  decisionHandler(WKNavigationActionPolicyCancel);
 }
 else if ([self.realDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)])
 {
  [self.realDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];
 } else {
  decisionHandler(WKNavigationActionPolicyAllow);
 }

即保证了单次LoadRequest只执行一次decisionHandler()

问题三描述:iOS11 WKWebview获取高度不准确

遇见这个问题的时候,我发现偏离了大概64像素,由此联想到了tableView和collectionView。
故解决办法如下:


if (@available(iOS 11.0, *)) {
  _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  _webView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
  _webView.scrollView.scrollIndicatorInsets = _webView.scrollView.contentInset;
 }

 


注:相关教程知识阅读请移步到IOS开发频道。