Windows アプリのオフライン同期を有効にする

概要

このチュートリアルでは、Azure Mobile App バックエンドを使用して、ユニバーサル Windows プラットフォーム (UWP) アプリにオフライン サポートを追加する方法について説明します。 オフライン同期を使用すると、エンド ユーザーはネットワークにアクセスできなくても、データの表示、追加、変更など、モバイル アプリケーションとやり取りできます。 変更は、ローカル データベースに格納されます。 デバイスが再びオンラインになると、これらの変更がリモート バックエンドと同期されます。

このチュートリアルでは、「Create a Windows app (Windows アプリの作成)」チュートリアルからの UWP アプリ プロジェクトを更新し、Azure Mobile Apps のオフライン機能をサポートできるようにします。 ダウンロードしたクイック スタートのサーバー プロジェクトを使用しない場合は、データ アクセス拡張機能パッケージをプロジェクトに追加する必要があります。 サーバーの拡張機能パッケージの詳細については、「 Work with the .NET backend server SDK for Azure Mobile Apps (Azure Mobile Apps 用の .NET バックエンド サーバー SDK を操作する)」を参照してください。

オフラインの同期機能の詳細については、トピック「 Azure Mobile Apps でのオフライン データ同期」をご覧ください。

必要条件

このチュートリアルの前提条件は次のとおりです。

オフライン機能をサポートするようにクライアント アプリを更新する

Azure モバイル アプリのオフライン機能を使用すると、オフラインになっている状況でも、ローカル データベースとやり取りすることができます。 アプリケーションでこれらの機能を使用するには、SyncContext をローカル ストアに初期化します。 次に、IMobileServiceSyncTable インターフェイスを使用してテーブルを参照します。 SQLite は、デバイス上のローカル ストアとして使用されます。

  1. ユニバーサル Windows プラットフォーム用の SQLite ランタイムをインストールします。

  2. Visual Studio で、「Create a Windows app (Windows アプリの作成)」チュートリアルで完了した UWP アプリ プロジェクトの NuGet パッケージ マネージャーを開きます。 Microsoft.Azure.Mobile.Client.SQLiteStore NuGet パッケージを検索してインストールします。

  3. ソリューション エクスプローラーで、[参照>の追加]を右クリックします。..>ユニバーサル Windows>拡張機能を使用し、ユニバーサル Windows プラットフォーム用の SQLite と、ユニバーサル Windows プラットフォームアプリ用の Visual C++ 2015 ランタイムの両方を有効にします。

    SQLite UWP リファレンスを追加する

  4. MainPage.xaml.cs ファイルを開き、#define OFFLINE_SYNC_ENABLEDの定義をコメント解除します。

  5. Visual Studio で、 F5 キーを押してクライアント アプリをリビルドして実行します。 アプリは、オフライン同期を有効にする前と同じように動作します。ただし今度は、オフライン シナリオで使用できるデータがローカル データベースに格納されます。

アプリを更新してバックエンドから切断する

ここでは、オフライン状況をシミュレートするために、モバイル アプリ バックエンドへの接続を解除します。 データ項目を追加すると、例外ハンドラーによって、アプリがオフライン モードであることが通知されます。 この状態では、新しい項目はローカル ストアに追加され、プッシュが次に接続状態で実行したときに、モバイル アプリ バックエンドに同期されます。

  1. 共有プロジェクトで App.xaml.cs を編集します。 MobileServiceClient の初期化をコメント アウトし、無効なモバイル アプリ URL を使用する次の行を追加します。

      public static MobileServiceClient MobileService = new MobileServiceClient("https://your-service.azurewebsites.fail");
    

    また、デバイス上で Wi-Fi および移動体通信ネットワークを無効にしてオフライン動作をデモンストレーションすることも、機内モードを使用することもできます。

  2. F5 キーを押し、アプリケーションをビルドして実行します。 アプリを起動した際の更新時には同期が失敗することに注意してください。

  3. 新しい項目を入力し、 MobileServicePushFailedException をクリックするたびに CancelledByNetworkErrorステータスでプッシュが失敗することを確認します。 ただし、新しい todo 項目は、モバイル アプリ バックエンドにプッシュされるまでは、ローカル ストア内に存在します。 運用アプリでは、これらの例外を抑制した場合、クライアント アプリはモバイル アプリ バックエンドにまだ接続されているかのように動作します。

  4. アプリケーションを終了し、再起動して、作成した新しい項目がローカル ストアに保存されていることを確認します。

  5. (省略可能) Visual Studio で、 サーバー エクスプローラーを開きます。 Azure-SQL> Database のデータベースに移動します。 データベースを右クリックし、 [SQL Server オブジェクト エクスプローラーで開く] を選択します。 これで SQL データベースのテーブルとその内容を参照できます。 バックエンド データベース内のデータが変更されていないことを確認します。

  6. (省略可能) Fiddler や Postman などの REST ツールを使用して、モバイルのバックエンドをクエリします。その際、https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem の形式で、GET クエリを使用します。

モバイル アプリ バックエンドに再接続するようにアプリケーションを更新する

ここでは、アプリをモバイル アプリ バックエンドに再接続します。 これらの変更は、アプリでのネットワークの再接続をシミュレートしています。

初めてアプリケーションを実行すると、OnNavigatedTo イベント ハンドラーが InitLocalStoreAsync を呼び出します。 このメソッドが次に SyncAsync を呼び出し、ローカル ストアとバックエンドのデータベースを同期します。 アプリは起動時に同期しようとします。

  1. 共有プロジェクトで App.xaml.cs を開き、正しいモバイル アプリ URL を使用するために以前の MobileServiceClient の初期化をコメント解除します。

  2. F5 キーを押して、アプリケーションをリビルドして実行します。 アプリは、OnNavigatedTo イベント ハンドラーが実行されると、プッシュとプルの操作によって、ローカルでの変更を Azure Mobile Apps バックエンドに同期します。

  3. (省略可能) SQL Server Object Explorer または Fiddler などの REST ツールを使用して、更新データを表示します。 データが同期されるのは、Azure モバイル アプリのバックエンドのデータベースとローカル ストアの間であることに注意してください。

  4. アプリケーションで、ローカル ストアで完了させる項目の横にあるチェック ボックスをクリックします。

    UpdateCheckedTodoItemSyncAsync を呼び出し、完了した各項目をモバイル アプリ バックエンドと同期します。 SyncAsync はプッシュとプルの両方を呼び出します。 ただし、クライアントが変更したテーブルに対してプルを実行するたびに、プッシュが常に自動的に実行されます。 この動作は、ローカル ストアのすべてのテーブルとリレーションシップの一貫性を確実に保つためです。 この動作によって、予期しないプッシュが行われることがあります。 この動作については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。

API の概要

モバイル サービスのオフライン機能をサポートするために、IMobileServiceSyncTable インターフェイスを使用し、ローカル SQLite データベースで MobileServiceClient.SyncContext を初期化しました。 オフラインのときは、モバイル アプリに対する通常の CRUD 操作は、アプリケーションはまだ接続されているが、操作はローカル ストアに対して発生したかのように動作します。 ローカル ストアをサーバーと同期するには、次のメソッドを使用します。

  • PushAsync このメソッドは IMobileServicesSyncContext のメンバーなので、すべてのテーブルに対する変更はバックエンドにプッシュされます。 ローカルに変更されたレコードのみが、サーバーに送信されます。
  • PullAsync プルは IMobileServiceSyncTable から開始されます。 テーブルに追跡されている変更がある場合は、ローカル ストア内のすべてのテーブルとリレーションシップの一貫性が保持されるように、暗黙のプッシュが実行されます。 pushOtherTables パラメーターは、コンテキスト内の他のテーブルが暗黙のプッシュでプッシュされるかどうかを制御します。 クエリ パラメーターは、返されたデータをフィルター処理するために IMobileServiceTableQuery<T> または OData クエリ文字列を受け取ります。 queryId パラメーターは、増分同期の定義に使用されます。詳細については、「Azure Mobile Apps でのオフライン データ同期」を参照してください。
  • PurgeAsync アプリはこのメソッドを定期的に呼び出して、ローカル ストアから古いデータを消去する必要があります。 まだ同期されていないすべての変更を消去する必要がある場合は、 force パラメーターを使用します。

これらの概念の詳細については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。

詳細情報

Mobile Apps のオフライン同期機能の詳しい背景情報については、以下のトピックを参照してください。