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をして下さい。
可能な限り対応したいと思ってます!