使用 wkWebView 打开 URL 和深层链接但不是通过 safari
Using wkWebView to open URL and deeplink but not via safari
这是关于 wkWebview 的。我想在我的应用程序中使用 wkWebView 来完成浏览互联网的整个操作,当涉及到深度 link 时,我希望它检查 phone 中的应用程序并打开它(如果它可用)。我知道我们可以使用 UIApplication.shared.canOpenURL 和 open 方法,但我认为如果我使用这些方法,它会先打开 safari,然后让 safari 为深度 link 完成工作。在这种情况下,我根本不想涉及野生动物园。伙计们,你能帮帮我吗?当我使用 canOpenURL 和 Open 方法时,有什么方法可以排除 safari?
设置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)
}
}
如果您有任何问题,请告诉我。
就我而言,我通过检查方案设法实现了这一点。我意识到,当 url 以 "https/http" 开头时,如果只有该应用程序在我们的 phone 中不可用,它将尝试打开 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 的。我想在我的应用程序中使用 wkWebView 来完成浏览互联网的整个操作,当涉及到深度 link 时,我希望它检查 phone 中的应用程序并打开它(如果它可用)。我知道我们可以使用 UIApplication.shared.canOpenURL 和 open 方法,但我认为如果我使用这些方法,它会先打开 safari,然后让 safari 为深度 link 完成工作。在这种情况下,我根本不想涉及野生动物园。伙计们,你能帮帮我吗?当我使用 canOpenURL 和 Open 方法时,有什么方法可以排除 safari?
设置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)
}
}
如果您有任何问题,请告诉我。
就我而言,我通过检查方案设法实现了这一点。我意识到,当 url 以 "https/http" 开头时,如果只有该应用程序在我们的 phone 中不可用,它将尝试打开 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)
}