【问题标题】:WKWebview does not run javascript(XML HTTP request) with out adding a parent viewWKWebview 在不添加父视图的情况下不运行 javascript(XMLHTTPrequest)
【发布时间】:2014-10-22 18:03:25
【问题描述】:

我正在将我的项目从 UIWebView 更新到 WKWebView。在现有的 UIWebView 方法中,UIWebView 在运行 javascript 之前没有任何父级,一旦它有内容,它就会向 webview 添加一个父级。使用 UIWebView 可以很好地呈现内容。我对 WKWebView 使用相同的方法,但是 WKWebview 在加载时卡住了。有什么方法可以在 wkwebview 上执行 javascript 而无需将父级添加到 webview。另一个有趣的事情是它适用于模拟器而不是设备。使用 localHTTPServer 提供 html、css 和图像。

解决上述问题的任何建议或技巧。

【问题讨论】:

    标签: wkwebview


    【解决方案1】:

    我在无头 WKWebView 中运行 socket.io 的应用程序中观察到了类似的行为。在我的情况下,网络套接字会一直断开连接而不重新连接。

    似乎由于 WKWebView 在进程外运行 javascript,它会暂停任何被认为空闲的 javascript 以节省资源 (

    WKWebViewConfiguration* webViewConfig = // set up config
    
    // provide empty frame rect
    WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webViewConfig];
    
    // add to keyWindow to ensure it is 'active'
    [UIApplication.sharedApplication.keyWindow addSubview:webView];
    

    这种方法至少可以确保 javascript 在应用程序处于活动状态时运行并且不会影响 UI。如果您需要稍后显示它,您可以在渲染后从 keyWindow 中删除 webView 并重置框架。而且,是的,我还观察到在模拟器中这不是问题(javascript 始终运行,无论父级或应用程序状态如何)

    希望这会有所帮助!

    【讨论】:

    • 哇。太棒了,你得到解决方法的方式。有用。但是在某些时候我们应该从 keywindow 中删除 webview 对吗?否则可能会出现性能或内存限制。
    • 视情况而定。对我来说,我需要它一直运行以保持套接字连接正常运行。但可以肯定的是,如果您不需要它运行,为什么不删除它:)。
    • 这是苹果提出的一个错误,任何开放的雷达都存在。
    • 另一件有趣的事情,在 iOS 10-11 中,我发现实际上你可以在 WKWebView 上运行 JavaScript,而无需将其添加到视图树中。但是,如果它不在树中,则 JavaScript 的执行性能会减慢(页面上的计时器最多减慢 5 次)。此外,在 macOS 上的 Safari 浏览器中,如果页面的选项卡被隐藏,执行速度会减慢:当页面消失时(就像我们打开另一个选项卡一样),我们的计时器会减慢大约 3-5 倍。
    • 这是纯金!特别是在使用 cordova-plugins 时,这非常有用,谢谢!
    【解决方案2】:

    接受的解决方案有时对我有用。我尝试了其他似乎对我始终有效的方法:

    self.keepWebViewActiveTimer = [NSTimer scheduledTimerWithTimeInterval:0.2
                                     target:self 
                                     selector:@selector(_keepWKWebViewActive:)
                                     userInfo:nil
                                     repeats:YES];
    

    _keepWKWebViewActive 在哪里:

    -(void) _keepWKWebViewActive:(NSTimer*) timer{
        if(self.webView) {
            [self.webView evaluateJavaScript:@"1+1" completionHandler:nil];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多