App内部加载网页:
UIWebView: 加载速度慢,占用内存多,优化困难。如果加载网页多,还可能因为过量占用内存而给系统kill掉。各种优化的方法效果也不那么明显
UIWebView的使用://www.greatytc.com/p/ea6a5f3b6a46
WKWebView:ios8之后推出新框架Webkit,提供了替换UIWebView的组件WKWebView,解决了UIWebView的弊端,速度更快,占用内存更少。
WKWeView特性:
1加载内存大小: 模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M
2允许JavaScript的Nitro库加载并使用(UIWebView中限制)
3支持了更多的HTML5特性;
460fps的滚动刷新率以及内置手势以及和 safari 相同的 JavaScript 引擎等优势
5将UIWebViewDelegate与UIWebView重构成了14类与3个协议
然后从以下几个方面说下WKWebView的基本用法:
1加载网页
2加载的状态回调
3新的WKUIDelegate协议
4动态加载并运行JS代码
5webView 执行JS代码
6JS调用App注册过的方法
1加载网页:
2WKWebView操作 JS
//javaScriptString是JS方法名,completionHandler是异步回调block [self.webView evaluateJavaScript: javaScriptString completionHandler: completionHandler];
3 WKWebView代理
代理协议 <WKNavigationDelegate,WKUIDelegate>
WKNavigationDelegate
WKUIDelegate 主要处理JS脚本
4 加载中的问题:
问题一:WKWebView加载POST请求无法发送参数
使用NSURLSession发送一个请求,然后把请求下来的数据当作本地HTML加载
问题二:使用JavaScript解决WKWebView无法发送POST参数问题(iOS8)
iOS9以前版本读取本地HTML的问题
当使用loadRequest来读取本地的HTML时,WKWebView是无法读取成功的,后台会出现如下的提示:
Could not create a sandbox extension for /
原因是WKWebView是不允许通过loadRequest的方法来加载本地根目录的HTML文件。
而在iOS9的SDK中加入了以下方法来加载本地的HTML文件:
[WKWebView loadFileURL:allowingReadAccessToURL:]
但是在iOS9以前的版本是没提供这个便利的方法的。以下为解决方案的思路,就是在iOS9以前版本时,先将本地HTML文件的数据copy到tmp目录中,然后再使用loadRequest来加载。但是如果在HTML中加入了其他资源文件,例如js,css,image等必须一同copy到temp中。
问题三:关于session同步cookies的问题
//www.greatytc.com/p/e08bd88e5842
问题四:适配H5页面
其他问题:
//www.greatytc.com/p/403853b63537