iOS11 WKWebView问题汇总

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

问题一描述:

iOS9和iOS10用WKWebView加载URL都没有问题,iOS11却是一片空白
可能是用了NSMutableURLRequest,iOS11貌似不支持NSMutableURLRequest,无论是用UIWebView还是WKWebView,都不支持NSMutableURLRequest

解决方法参考


  if #available(iOS 11, *) {
   let request = NSURLRequest.init(url: URL.init(string: urlStr)!)
   self.wkWebView.load(request as URLRequest)
  }else{
   let request = NSMutableURLRequest.init(url: URL.init(string: urlStr)!, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 60)
   request.httpMethod = "GET"
   request.httpBody = ("token=" + tokenValue()).data(using: String.Encoding.utf8)
   self.wkWebView.load(request as URLRequest)
  }

问题二描述:在用iPhone X 的模拟器进入Hybrid项目时,发现一进去就崩溃,崩溃信息少的可怜:

libc++abi.dylib: terminating with uncaught exception of type NSException

靠这玩意儿肯定是定位不出bug的,不过全局断点还是给出了一点信息:


- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
 NSString *requestString = navigationAction.request.URL.absoluteString;
 //对外链、拨号和跳转appstore做特殊处理
 UIApplication *app = [UIApplication sharedApplication];
 NSURL *url = [navigationAction.request URL];
 //电话
 //此处省略若干业务代码
 if ([url.absoluteString containsString:@"itunes.apple.com"])
 {
  if ([app canOpenURL:url])
  {
   [app openURL:url];
   decisionHandler(WKNavigationActionPolicyCancel);
  }
 }
 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);//崩在这里
}

仍然不知道为啥子崩在这儿?之前一直是没问题的啊??

小Tips:
为了获取一些堆栈信息以便于快准狠的定位问题,可以在main函数里:


int main(int argc, char * argv[]) {
 @try {
  @autoreleasepool
  {
   return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
 }
 @catch (NSException* exception)
 {
  NSDebugLog(@"Exception=%@nStack Trace:%@", exception, [exception callStackSymbols]);
 }
}

最终得到一条关键报错:


Completion handler passed to -[WKPrivateNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:] was called more than once