使用WKWebView的好处:
在iOS系统中,webView分为UIWebView和WKWebView,相比于UIWebView,WKWebView在性能和功能等方面有很大提升,具有Safari相同的JavaScript引擎,支持更多的HTML5特性,并且没有点击事件延迟,滚动时也不会影响页面渲染。
使用方式:
可以在config.xml全局配置useWKWebView字段来使用:
<preference name="useWKWebView" value="true" />
或者在打开页面时通过useWKWebView参数来使用:
api.openTabLayout({ name: 'detail', url: './detail.html', useWKWebView: true, bgColor: '#fff', title: '详情', navigationBar: { background: '#fff' } });
注意事项和建议:
1、在打开新页面时应尽量使用openTabLayout来代替openWin,使用tabLayout的原生导航栏,加快打开速度。
2、为页面设置合适的背景颜色,以避免在窗口切换过程中闪现黑色背景。
3、使用UIWebView时,若系统内存不足时会直接结束掉应用,而使用WKWebView时则只是结束掉页面的渲染进程,因此会表现为页面白屏。
4、可以在config.xml中配置WKWebViewRecoveryMode来刷新页面或者热重启应用。
<preference name="WKWebViewRecoveryMode" value="rebootApp"/>
5、localStorage和UIWebView页面不通用。为避免出现兼容性问题,简单的本地数据存取可以用api对象下的prefs相关接口,而大量的缓存数据则可以使用fs、db来存储。
跨域问题:
1、WKWebView中限制了跨域访问,若服务器未设置允许跨域,则无法使用XMLHttpRequest和jQuery的ajax访问,只能使用api.ajax()。
2、在canvas中画图片时,除了图片服务器需设置允许跨域外,还需要使用blob的方式来加载图片,请看下方参考示例。
<!DOCTYPE html> <html> <head> <title>canvas</title> <meta charset="utf-8"> <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/> <style type="text/css"> html,body{ height: 100%; background-color: #fff; margin: 0; } </style> </head> <body> <canvas id="canvas" width="300" height="300"></canvas> <button style="display:block;" onclick="convasToImg();">canvas转换为图片</button> <img id="canvasImg" width="300" height="300"></img> </body> <script> var canvas; var context; function drawImageToCanvas(url) { var xhr = new XMLHttpRequest(); xhr.responseType = 'blob'; xhr.onload = function () { if (parseInt(this.status, 10) === 200) { var img = new Image(); img.src = URL.createObjectURL(this.response); img.onload = function () { context.drawImage(img, 0, 0, img.width, img.height, 0, 30, 200, 200); }; } }; xhr.open('GET', url); xhr.send(); } function convasToImg(){ var dataURL = canvas.toDataURL("image/png"); var canvasImg = document.getElementById("canvasImg"); canvasImg.src = dataURL; } window.onload = function() { canvas = document.getElementById("canvas"); context = canvas.getContext("2d"); context.fillText("文字信息", 10, 10); // 服务器需设置Access-Control-Allow-Origin字段允许跨域 var url = 'https://dss3.baidu.com/-rVXeDTa2gU2pMbgoY3K/it/u=3162798830,2010126759&fm=202&src=608&ernie-sim-title&mola=new&crop=v1'; drawImageToCanvas(url); } </script> </html>
注:为方便查看js报错信息,在loader和测试版(debug打开)中默认允许跨域,而正式版禁止跨域。
输入框自动获取焦点问题。为达到更好的体验,如果输入框要在打开页面时自动获取焦点弹出键盘,需使用api.setFocus方法。