次の方法で共有


Xamarin.iOS モバイル アプリのオフライン同期を有効にする

概要

このチュートリアルでは、Xamarin.iOS 用 Azure Mobile Apps のオフライン同期機能について説明します。 オフライン同期を使用すると、エンド ユーザーは、ネットワーク接続がない場合でも、モバイル アプリの表示、追加、変更など、データを操作できます。 変更はローカル データベースに格納されます。 デバイスがオンラインに戻ると、これらの変更はリモート サービスと同期されます。

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

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

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

Azure Mobile App のオフライン機能を使用すると、オフライン シナリオの場合にローカル データベースと対話できます。 アプリでこれらの機能を使用するには、 SyncContext をローカル ストアに初期化します。 [IMobileServiceSyncTable] インターフェイスを使用してテーブルを参照します。 SQLite は、デバイス上のローカル ストアとして使用されます。

  1. Xamarin iOS アプリの作成チュートリアルで完了したプロジェクトで NuGet パッケージ マネージャーを開き、Microsoft.Azure.Mobile.Client.SQLiteStore NuGet パッケージを検索してインストールします。
  2. QSTodoService.cs ファイルを開き、 #define OFFLINE_SYNC_ENABLED 定義のコメントを解除します。
  3. クライアント アプリをリビルドして実行します。 このアプリは、オフライン同期を有効にする前と同じように動作します。ただし、オフライン シナリオで使用できるデータがローカル データベースに設定されるようになりました。

バックエンドから切断するようにアプリを更新する

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

  1. 共有プロジェクトのQSToDoService.csを編集します。 applicationURL を無効な URL を指すよう変更します。

      const string applicationURL = @"https://your-service.azurewebsites.fail";
    

    デバイスで Wi-Fi ネットワークと携帯ネットワークを無効にするか、機内モードを使用して、オフライン動作を示すこともできます。

  2. アプリをビルドして実行します。 アプリの起動時に更新時に同期が失敗したことを確認します。

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

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

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

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

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

このセクションでは、アプリをモバイル アプリ バックエンドに再接続します。 これにより、モバイル アプリ バックエンドを使用して、アプリがオフライン状態からオンライン状態に移行することをシミュレートします。 ネットワーク接続をオフにしてネットワークの破損をシミュレートした場合、コードの変更は必要ありません。 ネットワークをもう一度オンにします。 アプリケーションを初めて実行すると、 RefreshDataAsync メソッドが呼び出されます。 これにより、 SyncAsync が呼び出され、ローカル ストアがバックエンド データベースと同期されます。

  1. 共有プロジェクトでQSToDoService.csを開き、 applicationURL プロパティの変更を元に戻します。

  2. アプリをリビルドして実行します。 アプリは、 OnRefreshItemsSelected メソッドの実行時にプッシュ操作とプル操作を使用して、ローカルの変更を Azure Mobile App バックエンドと同期します。

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

  4. アプリで、いくつかの項目の横にあるチェック ボックスをクリックして、ローカル ストアで完了します。

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

クライアント同期コードを確認する

チュートリアル「 Xamarin iOS アプリの作成 」を完了したときにダウンロードした Xamarin クライアント プロジェクトには、ローカル SQLite データベースを使用したオフライン同期をサポートするコードが既に含まれています。 チュートリアル コードに既に含まれている内容の簡単な概要を次に示します。 この機能の概念の概要については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。

  • テーブル操作を実行する前に、ローカル ストアを初期化する必要があります。 ローカル ストア データベースは、QSTodoListViewController.ViewDidLoad()の実行時QSTodoService.InitializeStoreAsync()初期化されます。 このメソッドは、Azure Mobile App クライアント SDK によって提供される MobileServiceSQLiteStore クラスを使用して、新しいローカル SQLite データベースを作成します。

    DefineTable メソッドは、指定された型のフィールドと一致するテーブルをローカル ストアに作成します (この場合ToDoItem)。 型には、リモート データベース内のすべての列を含める必要はありません。 列のサブセットのみを格納できます。

      // QSTodoService.cs
    
      public async Task InitializeStoreAsync()
      {
          var store = new MobileServiceSQLiteStore(localDbPath);
          store.DefineTable<ToDoItem>();
    
          // Uses the default conflict handler, which fails on conflict
          await client.SyncContext.InitializeAsync(store);
      }
    
  • todoTableQSTodoServiceメンバーは、IMobileServiceSyncTableではなくIMobileServiceTable型です。 IMobileServiceSyncTable は、すべての作成、読み取り、更新、および削除 (CRUD) テーブル操作をローカル ストア データベースに転送します。

    これらの変更が Azure Mobile App バックエンドにプッシュされるタイミングを決定するには、 IMobileServiceSyncContext.PushAsync()を呼び出します。 同期コンテキストは、クライアント アプリが呼び出されたときにクライアント アプリが変更したすべてのテーブルの変更を追跡してプッシュすることで、テーブルのリレーションシップ PushAsync を保持するのに役立ちます。

    指定されたコードは、todoitem リストが更新されるか、todoitem が追加または完了するたびに同期する QSTodoService.SyncAsync() を呼び出します。 アプリは、ローカルの変更後に同期されます。 保留中のローカル更新がコンテキストによって追跡されているテーブルに対してプルが実行されると、そのプル操作によって、最初にコンテキスト プッシュが自動的にトリガーされます。

    指定されたコードでは、リモート TodoItem テーブル内のすべてのレコードがクエリされますが、クエリ ID とクエリを PushAsyncに渡すことでレコードをフィルター処理することもできます。 詳細については、「Azure Mobile Apps でのオフライン データ同期での増分同期」セクションを参照してください。

      // QSTodoService.cs
      public async Task SyncAsync()
      {
          try
          {
              await client.SyncContext.PushAsync();
              await todoTable.PullAsync("allTodoItems", todoTable.CreateQuery()); // query ID is used for incremental sync
          }
    
          catch (MobileServiceInvalidOperationException e)
          {
              Console.Error.WriteLine(@"Sync Failed: {0}", e.Message);
          }
      }
    

その他のリソース