22
30

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.

[Swift]WebViewをキャッシュでオフライン閲覧

Last updated at Posted at 2016-01-18

オフライン時にもキャッシュからWebViewを表示したかった時の思い出をメモ。
「ウェブページをキャッシュで保存してオフライン閲覧するためのシンプルな実装」
参考にさせていただいたこちらの記事のSwift版(やってることほとんど変わらない...)

##ライブラリ・フレームワーク
####RNCachingURLProtocol
https://github.com/rnapier/RNCachingURLProtocol
NSURLProtocolというネットワークプロトコルをカスタムするライブラリ。
このライブラリを使うと,以下のことが可能に。

  • 初めて読み込んだページは普通に開く
  • 読み込みが完了したらキャッシュする
  • 次回読み込み時,キャッシュがあればそれを読み込む

####SystemConfiguration.framework
デバイスのネットワーク状況を取得することができるフレームワーク。

##実装
###1. フレームワークを入れてからAppDelegateにimport

AppDelegate.swift
import SystemConfiguration

###2. RNCachingURLProtocolをSwiftで使えるようにする
RNCachingURLProtocolはObjective-Cのライブラリなので,Swiftで使えるようにする必要がある。方法は,{プロジェクト名}-Bridging-Header.hを作成し,そこに使うObjective-Cのライブラリのヘッダーファイルをimport。

Bridging-Header.h
#import "RNCachingURLProtocol.h"

###3. NSURLProtocolをRNCachingURLProtocolでカスタム
AppDelegateに NSURLProtocol.registerClass(RNCachingURLProtocol) を記述。この1行でNSURLProtocolが,今回の目的を満たす処理にカスタムされる。

AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        NSURLProtocol.registerClass(RNCachingURLProtocol)
        return true
}

###4. WebViewを普通に表示
1~3までの手順で終わりだが,一応WebViewのコードも。

ViewController.swift
class ViewController: UIViewController {

    @IBOutlet weak var webview: UIWebView!
    
    var url="https://www.google.com/"
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let request=NSURL(string: url)
        let requestURL=NSURLRequest(URL: request!)
        webview.loadRequest(requestURL)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

@IBOutlet weak var webview: UIWebView!はstoryboardに配置したWebViewをcontrol+ドラッグしてコードにドロップしたもの。

####以上でWebViewをオフラインでも扱うことが可能に!

##おまけ
このライブラリだとhttps通信はキャッシュされないようになっている。そのため,https://www.google.com/とか手頃なURLでテストしてた人は,「オフライン時表示されないじゃん!」ってなるはず。(なりました)
https通信をキャッシュしたいなら,RNCachingProtocol.minitializeメソッドの@httpと記述されてる部分を@httpsに書き換えればいい。

##参考
swiftでwebViewアプリを作ってみた

22
30
0

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
22
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?