iOS アプリで Webページを表示させたくて SFSafariViewController
を使用していたのですが、開こうとしても白紙のページが表示されるだけという現象が発生しました。
1回目は成功するのですが、一度ページを閉じた後、再度開くと白紙になる…という状況です。
時間を開ければ表示されたりもするのですが、それだと使えないので対処法を調査しました。
さて対処法ですが、結局 SFSafariViewController
をやめて WKWebView
を使うのが一番手っ取り早いようでしたので、そちらの方法を採用することにしました。
ということで、実装のサンプルコードです。
まず、遷移先の WebView ページのコードがこちら。
地図を表示させているので、MapController.swift
という名前になっています。
こちらは適宜変更してください。
import UIKit import WebKit class MapController: UIViewController, WKNavigationDelegate, WKUIDelegate { var webView: WKWebView? override func viewDidLoad() { super.viewDidLoad() self.title = "マップ" let rightReloadButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(reloadPage(_:))) self.navigationItem.setRightBarButtonItems([rightReloadButton], animated: true) // WebView の設定 webView = WKWebView(frame:CGRect(x:0, y:0, width:self.view.bounds.size.width, height:self.view.bounds.size.height)) webView?.uiDelegate = self webView?.navigationDelegate = self self.view.addSubview(webView!) // URL設定 let urlString = [表示したいWebページのURL] let url = URL(string: urlString) let request = URLRequest(url: url!) webView!.load(request) } // リロード処理 @objc func reloadPage(_ sender: UIButton) { if webView?.url != nil { webView?.reload() } } }
ナビゲーションバーの右端にはリロードボタンも追加しています。
こちらは必要がなければ削除してください。
そして、上記のページを開く時のコードはこちら
// 遷移するViewを定義する. let mapController: MapController = MapController() // View を移動する. self.navigationController?.pushViewController(mapController, animated: true)
コメントを抜かせば、たった 2行でOKです。
もちろん、SFSafariViewController
を使用すれば MapController.swift
を用意しなくて済むのでコード行数も少なくて済むのですが、原因のわからないエラーが発生したので作り直してしまった方が簡単でした。
しかし、別の問題もあり、WebView を開いた数十秒後に下記のような警告が発生しました…。
Could not signal service com.apple.WebKit.Networking: 113: Could not find specified service
警告なので無視しても大丈夫そうではありますが…ちょっと気になるので、調べて見てすぐ解決できそうなら対応したいと思います。
以上、Swift の SFSafariViewController で Web ページが表示できない時の対処法でした。
根本的な解決にはなっていませんが…ご参考になれば幸いです。