19
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

仙台iOS開発者勉強会(SWWDC)Advent Calendar 2014

Day 18

UIWebViewとWKWebViewを切り替える仕組みを試作してみた。

Last updated at Posted at 2014-12-18

UIWebView vs WKWebView

以前から、Webページを表示するにはUIWebViewが使用されてきました。ただ、iOS 8から導入されたWKWebViewというのがありまして、こちらのほうがJavaScriptの実行が速かったりするなど、色々と改善されているようです。

そういうことなら、すぐにWKWebViewに移行したいところですが、iOS 7では使用できません。iOS7以前では、UIWebViewを使用する必要があります。

また、UIWebViewとWKWebViewでは、delegateメソッドが微妙に異なるので、両対応をしようとすると両方のdelegateメソッドを書かなくてはならず、手間がかかります。

作ってみた

というわけで、UIWebViewとWKWebViewを自動切り替えする仕組みを作ってみました。

ソースはこちら

とは言え、WebViewのフル機能に対応するのは面倒なので、必要な機能のみに絞っています。

今回作ったのは、以下の機能だけです。

  • URL request設定
  • URLを開くかどうかの判定(カスタムスキーム用)
  • ローディング開始
  • ローディング終了
  • ローディングエラー

作っては見たものの、いまいち自信がないので、誰か改良してくださらないですかね |д゚)チラッ
(特に、UIViewを挟んでいるのが、よろしくない気がする。)

ちょっと説明

名前がTOTWebViewというわりに、そのものはWebViewではなくUIViewを継承しています。 で、 initのところでSubViewとして UIWebView or WKWebViewを追加しています。

    if ([WKWebView class]) {
        _wkWebView = [[WKWebView alloc] initWithFrame:frame];
        _wkWebView.navigationDelegate = self;
        _wkWebView.UIDelegate = self;
        [self addSubview:_wkWebView];

    } else {
        _uiWebView = [[UIWebView alloc] init];
        _uiWebView.delegate = self;
        [self addSubview:_uiWebView];
    }

あとは、UIWebViewとWKWebViewの両方のdelegateメソッドを用意しておいて、その中身で独自に定義したDelegate を返すようにしています。

// 独自定義の delegate
@protocol TOTWebViewDelegate
- (BOOL)shouldStartLoadWithURL:(NSURL*)url;
- (void)didStartLoading;
- (void)didFinishLoading;
- (void)didFailLoadingWithError:(NSError*)error;
@end

WKWebViewだと、Webサイト読み込みにプログレスが取れたりするのですが、UIWebViewだと取れません。なので、機能が低い方に合わせることにします。

WKWebView雑感など

今回は、アプリの中でWebViewを使用するという要件があって、このような調査をしてみた次第です。

ただ、WKWebView はまだまだノウハウが少なく、これまで長年使われてきたUIWebViewに比べるとだいぶ差があります。普通にWeb閲覧用途で使用するには問題無いとは思うのですが、Cookieを独自で設定するだとか、そういうちょっと凝ったことをしようとすると、調査に骨が折れます。

あと、テストも手間を考えると、なかなか両対応には踏み出せないところもあります。

というわけで、両対応する仕組みを作ってみたものの、結局はUIWebViewのみで作ることになったのでした。

参考サイト

19
22
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?