【iOS8】WKWebViewに対応したときの覚え書き
業務でWebViewの部分をWKWebViewにも対応するラッパクラス(内部でOSのバージョン毎にWKWebViewとUIWebViewを切り替えるもの)をつくったのでそのメモ。
といっても特に大したことはしていない汗
(注:XCode6 GM Seed)
xibからは置けないぽい
UIWebViewはxib上で配置できたけど、WKWebViewはそもそも見当たらなかったのでコードで書いた
認証まわり
ハマりポイント1で、認証まわりがそのままだと動かなくて、下記のnavigationDelegateのメソッドを書いてあげないと動かなかった
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler { //空のままでok }
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; }