gpt4 book ai didi

ios - 如何使用decidePolicyFor在不允许站点时显示UIAlertController

转载 作者:行者123 更新时间:2023-11-29 05:30:34 26 4
gpt4 key购买 nike

我正在阅读 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)
}

我知道访问者只能访问两个网站 - 但如果不适用,这对 Paul 的网站来说不会是一个挑战。您可以在这里查看我的该项目的整个存储库:https://github.com/andrewlundy/hacking-with-swift/tree/master/Project4

最佳答案

添加 UITableViewController 作为初始 ViewController 后,在列表中显示网站,然后检查当前网站是否在 ViewController 中这是托管 WKWebView 的,它具有 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)
}
}
}

关于ios - 如何使用decidePolicyFor在不允许站点时显示UIAlertController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57638749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com