ios WKWebViewでWebViewアプリの作り方まとめとく
iOSで簡単なWebViewアプリの作るときに必要そうなことまとめておく。以下のiOS版
android WebViewアプリの作り方まとめとく - とりあえずphpとか
WKWebViewを作ってサイトを表示する
ViewController
import UIKit
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView = WKWebView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
view.addSubview(webView)
let request = URLRequest(url: URL(string: "https://www.google.com")!)
webView.load(request)
}
}
クッキーの値を取得する
スワイプでブラウザバック
webView.allowsBackForwardNavigationGestures = true
メールや電話の起動リンクに対応
class ViewController: UIViewController, WKNavigationDelegate {
・・・
override func viewDidLoad() {
・・・
webView.navigationDelegate = self
・・・
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard let url = navigationAction.request.url else {
return
}
if navigationAction.navigationType == .linkActivated {
if url.scheme == "mailto" || url.scheme == "tel" {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
decisionHandler(.cancel)
return
}
}
decisionHandler(.allow)
}
}
SSLエラーやhttpとhttpsの混在ページを読み込む
info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>ViewController
class ViewController: UIViewController, WKNavigationDelegate {
・・・
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void) {
if challenge.protectionSpace.host == "example.com" && challenge.protectionSpace.serverTrust != nil {
let credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
completionHandler(.useCredential, credential)
} else {
completionHandler(.performDefaultHandling, nil)
}
}
}
Pull To Refreshを実装する
class ViewController: UIViewController, WKNavigationDelegate {
var webView: WKWebView!
var refreshControll: UIRefreshControl!
override func viewDidLoad() {
・・・
refreshControll = UIRefreshControl()
self.webView.scrollView.refreshControl = refreshControll
refreshControll.addTarget(self, action: #selector(ViewController.refresh(sender:)), for: .valueChanged)
・・・
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
self.refreshControll.endRefreshing()
}
@objc func refresh(sender: UIRefreshControl) {
guard let url = webView.url else {
return
}
webView.load(URLRequest(url: url))
}
}
他のサイトは表示したくない
class ViewController: UIViewController, WKNavigationDelegate {
・・・
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
・・・
if url.host != "example.com" {
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
}
全ソース
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
var webView: WKWebView!
var refreshControll: UIRefreshControl!
override func viewDidLoad() {
super.viewDidLoad()
webView = WKWebView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
webView.navigationDelegate = self
webView.allowsBackForwardNavigationGestures = true
refreshControll = UIRefreshControl()
self.webView.scrollView.refreshControl = refreshControll
refreshControll.addTarget(self, action: #selector(ViewController.refresh(sender:)), for: .valueChanged)
view.addSubview(webView)
let url = "https://example.com"
let request = URLRequest(url: URL(string: url)!)
webView.load(request)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard let url = navigationAction.request.url else {
return
}
if navigationAction.navigationType == .linkActivated {
if url.scheme == "mailto" || url.scheme == "tel" {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
decisionHandler(.cancel)
return
}
}
if url.host != "example.com" {
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void) {
if challenge.protectionSpace.host == "example.com" && challenge.protectionSpace.serverTrust != nil {
let credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
completionHandler(.useCredential, credential)
} else {
completionHandler(.performDefaultHandling, nil)
}
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
self.refreshControll.endRefreshing()
}
@objc func refresh(sender: UIRefreshControl) {
guard let url = webView.url else {
return
}
webView.load(URLRequest(url: url))
}
}