Javascript iOS WKWebView在嵌入推文时计算高度不正确

Javascript iOS WKWebView在嵌入推文时计算高度不正确,javascript,ios,twitter,webview,wkwebview,Javascript,Ios,Twitter,Webview,Wkwebview,我的应用程序使用WKWebView显示html字符串。WkWebView嵌入到scrollView中,因为我还有几个其他元素(例如按钮、表视图)。因此,我需要计算WkWebvView内容的大小,为此我使用evaluateJavaScript(“document.body.scrollHeight”,completionHandler:method)。 每当我在html字符串中嵌入tweet时,内容高度都会被错误计算,我的webview会从其高度中剪切一部分 嵌入tweet的html字符串的一部分

我的应用程序使用WKWebView显示html字符串。WkWebView嵌入到scrollView中,因为我还有几个其他元素(例如按钮、表视图)。因此,我需要计算WkWebvView内容的大小,为此我使用evaluateJavaScript(“document.body.scrollHeight”,completionHandler:method)。 每当我在html字符串中嵌入tweet时,内容高度都会被错误计算,我的webview会从其高度中剪切一部分

嵌入tweet的html字符串的一部分如下所示:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "callbackHandler" {
        print(message.body)
        webViewx.evaluateJavaScript("document.body.offsetHeight", completionHandler: { (height, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            if let height = height as? CGFloat{
                if height > self.kontejnerHeight.constant {
                    self.kontejnerHeight.constant = height
                }

            }
        })
    }
}
埃森海军上将护卫舰对德尔祖尔附近的ISIS目标发射巡航导弹

(BLABLA*实际上是t.co/azHAIii07g,由于stackoverflow规则,我不得不替换它)

这个twitter代码中是否缺少一些东西,或者我应该在webview方法中设置一些东西

我尝试从这篇文章中实现解决方案:但没有成功,或者至少我能找到答案

谢谢你的建议

更新: 我进行了一点黑客攻击,发现了可怕的解决方法,但这是一个很好的线索,可以说明问题所在。 这是我用来计算高度的完整函数:

`func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    self.webViewx.evaluateJavaScript("document.readyState", completionHandler: {
        [weak self] (complete, error) in
        if complete != nil {                self?.webViewx.evaluateJavaScript("document.body.offsetHeight", completionHandler: {
                [weak self] (height, error) in

    })
}`
如果我说:

`DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+1, execute: { 
self?.webViewx.evaluateJavaScript("document.body.offsetHeight", completionHandler: {
[weak self] (height, error) in
print("HEIGHT AFTER 1 sec", height)
    })
})`
我在1秒后得到了正确的高度。现在,在正确的时间后得到高度更新的方法是什么


另外,还有一点需要注意的是,如果我嵌入了facebook或instagram帖子,一切都会正常运行,webview高度也会得到正确计算。

在stackoverflow上的几篇帖子(特别是:)和我的网络开发同事的帮助下,我设法找到了解决这个问题的方法。 基本上,如果webview需要加载html字符串中的嵌入tweet,则想法是在webview配置中添加一个脚本。之后,我们应该实现userContentController didReceive消息函数,并在其中评估webview的高度

以下是webview.loadHtmlString方法之前的代码:

if htmlString.contains("platform.twitter.com/widgets.js") {
        let twitterJS: String = "window.twttr = (function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0],t = window.twttr || {};if (d.getElementById(id)) return t;js = d.createElement(s);js.id = id;js.src = \"https://platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, \"script\", \"twitter-wjs\"));twttr.ready(function (twttr) {twttr.events.bind('loaded', function (event) {window.webkit.messageHandlers.callbackHandler.postMessage('TWEET');});});"
        let userScript = WKUserScript(source: twitterJS, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
        webViewx.configuration.userContentController.removeAllUserScripts()
        webViewx.configuration.userContentController.addUserScript(userScript)
        webViewx.configuration.userContentController.add(self, name: "callbackHandler")
    }
首先检查html字符串是否有一个子字符串,该子字符串是嵌入的tweet。 我们从twitterJS网页上获得了分配给let twitterJS的脚本。 最后一行很重要,因为它为我们的脚本命名

实际高度评估如下所示:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "callbackHandler" {
        print(message.body)
        webViewx.evaluateJavaScript("document.body.offsetHeight", completionHandler: { (height, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            if let height = height as? CGFloat{
                if height > self.kontejnerHeight.constant {
                    self.kontejnerHeight.constant = height
                }

            }
        })
    }
}

希望这也能帮助其他人。

你有这个示例项目吗?嘿@karthikeyan,我现在没有任何示例项目。如果你不能完成这项工作,如果你将我添加为你项目的合作者,我将很乐意帮助你。另外,我计算WKWebView高度的另一个答案可能会给你一个更广阔的图景:。