モバイル用オフライン同期管理 SDK の一般提供開始を発表
このポストは、12 月 18 日に投稿された Announcing General Availability of Mobile Offline Sync Managed SDK の翻訳です。
最新のモバイル アプリを開発する際には、エンド ユーザーが必ずしもネットワークにアクセスできるわけではないという実態を考慮する必要があります。ネットワークにアクセスできない状況は、一時的なネットワーク障害の場合もあれば、モバイル アプリをよく使用する場所が接続の悪い遠隔エリアであるという場合もあります。また、モバイル デバイスのデータ プランは非常に高額になることもあり、ユーザーにはネットワーク通信量の少ないアプリが好まれます。しかし、オフライン時に適切な同期処理を実行するのは難しく、アプリの多くはオフラインでの使用に対応していません。
Azure Mobile Services では iOS、Android、Windows のアプリでネイティブな同期処理エクスペリエンスを簡単に使用することができます。この機能は JavaScript と .NET の両方のバックエンドで利用可能で、Windows Universal (英語)、iOS (英語)、Xamarin iOS、Xamarin Android、Android の各クライアントをサポートしています。
マイクロソフトはこのたび、Windows 用および Xamarin 用のオフライン管理クライアント SDK (英語) の一般提供開始を発表しました。なお、iOS 用と Android 用の SDK は近日中に一般提供の開始を予定しています。
オフライン同期には、次のような多くのメリットがあります。
- サーバーのデータをデバイスにキャッシュすることで、アプリの応答性が向上
- ネットワーク問題が発生しても使用できる、堅牢なアプリを作成可能
- 接続が悪いまたは接続できないなど、ネットワークにアクセス不可能な状況でもデータの作成や変更を実行可能
- 複数のデバイスの間で同期を実行し、2 つのデバイスで同一のレコードが変更された場合に競合を検出
- データ プランに上限があるユーザーのネットワーク使用を制限
アプリがオフライン モードになっている場合でも、ユーザーはデータを作成および修正することができ、データはローカル ストアに保存されます。アプリがオンライン状態に戻ると、ローカルで行った変更が Mobile Services バックエンドと同期されます。また、この機能では、同じレコードがクライアントとバックエンドの両方で変更された場合に競合を検出できます。競合が検出された場合は、サーバーかクライアントのいずれかで処理されます。
Azure ポータルのクイックスタート アプリが更新され、アプリのオフライン機能をさらに簡単に追加できるようになりました。Xamarin.iOS 用および Xamarin.Android 用のクイックスタートでも、新たにオフライン機能が使用できます。Windows には SQLite VSIX (英語) がインストールされている必要があるため、Windows 用のクイックスタートにはオフライン機能のコードがすべて含まれていますが、この部分はコメントアウトされています。
既に Mobile Services を使用している場合は、簡単にオフライン機能をアプリに追加できます。まず、NuGet パッケージの WindowsAzure.MobileServices.SQLiteStore (英語) を追加し、次に、Mobile Services に接続するために GetTable メソッドの代わりに GetSyncTable メソッドを使用します。
IMobileServiceSyncTable todoTable = App.MobileService.GetSyncTable(); // offline access
次に、ローカルの同期ストアを設定します。このコードは、たとえば OnNavigatedTo などのイベント ハンドラーに含めることができます。独自の同期ストアを定義することも、提供された SQLite ベースの実装を使用することも可能です。
if (!App.MobileService.SyncContext.IsInitialized)
{
var store = new MobileServiceSQLiteStore("localsync.db");
store.DefineTable();
await App.MobileService.SyncContext.
InitializeAsync(store, new MobileServiceSyncHandler());
}
これで、アプリの CRUD 操作に (IMobileServiceTable ではなく) IMobileServiceSyncTable が使用されるようになります。その結果、ローカル データベースへの変更が保存され、変更内容のログも記録されます。アプリの変更内容を Mobile Services と同期する準備ができたタイミングで、PushAsync および PullAsync メソッドを使用します。
await App.MobileService.SyncContext.PushAsync();
await todoTable.PullAsync("queryID", myQuery);
PullAsync メソッドでは、最初のパラメーターがクエリ ID として認識されます。クエリ ID とはアプリのクエリを一意に識別する文字列で、増分同期を実行するときや、最後のプル操作の結果の最終更新のタイムスタンプを保存するときに使用します。
増分同期を使用しない場合は、クエリ ID として null を渡します。この場合、PullAsync を呼び出すたびにすべてのレコードが取得されますが、この方法はあまり効率がよくありません。
クエリを PullAsync に渡して、デバイスにレコードの一部のみを保存するようにすることもできます。ただし、クエリにパラメーターが存在する場合、このパラメーター値はクエリ ID の一部と同一である必要があります。
詳細については、Windows (英語) および Xamarin のオフライン機能のチュートリアルをご覧ください。
上記のコードではユニバーサル アプリを対象としましたが、iOS (英語) および Android のアプリでも同様に、簡単にオフライン同期機能を追加できます。
この機能の詳細については、下記のリンク先の資料をご確認ください。
- チュートリアル: Windows 用 (英語)、Xamarin iOS 用、Xamarin Android 用、iOS 用 (英語)、Android 用
- オフライン同期機能に関するビデオ: Azure Friday (英語)、Cloud Cover (英語)
- Xamarin のサンプル: iOS 用 (英語)、Android 用 (英語)、Xamarin Forms 用 (英語)
- ソリューション アクセラレータ: Field Engineer (英語) (Windows ストア)