キュレーションアプリを製作中なのですが、WKWebView内で外部リンク(target=”_blank”)が開かない仕様の解消に苦労しました。
今回は、自分への備忘録も兼ねて、WKWebView内で外部リンクをSFSafariViewで開く方法を紹介します。
必要なモジュールをimportして、WKWebViewをセットする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import UIKit import WebKit import SafariServices class ViewController: UIViewController, WKUIDelegate { private var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() webView = WKWebView(frame:CGRect(x:0, y: 0, width:self.view.bounds.size.width, height:self.view.bounds.size.height)) webView.uiDelegate = self let urlString = "https://rara-world.com" let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed) let url = NSURL(string: encodedUrlString!) let request = NSURLRequest(url: url! as URL) webView.load(request as URLRequest) self.view.addSubview(webView) } } |
WebKitとSafariServicesをimportし、WKUIDelegateを忘れないようにWKWebViewを描写します。
WKWebView内でタップされた外部リンクのURLを取得する
ViewController内に以下の記述を追加することによって、WKWebView内でタップされた外部リンクのURLを取得することができます。
1 2 3 4 5 6 7 8 9 10 |
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame?.isMainFrame != true { print(navigationAction.request.description) } return nil } |
取得したURLをSFSafariViewで描写する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame?.isMainFrame != true { let targetUrl = URL(string: navigationAction.request.description) if let url = targetUrl { let vc = SFSafariViewController(url: url) present(vc, animated: true, completion: nil) } } return nil } |
先程のソースを、このように変更すると、SFSafariViewControllerをpresentして、SFSafariViewで外部リンクを描写することができます!
完成コード!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import UIKit import WebKit import SafariServices class ViewController: UIViewController, WKUIDelegate { private var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() webView = WKWebView(frame:CGRect(x:0, y: 0, width:self.view.bounds.size.width, height:self.view.bounds.size.height)) webView.uiDelegate = self let urlString = "https://rara-world.com" let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed) let url = NSURL(string: encodedUrlString!) let request = NSURLRequest(url: url! as URL) webView.load(request as URLRequest) self.view.addSubview(webView) } func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame?.isMainFrame != true { let url = URL(string: navigationAction.request.description) if let url = url{ let vc = SFSafariViewController(url: url) present(vc, animated: true, completion: nil) } } return nil } } |
ご参考までに!!!!