苹果在 iOS2 推出了UIWebView,随着不断发展,原生代码 + WebView 混合显示已发展成最流行的移动应用开发模式。
其中,native <<---->> WebView页面的javascript脚本 间的通讯,是混合开发模式的核心内容。
简单回顾一下各个时期原生代码与javascript通讯的方法:
iOS6及之前:使用第三方框架:WebViewJavascriptBridge
基于UIWebView,速度和内存性能一般。本质上,它也是通过webview的代理拦截scheme,然后注入相应的JS
关键代码:
1、ios调用oc 用stringByEvaluatingJavaScriptFromString
2、JS调用oc,是基于url进行拦截
iOS7:苹果提供了JavaScriptCore.framework框架。
基于UIWebView,速度和内存性能一般。相比WebviewJavascriptBridge,提供了更简单方便的js接入方式
关键代码:self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];注意坑:
1、oc调用js,必须是html加载完成之后才可以。-(void)webViewDidFinishLoad:(UIWebView *)webView;
iOS8:苹果推出了新框架 WebKit,提供了替换 UIWebView 的组件 WKWebView(推荐)
解决UIWebView 的性能问题没有了,速度更快了,占用内存少了,体验更好了,下面列举一些其它的优势:
1、在性能、稳定性、功能方面有很大提升(无论 WKWebView 跳转多少 Web 页面都没有内存泄漏了,加载耗时差别不大,WKWebView 的 内存优化减少了几乎4倍)
2、更多的支持 HTML5 的特性(对HTML5性能也提升了4倍)
3、官方宣称的高达60fps(帧每秒)的滚动刷新率以及内置手势
4、Safari 相同的 JavaScript 引擎(Nitro JS)
5、将 UIWebViewDelegate 与 UIWebView 拆分成了14类与3个协议,包含该更细节功能的实现。
注意坑:
1、在 WKWebsiteDataStore 出现之前(iOS 9 中),WKWebViewiOS 8可以通过清理 Library 目录下的 Cookies 目录来清除缓存。
关键代码:
1、javascript调用本地代码:
2、本地代码调用javascript