WKWebView在safari中打开某个域的链接

寻找一些帮助我的iOS应用程序。 在我的应用程序中,我希望打开WKWebView中来自我的域(EX:communionchapelefca.org)的点击链接,然后在Safari中打开所有其他域(EX:google.com)的链接。 我宁愿这样做编程,因为这是我的代码是如何设置的。

我已经find了一些解决scheme( 在这里 , 这里 , 这里 , 这里 ),但他们都似乎是Obj-C的基础,我正在寻找一个解决scheme,使用Swift。 提前致谢。

ViewController.swift:

import UIKit import WebKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let myWebView:WKWebView = WKWebView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height)) myWebView.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.communionchapelefca.org/app-home")!)) self.view.addSubview(myWebView) 

你可以实现WKNavigationDelegate,添加determinePolicyForNavigationAction方法,并检查那里的导航types和请求的url。 我在下面使用了google.com,但是您可以将其更改为您的域名:

Xcode 8.3•Swift 3.1

 import UIKit import WebKit class ViewController: UIViewController, WKNavigationDelegate { let webView = WKWebView() override func viewDidLoad() { super.viewDidLoad() guard let url = URL(string: "https://www.google.com") else { return } webView.frame = view.bounds webView.navigationDelegate = self webView.load(URLRequest(url: url)) webView.autoresizingMask = [.flexibleWidth,.flexibleHeight] view.addSubview(webView) } 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("www.google.com"), UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url) print(url) print("Redirected to browser. No need to open it locally") decisionHandler(.cancel) } else { print("Open it locally") decisionHandler(.allow) } } else { print("not a user click") decisionHandler(.allow) } } } 

对于Swift 3.0

 import UIKit import WebKit class ViewController: UIViewController, WKNavigationDelegate { let wv = WKWebView(frame: UIScreen.main.bounds) override func viewDidLoad() { super.viewDidLoad() guard let url = NSURL(string: "https://www.google.com") else { return } wv.navigationDelegate = self wv.load(NSURLRequest(url: url as URL) as URLRequest) view.addSubview(wv) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { if navigationAction.navigationType == .LinkActivated { if let newURL = navigationAction.request.url, let host = newURL.host , !host.hasPrefix("www.google.com") && UIApplication.shared.canOpenURL(newURL) && UIApplication.shared.openURL(newURL) { print(newURL) print("Redirected to browser. No need to open it locally") decisionHandler(.cancel) } else { print("Open it locally") decisionHandler(.allow) } } else { print("not a user click") decisionHandler(.allow) } } } 

这里是从对obj c中写入的swift的响应的示例代码。

 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler { if (navigationAction.navigationType == WKNavigationTypeLinkActivated) { if (navigationAction.request.URL) { NSLog(@"%@", navigationAction.request.URL.host); if (![navigationAction.request.URL.resourceSpecifier containsString:@"ex path"]) { if ([[UIApplication sharedApplication] canOpenURL:navigationAction.request.URL]) { [[UIApplication sharedApplication] openURL:navigationAction.request.URL]; decisionHandler(WKNavigationActionPolicyCancel); } } else { decisionHandler(WKNavigationActionPolicyAllow); } } } else { decisionHandler(WKNavigationActionPolicyAllow); } } 

做一个函数来决定在哪里加载URL:

 func loadURLString(str: String) { guard let url = NSURL(string: str) else { return } if url.host == "www.communionchapelefca.org" { // Open in myWebView myWebView.loadRequest(NSURLRequest(URL: url)) } else { // Open in Safari UIApplication.sharedApplication().openURL(url) } } 

用法:

 loadURLString("http://www.communionchapelefca.org/app-home") // Open in myWebView loadURLString("http://www.apple.com") // Open in Safari 

我的迅捷3解决scheme:

  public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { let url = navigationAction.request.url if url?.description.lowercased().range(of: "http://") != nil || url?.description.lowercased().range(of: "https://") != nil { decisionHandler(.cancel) UIApplication.shared.openURL(url!) } else { decisionHandler(.allow) } } 

不要忘记设置代表

  public override func loadView() { let webConfiguration = WKWebViewConfiguration() webView = WKWebView(frame: .zero, configuration: webConfiguration) webView.uiDelegate = self webView.navigationDelegate = self view = webView }