Ios UIWebView与WKWebView加载本地html

Ios UIWebView与WKWebView加载本地html,ios,objective-c,uiwebview,webkit,wkwebview,Ios,Objective C,Uiwebview,Webkit,Wkwebview,我创建了一个html字符串,其中有一个带有时间戳的500p标记 我使用UIWebView和WKWebView loadHTMLString:baseURL:来加载它,WKWebView比UIWebView慢大约50%。为什么? UIWebView:0.1681529879570007 WKWebView:0.3913570046424866 WKWebView渲染性能在WebGL游戏和运行复杂JavaScript算法的游戏中是显而易见的,而UIWebView缺少这种算法 您可以在中检查性能。W

我创建了一个html字符串,其中有一个带有时间戳的500p标记

我使用
UIWebView
WKWebView loadHTMLString:baseURL:
来加载它,
WKWebView
UIWebView
慢大约50%。为什么?

UIWebView:0.1681529879570007
WKWebView:0.3913570046424866

WKWebView
渲染性能在WebGL游戏和运行复杂JavaScript算法的游戏中是显而易见的,而
UIWebView
缺少这种算法


您可以在中检查性能。

WKWebView显示字符串中的html的速度更快。但是,在默认情况下,存在一个使UIWebView更快的错误,即电话号码检测

使用以下代码运行viewController,
webView
分别作为UIWebView和WKWebView实例,并保持其他所有内容相同,我发现WKWebView加载最多需要2秒,而UIWebView几乎是立即加载的

webView.loadHTMLString(HtmlStringInstance, baseURL: nil)
我不是唯一一个发现这一点的人:


但是,解决方案很简单:禁用WKWebView和poof的电话号码检测。好了。

对我来说,创建静态变量可以避免多次创建WKWebView。目标C示例:

- (WKWebView *)webHeaderView
{
    static WKWebView *_webHeaderView = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        if (!_webHeaderView)
        {
            WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
            _webHeaderView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
        }
    });

    return _webHeaderView;
}

为了使
WKWebView
更快,禁用WKWebView的数据检测器对我来说很有效。Swift版本:

let webViewCofig = WKWebViewConfiguration()
webViewCofig.dataDetectorTypes = []
webView = WKWebView(frame: view.frame, configuration: webViewCofig)
要启用特定数据检测器,请在设置dataDetectorTypes时将特定类型传递为.address、.link等:

config.dataDetectorTypes = [.address]

我认为WKWebView对javascript使用JIT,所以它的性能是显而易见的,但是我的html不包含js或css,WKWebView速度很慢,不是吗?在更新代码以使用WKWebView后,我也有同样的想法。UIWebView旁边的加载速度较慢:/对我来说,关闭电话号码检测对我没有帮助,当我在真实设备上使用它时,我没有注意到WKWebView加载时间的巨大差异。我只是在模拟机上才注意到的。但是,如果您有多个视图要加载WKWebView,上述解决方案可能会对您有所帮助,因为最初加载WKWebView确实需要一些时间。请注意,如果这个静态变量没有很好地发布,您可能会遇到奇怪的运行时问题,所以您必须考虑到这一点。对我来说,由于运行时崩溃,我放弃了这种方法,我找不到好的方法来补救。
dataDetectorTypes
默认为
。none
,因此这是不必要的。