stringByEvaluatingJavaScript(from:) return 等效值

stringByEvaluatingJavaScript(from:) return value equivalent

我知道有人问过这个问题,但我对这个方法有不同的问题。

UIWebView's - stringByEvaluatingJavaScript(from:) 同步 returning 一个 String? 值。

WKWebView 等价物 evaluateJavaScript(_:completionHandler:) 与 complitionHandler 一起工作。

我正在使用遗留代码,我 stringByEvaluatingJavaScript(from:) 影响了代码中的数千行,并且可以在任何地方和许多函数中找到 return 值(不使用块) .

非常简单的例子 -

@discardableResult func js(_ script: String) -> String? {
        let callback = self.stringByEvaluatingJavaScript(from: script)
        if callback!.isEmpty { return nil }
        return callback
    }

现在我要更改为 evaluateJavaScript(_:completionHandler:) 我将需要使用块处理 js(script:) 方法,并且使用该方法的方法需要更改等等...

我认为为了在不更改所有代码的情况下解决此问题,我需要 evaluateJavaScript(_:completionHandler:) 同步 return String?.

有人知道如何实现吗?或者可能有不同的解决方案?

找到了 -

将此添加到您的 WKWebview 扩展中以将 evaluateJavaScript(_:completionHandler:) 包装在同步扭曲中,如 UIWebview -

open func stringByEvaluatingJavaScript(from script: String) -> String?
        {
            var finished = false
            var stringResult: String? = nil

            evaluateJavaScript(script) { (result, error) in

                if error == nil, let result = result
                {
                    stringResult = String(describing: result)
                }

                finished = true
            }

            while !finished
            {
                RunLoop.current.run(mode: .default, before: Date.distantFuture)
            }

            return stringResult
        }

我不确定 result 中可以返回哪些类型,因此请注意这一点。否则效果很好。