【问题标题】:Swift's web view is only printing <head></head><body></body> as innerhtmlSwift 的 web 视图仅将 <head></head><body></body> 打印为 innerhtml
【发布时间】:2019-11-25 13:38:35
【问题描述】:

我试图在使用 webview 时关注 this tutorial,但是当我编写此代码时:

 webView.evaluateJavaScript("document.getElementsByTagName('html')[0].innerHTML",
                                       completionHandler: {(value, error) in
                                        print("INNER HTML: \(value!)")
                                        print("ERROR \(String(describing: error))")

当它应该打印 gmail 的内部 html 时,我在控制台中得到的只是 &lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;。为什么会发生这种情况,我该如何解决?

另外,从这段代码:

let url = URL(string: "https://www.gmail.com")!
        let request = URLRequest(url: url)
        webView.frame = CGRect(x: 0, y: 300, width: 300, height: 300)
        webView.load(request)
        view.addSubview(webView)

我应该可以看到登录页面,但我在模拟器上什么都没有(不是很重要,但会有所帮助)

【问题讨论】:

    标签: html ios swift xcode webview


    【解决方案1】:

    我从完全相同的教程中学习了 WkWebView!去 Kilo Loco!

    在我进行了大量 Stack Overflow 搜索之后,我的代码最终有所不同。 此代码在完成处理程序中打印 HTML,并将 HTML 保存到我在 ViewController 中定义的名为 webString 的 var:

    webView.evaluateJavaScript(
      "document.documentElement.outerHTML.toString()",
        completionHandler: { (html: Any?, error: Error?) in
            print("error: '\(String(describing: error))'")
            self.webString = html as! String
    //  print("webString: '\(self.webString)'")
        })
    

    另外,记得添加 WKNavigationDelegate

    class ViewController: UIViewController, WKNavigationDelegate {
    

    并且,对于 macOS 应用,请在应用的“功能”选项卡中启用传入和传出网络访问。如果您忘记了这一步,您将不会在 WkWebView 中看到任何内容:

    这是我工作的 iOS 视图控制器:

    //
    //  ViewController.swift
    //
    
    import UIKit
    import WebKit
    
    class ViewController: UIViewController, WKNavigationDelegate {
    
        var webView: WKWebView!
        var currentHTML: String = ""
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let url = URL(string: "https://www.gmail.com")!
            let request = URLRequest(url: url)
    
    //        webView.frame = CGRect(x: 0, y: 300, width: 300, height: 300)
            self.webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 
    self.view.frame.width, height: self.view.frame.height))
    
            webView.navigationDelegate = self
            webView.load(request)
            view.addSubview(webView)
        }
    
        // WKNavigationDelegate method
        func webView(_ webView: WKWebView, didFinish: WKNavigation!) {
            webView.evaluateJavaScript(
                "document.documentElement.outerHTML.toString()",
                completionHandler: { (html: Any?, error: Error?) in
                    self.currentHTML = html as! String
                    print("In compHandler, HTML: \(self.currentHTML.count) bytes\n")
            })
    
            webView.evaluateJavaScript(
                "document.getElementsByTagName('html')[0].innerHTML",
                completionHandler: {(value, error) in
                    print("INNER HTML: \(value!)")
                    print("ERROR \(String(describing: error))")
            })
    
        }
    }
    

    【讨论】:

    • 另外,我似乎找不到启用传入和传出网络访问,你能告诉我确切的名称吗?
    • 这仍然打印
    • 我添加了一张图片,其中包含说明如何在“功能”选项卡中启用传入和传出网络的说明。请记住在进行这些更改后重新启用沙盒。这应该会有所帮助!
    • 我做了一些研究,我认为我没有 App Sandbox 功能的原因是因为我正在构建 iOS 应用,而您正在构建 macOS 应用。我认为对于 iOS,我们不需要启用它,因为 Kilo Loco 也没有这样做,但他的应用程序运行得非常好
    • 你是对的。我正在为这张图片查看我的一个 macOS 应用程序。我很抱歉。 evaluateJavaScript() 代码适用于两个平台。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多