这是关于 wkWebview 的。我想在我的应用程序中使用 wkWebView 来完成浏览互联网的整个操作,当涉及到深层链接时,我希望它检查手机中的应用程序并打开它(如果可用)。我知道我们可以使用 UIApplication.shared.canOpenURL 和 open 方法,但我想如果我使用这些方法,它将首先打开 safari,然后让 safari 完成深层链接的工作。在这种情况下,我根本不想涉及野生动物园。所以各位,你们能帮我吗?当我使用 canOpenURL 和 Open 方法时,有什么方法可以排除 safari 吗?
就我而言,我通过检查方案成功实现了这一目标。我意识到,当网址以“https/http”开头时,如果我们的手机中没有该应用程序,它将尝试打开 safari。这就是我想要防止的,这就是为什么我首先检查该方案的原因。这样,当 url 包含 http/https 时,它将保留在 wkwebview 上。我用这种方法成功地实现了我的目标,但我总是乐于接受任何建议或改进。
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let url = navigationAction.request.url, let scheme = url.scheme?.lowercased() {
//check the url scheme to bring user to specific apps other than safari
if scheme != "https" && scheme != "http" {
if UIApplication.shared.canOpenURL(url){
// use the available apps in user's phone
UIApplication.shared.open(url)
}
}
}
decisionHandler(.allow)
}
设置WkWebView委托:
webView.uiDelegate = self
webView.navigationDelegate = self
然后实现以下方法。
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == .linkActivated {
if let url = navigationAction.request.url,
let host = url.host, !host.hasPrefix("something whatever you want to handle deeplink"),
UIApplication.shared.canOpenURL(url) {
print(url)
print("No need to open it locally")
decisionHandler(.cancel)
} else {
print("Open it locally")
decisionHandler(.allow)
}
} else {
print("not a user click")
decisionHandler(.allow)
}
}
如果您有任何疑问,请告诉我。