Получить текст в формате JSON из WKWebView - PullRequest
1 голос
/ 18 июня 2019

Я хочу получить содержимое http://www.devpowerapi.com/fingerprint из WKWebView

evaluateJavaScript("document.documentElement.innerHTML") возвращает <head></head><body></body> вместо фактического JSON

Можно ли получить содержимое с помощью WKWebView?

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Самый простой способ сделать это (работает для данного конкретного случая):

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. Общеизвестно, что JSON-заголовки трудно получить с помощью WKWebView, но вы можете попробовать этот метод для этого. Первый набор:

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)
}
0 голосов
/ 19 июня 2019

Я бы не сказал, что это правильное решение, но это решение, тем не менее. Запрос будет сделан в контексте 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)
})

Я уверен, что вы можете использовать любое из решений JavaScript из этой темы .

...