読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

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

iOS Swift

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

今年の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から目が離せません!