iOS11 WKWebView问题汇总

问题一描述:

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

意思就是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;
 }

您可能感兴趣的文章:

  • Swift使用WKWebView在iOS应用中调用Web的方法详解
  • ios下OC与JS交互之WKWebView
  • 浅谈WKWebView 在64位设备上的白屏问题
  • 清除WKWebView cookies的方法
  • IOS中UIWebView、WKWebView之JS交互
  • iOS11 WKWebView内容过滤规则详解
  • iOS开发之WKWebViewJavascriptBridge Xcode9中导致crash的解决
  • iOS中WKWebView白屏问题的分析与解决
(0)

相关推荐

  • Swift使用WKWebView在iOS应用中调用Web的方法详解

    自从iOS8开始,Apple引入了WKWebView欲代替UIWebView.相比而言,WKWebView消耗内从更少,功能也更加强大.让我们来看看WKWebView怎么使用吧! 0.初始化 (1)首先需要引入WebKit库 复制代码 代码如下: #import <WebKit/WebKit.h> (2)初始化方法分为以下两种 复制代码 代码如下: // 默认初始化 - (instancetype)initWithFrame:(CGRect)frame; // 根据对webview的相关配置,

  • 浅谈WKWebView 在64位设备上的白屏问题

    WKWebView 问题 32 位的app在使用WKWebView的时候,如果运行在64位的设备上,会出现一下问题: (1)iOS8.1 系统,部分网页加载白屏,例如 百度,iOS8.3 似乎没问题 (2)web输入框输入汉字也会出现白屏 通过搜索得到问题根源: WKWebView's WebProcess runs out-of-process as a 64-bit process on hardware supporting 64bit. There is a 32bit/64bit ma

  • iOS中WKWebView白屏问题的分析与解决

    前言 随着WKWebView的推出, 解决了很多UIWebView 的问题.比如加载速度慢,内存泄露等问题.WKWebView是在iOS 8 推出,前段时间正好把项目也适配到iOS 8 以上了,终于可以把项目中的UIWebView 替换成WKWebView. WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷新频率(不卡) 但是发现在使用的时候还是有很

  • IOS中UIWebView、WKWebView之JS交互

    做客户端开发,肯定避免不了JS交互,于是自己对苹果接口做了个简易封装: JSExport-->UIWebView+Interaction.WKScriptMessageHandler -->WKWebView+Interaction以备以后使用. 代码非常简洁,见这里:https://github.com/V5zhou/JSInteraction.git 旧方式 旧的交互方式有通过UIWebViewDelegate实现的:JS与客户端定义好跳转页面参数,在将要跳转时捕获关键字,然后处理业务.

  • iOS开发之WKWebViewJavascriptBridge Xcode9中导致crash的解决

    前言 本文主要给大家介绍了关于iOS WKWebViewJavascriptBridge Xcode9中导致crash的相关解决办法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. WKWebViewJavascriptBridge 这个第三方还是比较不错的,但是最近Xcode9上,却出现了crash:WKWebViewJavascriptBridge官方github看了大家也都有如此问题,最后终于解决了: 需要在WKWebViewJavascriptBridge类里,如下修改

  • iOS11 WKWebView内容过滤规则详解

    WKWebView中新增了一个功能,可以对WebView的内容添加一些自定义的过滤规则.这个功能原来在 Safari Extension 中被引入,从 11 开始同样适用于WKWebView. 使用方法 原理上就是提供一个 JSON 给 WebKit,这个 JSON 包括内容的触发规则(trigger)和对应的处理方式(action).比如: [{ "trigger": { "url-filter": ".*" }, "action&q

  • 清除WKWebView cookies的方法

    在UIWebView下,可以使用 [[NSURLCache sharedURLCache] removeAllCachedResponses];//清除缓存 WKWebView清除cookies的方法(iOS9以上) WKWebsiteDataStore *dateStore = [WKWebsiteDataStore defaultDataStore]; [dateStore fetchDataRecordsOfTypes:[WKWebsiteDataStore allWebsiteDataT

  • ios下OC与JS交互之WKWebView

    上一篇文章我们使用了JavaScriptCore框架重写了之前的示例,iOS8苹果偏爱HTML5,重构了UIWebVIew,给我们带来了WKWebView,使其性能.稳定性.功能大幅度提升,也更好的支持了HTML5的新特性.这篇文章就们就拿WKWebView来小试牛刀 一.WKWebView Framework WKWebView的14个类与3个协议: WKBackForwardList: 之前访问过的 web 页面的列表,可以通过后退和前进动作来访问到. WKBackForwardListIt

  • iOS11 WKWebView问题汇总

    问题一描述: iOS9和iOS10用WKWebView加载URL都没有问题,iOS11却是一片空白 可能是用了NSMutableURLRequest,iOS11貌似不支持NSMutableURLRequest,无论是用UIWebView还是WKWebView,都不支持NSMutableURLRequest 解决方法参考 if #available(iOS 11, *) { let request = NSURLRequest.init(url: URL.init(string: urlStr)!

  • iOS11 WKWebView 无法加载内容的解决方法

    问题描述: iOS9和iOS10用WKWebView加载URL都没有问题,iOS11却是一片空白 可能是用了 NSMutableURLRequest ,iOS11貌似不支持 NSMutableURLRequest ,无论是用 UIWebView 还是 WKWebView ,都不支持 NSMutableURLRequest 解决方法参考 if #available(iOS 11, *) { let request = NSURLRequest.init(url: URL.init(string:

  • ios wkwebview离线化加载h5资源解决方案

    思路: 使用NSURLProtocol拦截请求转发到本地. 1.确认离线化需求 部门负责的app有一部分使用的线上h5页,长期以来加载略慢... 于是考虑使用离线化加载. 确保[低速网络]或[无网络]可网页秒开. 2.使用[NSURLProtocol]拦截 区别于uiwebview wkwebview使用如下方法拦截 @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [su

  • iOS WKWebView适配实战篇

    一.Cookie适配 1.现状 WKWebView适配中最麻烦的就是cookie同步问题 WKWebView采用了独立存储控件,因此和以往的UIWebView并不互通 虽然iOS11以后,iOS开放了WKHTTPCookieStore让开发者去同步,但是还是需要考虑低版本的 同步问题,本章节从各个角度切入考虑cookie同步问题 2.同步cookie(NSHTTPCookieStorage->WKHTTPCookieStore) iOS11+ 可以直接使用WKHTTPCookieStore遍历方

  • iOS11 SectionHeader 胡乱移动且滑动时出现重复内容的解决方法

    升级到iOS 11后,痛苦的事情多起来了,以前版本没有的出现问题的代码,经过Xcode 9一编译,千万草泥马奔腾而过: 今天碰到一个奇葩问题,直接进入主题: 问题描述: -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 12; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderIn

  • 软件测试方法大汇总

    软件测试方法大汇总 软件测试方法种类繁多,记忆起来混乱, 如果把软件测试方法进行分类, 就会清晰很多. 我参考一些书籍和网上的资料, 把常用的软件测试方法列出来, 让大家对软件测试行业有个总体的看法. 从测试设计方法分类 测试名称 测试内容 Black box黑盒测试 把软件系统当作一个"黑箱",无法了解或使用系统的内部结构及知识.从软件的行为,而不是内部结构出发来设计测试. White box白盒测试 设计者可以看到软件系统的内部结构,并且使用软件的内部知识来指导测试数据及方法的选择

  • 前端常用正则表达式汇总

    前言 正则这东西吧,感觉是开发的都会接触到一些.. 那些所谓的基础语法就不说了哈,一搜一大把,来点实际的. 我这里就分享下我工作中汇总和遇到的,希望对一些小伙伴有些许帮助哈!! 正则汇总 匹配URL const regexURL = /((https?|ftp)?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi; // 这条正则可以匹配这么一坨格式的url //ww

  • 关于适配iOS11和iPhoneX的一些事

    前言 众所周知iOS11正式版终于来了,最近也把app适配了一下,其实也不是很麻烦,来看看我做的一些操作,话不多说了,来一起看看吧. 1.UITableView.UICollectionView的变化 tableView在iOS11默认使用Self-Sizing,tableView的estimatedRowHeight.estimatedSectionHeaderHeight. estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAuto

随机推荐