Cer*_*ter 6 ios swift wkwebview
我已经查看了这个问题的很多答案,但它们现在似乎已经过时了,没有一个解决方案对我有用,只是给出了很多错误。
我刚刚开始使用 xcode 和应用程序,并将本地 html 文件“index.html”加载到 WKWebView 中。这很好,加载正常,显示正常,但是我在页面上有一些 tel: 链接不起作用,我点击它们什么也没有。我正在为我的 html 文件使用 fraework7 并添加了“外部”类,它在 safari 等中工作。
更新:使用下面的代码,我可以点击一个链接,它会尝试调用,但会给出一个致命的错误
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate{
@IBOutlet weak var webview: WKWebView!
override func viewDidLoad() {
webview.navigationDelegate = self
super.viewDidLoad()
let htmlpath = Bundle.main.path(forResource: "index", ofType: "html")
let url = URL(fileURLWithPath: htmlpath!)
let request = URLRequest(url: url)
webview.load(request)
webview.scrollView.bounces = false
webview.configuration.dataDetectorTypes = .phoneNumber
// Do any additional setup after loading the view, typically from a nib.
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
if navigationAction.request.url?.scheme == "tel" {
UIApplication.shared.openURL(navigationAction.request.url!)
decisionHandler(.cancel)
}
decisionHandler(.allow)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Run Code Online (Sandbox Code Playgroud)
和 html 看起来像:
<tr>
<td>Police / Fire / Ambulance</td>
<td>Emergency Services</td>
<td><a href = "tel:999" class = "external">999</a></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
显然是更大表的一部分,但这是示例。
任何指针都将不胜感激,因为我多年来一直在兜圈子。
Cer*_*ter 10
终于找到了解决办法:
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate{
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
webView.navigationDelegate = self
webView.uiDelegate = self
super.viewDidLoad()
let htmlpath = Bundle.main.path(forResource: "index", ofType: "html")
let url2 = URL(fileURLWithPath: htmlpath!)
let request = URLRequest(url: url2)
webView.load(request)
webView.scrollView.bounces = false
//webview.configuration.dataDetectorTypes = .phoneNumber
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.request.url?.scheme == "tel" {
UIApplication.shared.openURL(navigationAction.request.url!)
decisionHandler(.cancel)
} else {
decisionHandler(.allow)
}
}
Run Code Online (Sandbox Code Playgroud)
使用这个似乎可以找到 tel: 链接很好,我之前在这里找到的一个答案没有 else 语句,因此多次触发了 decisionHandler 导致错误,else 语句修复了这个问题,现在看起来很好。
这不仅仅是tel:WKWebView 没有立即处理的链接。其他链接喜欢mailto:和facetime:不要么处理。有关此类特殊链接的完整列表,请参阅Apple 的文档。
您应该决定要处理哪些 Apple 的特殊链接(请参阅上面的链接),并以类似于以下的方式覆盖导航处理程序:
webView.navigationDelegate = self
...
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard let url = navigationAction.request.url else {
decisionHandler(.allow)
return
}
if ["tel", "sms", "facetime"].contains(url.scheme) && UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
decisionHandler(.cancel)
} else {
decisionHandler(.allow)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我能想到为什么 Apple 没有首先包含这个的唯一原因是因为当您尝试在 Mobile Safari 中启动这些链接之一时,它会显示一个对话框,如下所示:
该网站已被阻止自动发起呼叫。
[忽略] [允许呼叫]
因此,他们可能希望您希望在您的应用程序中实现类似的功能,而不仅仅是启动呼叫。
但是请注意,每种类型的链接的行为都不同:
tel: 显示带有呼叫/取消按钮的电话号码的对话框。sms: 启动消息应用程序。mailto: 启动邮件应用程序。因此,如果您确实想要某种模式,允许用户在他们不打算执行操作的情况下取消,则取决于您支持的操作,它可能已经具有类似的行为(例如tel:)。
| 归档时间: |
|
| 查看次数: |
7204 次 |
| 最近记录: |