【iOS8】WKWebViewに対応したときの覚え書き

業務でWebViewの部分をWKWebViewにも対応するラッパクラス(内部でOSのバージョン毎にWKWebViewとUIWebViewを切り替えるもの)をつくったのでそのメモ。
といっても特に大したことはしていない汗

(注:XCode6 GM Seed)

WebKit.frameworkをリンクする

Build PhasesのLink Binary with LibrariesでWebKit.frameworkをリンクする

xibからは置けないぽい

UIWebViewはxib上で配置できたけど、WKWebViewはそもそも見当たらなかったのでコードで書いた

delegateをセットする

delegateが2つになった

_webView.navigationDelegate = self;
_webView.UIDelegate = self;

認証まわり

ハマりポイント1で、認証まわりがそのままだと動かなくて、下記のnavigationDelegateのメソッドを書いてあげないと動かなかった

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
    //空のままでok
}

参考URL
ios - WKWebView and authentication - Stack Overflow

delegateまわり

フック

ハマりポイント2で、webから処理をフックするところに書いてた処理は

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    //
}

から

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    //
}

あとその中で

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    decisionHandler(WKNavigationActionPolicyAllow); //これいれないとcrashする
}

これをいれないと以下のようなエラーでクラッシュするので注意

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Completion handler passed to -[NTENoteDetailWebViewController webView:decidePolicyForNavigationAction:decisionHandler:] was not called'

というかUIWebViewのほうで返り値でBOOLを返していたものに該当するもの(という認識であってるはず)

- (void)webViewDidStartLoad:(UIWebView *)webView
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

から

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}