エンジニア

Firebaseのoffline機能を使ってみよう!

投稿日:2015年6月23日 更新日:

今回のエンジニアブログを担当する村田です。

今年のGoogle I/Oにおいて、あるサービスで1つのアナウンスがありました。

それは「Firebaseのofflineサポート」です。
スクリーンショット 2015-06-20 15.01.46

これは早速試すしかありません!!!

前回の「FirebaseでiOSアプリを作ってみよう!」をoffline対応してみたいと思います。

SDKの更新

iOSの場合は、Ver.2.3.0で対応されました。
Ver.2.3.0より古い場合は更新しましょう。
2015/06/20時点での最新バージョンは、2.3.1です。

※ AndroidもVer.2.3.0でoffline対応されました。

今回もSwiftで実装していきます。

実装

offline対応をしていきます。
offline対応、つまりローカルに保存するには次の1行を追加するだけで実現できます。

ConfigのpersistenceEnabledプロパティ値をtrueにすること。

    Firebase.defaultConfig().persistenceEnabled = true

また、offlineで利用するために、あらかじめプリフェッチする場合は、
FirebaseクラスのkeepSyncedメソッドにtrueを渡します。

    var ref = Firebase(url: "https://xxxxxx.firebaseio.com")
    ref.keepSynced(true)

これらを前回の「FirebaseでiOSアプリを作ってみよう!」に組み込むと、次のようになります。
※ ハイライトが今回追加した処理です。

override func viewDidLoad() {
    super.viewDidLoad()
    // Nameにラベルを設定  
    self.nameLabel.text = "Guest\(arc4random() % 10)"
    // Return時のイベントをハンドルするために登録  
    self.inputField.delegate = self

    // Firebase offline対応  
    Firebase.defaultConfig().persistenceEnabled = true;

    // Firebaseへ接続  
    self.myRootRef = Firebase(url: "https://blog-sample.firebaseio.com/chat1/posts")
    // Firebaseのプリフェッチを有効に  
    self.myRootRef.keepSynced(true)

    // Child追加時のイベントハンドラ  
    self.myRootRef.observeEventType(.ChildAdded, withBlock: { snapshot in
        if let name = snapshot.value.objectForKey("name") as? String {
            if let data = snapshot.value.objectForKey("data") as? String {
                self.textView.text = "\(self.textView.text)\n\(name) -> \(data)"
            }
        }
    })
    // 接続直後に呼び出されるイベントハンドラ  
    self.myRootRef.observeEventType(.Value, withBlock: { snapshot in
        if let isNull = snapshot.value as? NSNull {
            return
        }

        if let name = snapshot.value.objectForKey("name") as? String {
            if let data = snapshot.value.objectForKey("data") as? String {
                self.textView.text = "\(self.textView.text)\n\(name) -> \(data)"
            }
        }
    })
}
動作確認

まず、iPhoneとシミュレーターでonlineのやり取りしてみます。
iOS_Simulator_Screen_Shot_2015_06_20_16_15_05

アプリをいったん落とし、offlineの状態で起動してみます。

■ offline機能が無効な場合
サーバーから取得もできないですし、ローカルにもないため、何も表示されません。
iOS_Simulator_Screen_Shot_2015_06_20_16_15_18

■ offline機能有効な場合
サーバーからの取得はできませんが、ローカルにデータがあるので、ローカルに保存した内容が表示されます。
iOS_Simulator_Screen_Shot_2015_06_20_16_15_05

offline中に投稿した内容もローカルに保存され、onlineと共にFirebaseに反映されることも確認できました。

補足

デフォルトでは、10MBのデータがキャッシュ可能です。
もしこのサイズを超えた場合は、使われていないデータから削除するとのことです。
キャッシュサイズを変更する場合は、ConfigのpersistenceCacheSizeBytesプロパティ値で変更できます。

Firebase.defaultConfig().persistenceCacheSizeBytes = <変更後のサイズを指定>

ただ、ソースコードのコメントを見ると、Firebaseを最初に参照する前に1回だけ呼び出す必要がありそうです。

まとめ

以前のSDKは、onlineであることが前提で、offlineでもデータを利用したい場合は自分で処理する必要がありました。
今回のoffline対応により、より使いやすくなったかと思います。
今年もFirebaseから目が離せません!

採用情報

ワンダープラネットでは、一緒に働く仲間を幅広い職種で募集しております。

-エンジニア
-,

© WonderPlanet Inc.