今回のエンジニアブログを担当する村田です。
今年のGoogle I/Oにおいて、あるサービスで1つのアナウンスがありました。
それは「Firebaseのofflineサポート」です。
これは早速試すしかありません!!!
前回の「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のやり取りしてみます。
アプリをいったん落とし、offlineの状態で起動してみます。
■ offline機能が無効な場合
サーバーから取得もできないですし、ローカルにもないため、何も表示されません。
■ offline機能有効な場合
サーバーからの取得はできませんが、ローカルにデータがあるので、ローカルに保存した内容が表示されます。
offline中に投稿した内容もローカルに保存され、onlineと共にFirebaseに反映されることも確認できました。
補足
デフォルトでは、10MBのデータがキャッシュ可能です。
もしこのサイズを超えた場合は、使われていないデータから削除するとのことです。
キャッシュサイズを変更する場合は、ConfigのpersistenceCacheSizeBytesプロパティ値で変更できます。
Firebase.defaultConfig().persistenceCacheSizeBytes = <変更後のサイズを指定>
ただ、ソースコードのコメントを見ると、Firebaseを最初に参照する前に1回だけ呼び出す必要がありそうです。
まとめ
以前のSDKは、onlineであることが前提で、offlineでもデータを利用したい場合は自分で処理する必要がありました。
今回のoffline対応により、より使いやすくなったかと思います。
今年もFirebaseから目が離せません!