オフラインファーストとは
オフライン状態でコア機能の一部 or 全部が実行できるアプリのことです。
不安定なモバイルデータ通信状態が想定されるシチュエーションは沢山あります。
- 地下鉄や飛行機での移動中
- キャンプや登山などのアクティビティ中
- 災害時
その中でもアプリのコア機能を実行できるようにしようというお話です。
具体例
Spotify
Spotify ではオフラインでも保存した楽曲を再生することができます。
つまり、音楽再生機能という Spotify のメイン機能を、オフラインで使用することができます。
ホーム画面はオフラインでも楽曲のジャケットが表示されます。
ボトムナビゲーションバーにオフラインである表記が追加されます。
また、プレミアムユーザーが最近聴いた楽曲をオフラインで再生できる機能である、「オフライン・バックアップ」についての項目も表示されます。
Home | マイライブラリ |
---|---|
![]() |
![]() |
Prime Video
ダウンロードタブでは、オフラインでも保存した動画を再生することができます。
つまり、動画再生機能という Prime Video のメイン機能を、オフラインで使用することができます。
ホーム画面はオフラインでも動画のジャケットが表示されます。
画面上部にオフラインである表記が追加されます。
Home | ダウンロード |
---|---|
![]() |
![]() |
同期のタイミングについて
ローカルでデータをもつということは、どこかでサーバ側と同期する必要がでてきます。
公式ドキュメント:オフラインファースト アプリの作成 では、 2 種類紹介されています。
- pull ベース
- 最新のアプリデータをオンデマンドで読み取る
- データを表示する直前にのみデータを取得する
- push ベース
- ローカルデータソースがネットワークデータソースを可能な限り模倣する
- サーバーからの通知を受けてデータ更新を行う
pull ベース | push ベース |
---|---|
![]() |
![]() |
pull ベース画面毎に必要なデータを取得するために通信を行い、それをローカルでも保持しておくイメージのようです。ローカルを気にしないアプリの通信方式と同じなので、何となく想像がつきました。
push ベースはデータが古くなったとき、サーバーからの通知を受けてデータ更新を行うようです。言いたいことはわかりますが、「データが古くなったとき、サーバーからの通知を受ける」とはどのような仕組みを指すのかいまいち想像ができませんでした。
Push ベースでの同期の実装について
調べたところ、NowInAndroid の実装についてのコメントがでてきました。
https://github.com/android/nowinandroid/discussions/886#discussioncomment-6715116
簡単に言えば、Gitのようなバージョン管理を行っているようです。
順序としては以下の通りです。
- API 通信 (バージョン確認を含む)
- 差分を取得
- ローカル更新
つまり、「ローカルでサーバと同様のデータを模倣し、通信時にそのデータの差分のみ取得する方式」のようです。
「サーバーからの通知を受けてデータ更新を行う」と書かれると紛らわしいですが、
アプリからの要求がない限り、サーバーは何も情報を送信していない ようです。
その他具体的な実装方法について
公式にまとめられてます