【问题标题】:UIWebView VS WKWebView to load local htmlUIWebView VS WKWebView 加载本地html
【发布时间】:2017-03-22 19:41:24
【问题描述】:

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

我使用UIWebViewWKWebView loadHTMLString:baseURL: 加载它,wkWebViewUIWebVIew50%。为什么?

UIWebView:0.1681529879570007
WKWebView:0.3913570046424866

【问题讨论】:

    标签: ios objective-c uiwebview webkit wkwebview


    【解决方案1】:

    WKWebView 的渲染性能在 WebGL 游戏和运行 UIWebView 缺乏的复杂 JavaScript 算法的游戏中非常显着。

    您在Github 中检查性能。

    【讨论】:

    • 我认为 WKWebView 使用 JIT for javascript,所以它的性能是显而易见的,但是我的 html 不包含 js 或 css,WKWebView 很慢,不是吗?
    • 在更新我的代码以使用 WKWebView 后我也有同样的情况。它在 UIWebView 旁边加载较慢:/
    【解决方案2】:

    WKWebView 从字符串显示 html 更快。但是,有一个 bug 让 UIWebView 默认更快,那就是电话号码检测。

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

    webView.loadHTMLString(HtmlStringInstance, baseURL: nil)
    

    到目前为止,我不是唯一一个发现这个的人:

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

    【讨论】:

    • 对我来说,关闭电话号码检测没有帮助
    【解决方案3】:

    对我来说,创建静态变量以避免多次创建 WKWebView 是可行的。 Objective-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,上述解决方案可能会对您有所帮助,因为最初加载 WKWebView 确实需要一些时间。请注意,如果此静态变量没有很好地释放,您可能会遇到奇怪的运行时问题,因此您必须考虑到这一点。对我来说,由于运行时崩溃,我放弃了这种方法,而且我找不到解决这个问题的好方法。
    【解决方案4】:

    为了使WKWebView 更快,禁用 WKWebView 的数据检测器对我有用。斯威夫特版本:

    let webViewCofig = WKWebViewConfiguration()
    webViewCofig.dataDetectorTypes = []
    webView = WKWebView(frame: view.frame, configuration: webViewCofig)
    

    要启用特定的数据检测器,请在设置 dataDetectorTypes 时将特定类型传递为 .address、.link 等:

    config.dataDetectorTypes = [.address]
    

    【讨论】:

    • dataDetectorTypes 默认为.none,所以这是不必要的。
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2022-11-17
    相关资源
    最近更新 更多