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>
此代码本应加载 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>