使用WKWebView的好处与使用介绍

作者:apicloud官方 更新时间:2020-04-04 11:54

使用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、localStorageUIWebView页面不通用。为避免出现兼容性问题,简单的本地数据存取可以用api对象下的prefs相关接口,而大量的缓存数据则可以使用fs、db来存储。



跨域问题

1、WKWebView中限制了跨域访问,若服务器未设置允许跨域,则无法使用XMLHttpRequestjQueryajax访问,只能使用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方法。