我正在浏览 Paul Hudson 的 Hacking with Swift 教程,并试图让WebView
在不允许站点时显示UIAlertController
。目前,允许的站点来自硬编码数组。
我已经尝试在调用decisionHandler(.cancel)
之前插入以下内容,并将其添加到if host.contains(website)
语句的末尾:
let alert = UIAlertController(title: "Heads Up!", message: "This URL is blocked.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .cancel))
present(alert, animated: true)
代码如下:
var websites = ["apple.com", "hackingwithswift.com"]
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let url = navigationAction.request.url
if let host = url?.host {
for website in websites {
if host.contains(website) {
decisionHandler(.allow)
return
}
}
}
decisionHandler(.cancel)
}
我知道访问者甚至只能访问两个网站 - 但如果它不适用,那么在保罗的网站上不会是一个挑战。你可以在这里查看我这个项目的整个存储库:https://github.com/andrewlundy/hacking-with-swift/tree/master/Project4
添加UITableViewController
作为初始ViewController
后,在列表中显示网站,然后检查当前站点是否在托管WKWebView
的ViewController
中,其属性为websites
,我能够提出一个基本的解决方案。
通过在UITableViewController
中使用didSelectRowAt
,您可以看到,如果用户点击的网站不在允许的网站上,它现在将弹出警报并让用户知道该网站已被阻止。
我相信这可以改进,这样你就不必在每个ViewController
中更新两个websites
属性,但这适用于 Hacking with Swift 教程。如果您可以提高效率,请添加此答案。
新的 TableViewController 类:
class TableViewController: UITableViewController {
let webView = ViewController()
var websites = ["apple.com", "hackingwithswift.com", "facebook.com"]
override func viewDidLoad() {
super.viewDidLoad()
print(webView.websites)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return websites.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "WebsiteCell", for: indexPath)
cell.textLabel?.text = websites[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let currentSite = websites[indexPath.row]
webView.currentSite = currentSite
if webView.websites.contains(currentSite) {
navigationController?.pushViewController(webView, animated: true)
} else {
let alert = UIAlertController(title: "Heads Up!", message: "This URL is blocked", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (UIAlertAction) in
self.navigationController?.popViewController(animated: true)
}))
present(alert, animated: true)
}
}
}