【问题标题】:Get JSON text from WKWebView从 WKWebView 获取 JSON 文本
【发布时间】:2019-06-18 18:42:45
【问题描述】:

我想从 WKWebView 中获取http://www.devpowerapi.com/fingerprint 的内容

evaluateJavaScript("document.documentElement.innerHTML") 返回 <head></head><body></body> 而不是实际的 JSON

是否可以通过 WKWebView 获取内容?

【问题讨论】:

    标签: javascript ios swift wkwebview


    【解决方案1】:

    执行此操作的最简单方法(适用于这种特定情况):

    webView.evaluateJavaScript("document.getElementsByTagName('pre')[0].innerHTML", completionHandler: { (res, error) in
         if let fingerprint = res {
              // Fingerprint will be a string of JSON. Parse here...
              print(fingerprint)
         }
    })
    

    可能是更好的方法:

    所以.innerHTML 返回 HTML,而不是 JSON 标头。众所周知,WKWebView 很难获取 JSON 标头,但您可以尝试这种方法。第一组:

    webView.navigationDelegate = self
    

    然后在WKNavigationDelegate方法中:

    public func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
        let res = navigationResponse.response as! HTTPURLResponse
        let header = res.allHeaderFields
        print(header)
    }
    

    【讨论】:

    • 第一个解决方案时出现以下错误:Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=TypeError: undefined is not an object (evaluating 'document.getElementsByTagName('pre')[0].innerHTML'), WKJavaScriptExceptionColumnNumber=40, WKJavaScriptExceptionSourceURL=about:blank, NSLocalizedDescription=A JavaScript exception occurred}
    • 啊,evaluateJavaScript应该在webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)中调用
    【解决方案2】:

    我不会说这是正确的解决方案,但它不是一个解决方案,越少越好。该请求将在 webView 的上下文中发出。

    webView.evaluateJavaScript("""
    var Httpreq = new XMLHttpRequest(); // a new request
    Httpreq.open("GET",'http://www.devpowerapi.com/fingerprint',false);
    Httpreq.send(null);
    Httpreq.responseText;
    """,
        completionHandler: {
           (innerHTML, error) in
           print(innerHTML, error)
    })
    

    我相信您可以使用来自this thread 的任何 JavaScript 解决方案。

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2016-01-14
      • 1970-01-01
      相关资源
      最近更新 更多