Otafuku というWKWebViewを簡単に使うためのユーティリティライブラリを先日リリースしました。
GithubとCocoacontrolsで公開してから大分時間が経ちましたが、日本語では告知をしていなかったので、この記事で紹介いたします。(勢いで Misen, Kamagari に続いて作りました。)
Otafuku : Utility classes to use WKWebView in Swift
https://github.com/tasanobu/Otafuku
機能
WebViewUIController
javaScriptの alert, confirm, prompt が実行された場合、ブラウザやUIWebViewのようにアラートを表示するためには、WKUIDelegateプロトコルを実装する必要があります。
また、HTMLのaタグにtarget=_blankが指定されていた場合、WKUIDelegateのメソッドが呼ばれ、新しいViewを開くとか、元のWKWebView上で指定されたURLをロードするかといったハンドリングが必要になります。
WebViewUIController はWKUIDelegateプロトコルを実装し、上記2点をハンドリングします。
次のサンプルコードのように、WebViewUIControllerをViewControllerのプロパティとして宣言し、UIViewController.viewDidLoadでセットして下さい。
あとはWebViewUIControllerがよしなにやります。
class ViewController: UIViewController {
let uiDelegate = WebViewUIController()
override func viewDidLoad() {
super.viewDidLoad()
webView.UIDelegate = uiDelegate
}
}
WebViewPropertyObserver
UIWebViewと異なり、 WKWebViewのプロパティ(progress, title, URL など)はKVOに対応しており、UIを作る際に使いたくなることが多いと思います。
WebViewPropertyObserverを使うと、ViewControllerにKVO用の実装をすることなく、Closureでプロパティ値の変更を受け取ることができます。
Closureで受け取る値はSwiftのenumで実装されたWebViewProperty型の値です。
enum WebViewProperty {
static let keys = ["title", "URL", "estimatedProgress", "canGoBack", "canGoForward", "hasOnlySecureContent", "loading"]
case Title(String?)
case URL(NSURL?)
case CanGoBack(Bool)
case CanGoForward(Bool)
case EstimatedProgress(Float)
case Loading(Bool)
case HasOnlySecureContent(Bool)
}
以下が使い方を説明したサンプルコードです。
- 初期化時、
WKWebViewのインスタンスとプロパティの変更を受け取るClosureを引数に渡して下さい。 - ViewControllerのプロパティとして
WebViewPropertyObserverを宣言し、ViewControllerがリリースされるまでは保持(retain)して下さい。
class ViewController: UIViewController {
@IBOutlet var progressView: UIProgressView!
@IBOutlet var backItem: UIBarButtonItem!
@IBOutlet var forwardItem: UIBarButtonItem!
var propertyObserver: WebViewPropertyObserver?
override func viewDidLoad() {
super.viewDidLoad()
propertyObserver = WebViewPropertyObserver(webView: webView, handler:handleWebViewPropertyChange)
}
func handleWebViewPropertyChange(property: WebViewPropertyObserver.WebViewProperty) {
switch property {
case .Title(let title):
navigationItem.title = title
case .URL(let URL):
// do something with URL
break
case .CanGoBack(let canGoBack):
backItem.enabled = canGoBack
case .CanGoForward(let canGoForward):
forwardItem.enabled = canGoForward
case .EstimatedProgress(let progress):
progressView.progress = progress
case .Loading(let loading):
// do something with loading
break
case .HasOnlySecureContent(let secureContent):
// do something with secureContent
break
}
}
}
システム要件
- iOS 8.0+
- Xcode 6.3+
インストール方法
Cocoapodsを使うと簡単にインストールできます。
Podfileで このライブラリ(Otafuku) を追加し、 pod install or pod update を実行して下さい。
platform :ios, '8.0'
use_frameworks!
pod 'Otafuku'
まとめ
Otafuku が提供しているWKWebViewを使うためのユーティリティクラスの説明をしました。
Otafuku : Utility classes to use WKWebView in Swift
https://github.com/tasanobu/Otafuku
プロジェクトでWKWebViewを使う場合はOtafukuの利用を検討してもらえると嬉しいです。
iOS 9からはSFSafariViewControllerなるものが追加されますので、WKWebViewの立ち位置が微妙になるかと思いますが。。。
不具合や機能改善の要望などあれば、この記事のコメントやGithubのIssue/Pull Requestをして下さい。
可能な限り対応したいと思ってます!