处理 swift UIWebKit 中的外部链接?
handling external links in swift UIWebKit?
我正在使用 swift 4 开发网络视图。
我正在加载本地 html 文件,在这些页面中有一些指向其他网站的链接,但是一旦我点击其中任何一个,我想将它们加载到 safari 或默认浏览器而不是 WebView(浏览器)中。
我的 webView 名为 "browser"
这是我的 ViewController.swift 代码:
import UIKit
import WebKit
class ViewController: UIViewController {
@IBOutlet weak var browser: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let htmlpath = Bundle.main.path(forResource: "kusrc/index", ofType: "html")
let url = URL(fileURLWithPath: htmlpath!)
let request = URLRequest(url: url)
browser.load(request)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
有人能帮帮我吗? google 中的大部分结果都不是我需要的...
是否可以做一个 if 语句,询问是否字符串前缀 ="http:// or https://" 然后打开 safari,否则 "browser"
我想你正在寻找这个委托方法:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == .linkActivated {
guard let url = navigationAction.request.url else {
decisionHandler(.allow)
return
}
UIApplication.shared.open(url)
decisionHandler(.cancel)
} else {
decisionHandler(.allow)
}
}
如果要根据URL
方案进行区分,可以使用URLComponents
将URL分成几部分。
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
if components?.scheme == "http" || components?.scheme == "https" {
// insert your code here
}
//编辑(更详细一点):
- 在您的 class 的最顶部导入
WebKit
:import WebKit
- 通过将 class 添加到父 class 之后,使您的 class 符合
WKNavigationDelegate
:class ViewController: UIViewController, WKNavigationDelegate
- 将您的 class 分配给 WKWebView 的导航委托:
browser.navigationDelegate = self
- 将以上代码添加到您的 class
你的 class 最后应该是什么样子的要点:WKWebView open links in Safari
这是关于该主题的非常好的教程:https://www.hackingwithswift.com/example-code/wkwebview/how-to-control-the-sites-a-wkwebview-can-visit-using-wknavigationdelegate
我正在使用 swift 4 开发网络视图。 我正在加载本地 html 文件,在这些页面中有一些指向其他网站的链接,但是一旦我点击其中任何一个,我想将它们加载到 safari 或默认浏览器而不是 WebView(浏览器)中。
我的 webView 名为 "browser"
这是我的 ViewController.swift 代码:
import UIKit
import WebKit
class ViewController: UIViewController {
@IBOutlet weak var browser: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let htmlpath = Bundle.main.path(forResource: "kusrc/index", ofType: "html")
let url = URL(fileURLWithPath: htmlpath!)
let request = URLRequest(url: url)
browser.load(request)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
有人能帮帮我吗? google 中的大部分结果都不是我需要的...
是否可以做一个 if 语句,询问是否字符串前缀 ="http:// or https://" 然后打开 safari,否则 "browser"
我想你正在寻找这个委托方法:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == .linkActivated {
guard let url = navigationAction.request.url else {
decisionHandler(.allow)
return
}
UIApplication.shared.open(url)
decisionHandler(.cancel)
} else {
decisionHandler(.allow)
}
}
如果要根据URL
方案进行区分,可以使用URLComponents
将URL分成几部分。
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
if components?.scheme == "http" || components?.scheme == "https" {
// insert your code here
}
//编辑(更详细一点):
- 在您的 class 的最顶部导入
WebKit
:import WebKit
- 通过将 class 添加到父 class 之后,使您的 class 符合
WKNavigationDelegate
:class ViewController: UIViewController, WKNavigationDelegate
- 将您的 class 分配给 WKWebView 的导航委托:
browser.navigationDelegate = self
- 将以上代码添加到您的 class
你的 class 最后应该是什么样子的要点:WKWebView open links in Safari
这是关于该主题的非常好的教程:https://www.hackingwithswift.com/example-code/wkwebview/how-to-control-the-sites-a-wkwebview-can-visit-using-wknavigationdelegate