WKWebView 未加载网页 - 在 Swift 中呈现空白屏幕

WKWebView not loading webpage - renders blank screen in Swift

此代码本应加载 Apple 主页,但却显示空白屏幕。
HTTP 和 HTTPS URL 都会发生这种情况。

代码:

import UIKit
import WebKit

class WebViewController: UIViewController, WKUIDelegate{

    var webView: WKWebView!

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView

    }
    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .red

        let myURL = URL(string: "https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
}

我尝试更改 'App Transport Security Settings' 以允许任意加载。没有改变任何东西。

截图:

查看层次结构:

模拟器的 Safari 调试控制台:

您可以试试下面的代码

import UIKit
import WebKit

class WebViewController: UIViewController {

var wkWebview: WKWebView!

 override func viewDidLoad() {

   super.viewDidLoad()

    var Ycord : CGFloat = 0.0 // for top space 
    if UIScreen.main.bounds.height == 812 { //Check for iPhone-x
        Ycord = 44.0
    }
    else {
        Ycord = 20.0
    }

    let frame = CGRect(x: 0.0, y: Ycord, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height-Ycord)

    self.wkWebview = WKWebView(frame: frame, configuration: WKWebViewConfiguration())
    self.wkWebview.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.wkWebview.uiDelegate = self
    self.view.addSubview(self.wkWebview)

    DispatchQueue.main.async {

        self.wkWebview.load(URLRequest(url:URL(string: "https://www.apple.com")!))
    }        
 }
}

输出

以下代码在 Xcode 9.3 中对我来说工作得很好:

import UIKit
import WebKit

class ViewController: UIViewController {

    var webView: WKWebView!

    override func loadView() {
        webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
        self.view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.load(URLRequest(url: URL(string: "https://www.apple.com")!))
    }

}

结果如下:

我找到了解决办法。问题是由 AVG AntiVirus 的 webshield 引起的。出于某种原因,AVG webshield 将来自模拟器的所有网络通信视为欺诈。 以下屏幕截图显示了模拟器上的 Safari 应用程序 运行。它说 www.apple.com 不安全或任何其他网站。

以下屏幕截图来自 system.log,显示了 webkit 的错误。

您可以通过安装 AVG 防病毒软件并打开网络屏蔽来重现此问题。您应用程序中的 WKWebview(在模拟器上)不会加载任何内容。

我不明白为什么它不能在实际设备上运行。这可能是设备的另一个问题。我还删除了派生数据文件夹、实际应用程序并重新启动了设备。

谢谢大家的解答和帮助。

为 Mac 构建应用程序?

如果您正在为 Mac 构建应用程序,请确保在您的目标中打开 App Sandbox ON 并勾选 Networks Outgoing连接。


更新:如果您喜欢长途跋涉,请将以下内容添加到 YourAppName.entitlements

<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>

所有设备的自动布局和常量 10 的正确方法:

import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate {

let webView = WKWebView()

override func viewDidLoad() {
    super.viewDidLoad()
    setupWebView()
}

fileprivate func setupWebView() {
    webView.uiDelegate = self
    webView.translatesAutoresizingMaskIntoConstraints = false
    DispatchQueue.main.async {
        guard let url = URL(string: "http://www.apple.com") else { return }
        self.webView.load(URLRequest(url: url))
    }
    view.addSubview(webView)
    webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10).isActive = true
    webView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10).isActive = true
    webView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -10).isActive = true
    webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 10).isActive = true
}}

在info.plist中:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>