Xamarin iOS モバイル アプリのオフライン同期を有効にするEnable offline sync for your Xamarin.iOS mobile app


Visual Studio App Center は、モバイル アプリ開発の中心となるエンド ツー エンドの統合サービスをサポートしています。Visual Studio App Center supports end to end and integrated services central to mobile app development. 開発者は、ビルドテスト配布のサービスを使用して、継続的インテグレーションおよびデリバリー パイプラインを設定できます。Developers can use Build, Test and Distribute services to set up Continuous Integration and Delivery pipeline. アプリがデプロイされたら、開発者は分析および診断のサービスを利用してアプリの状態と使用状況を監視し、プッシュ サービスを利用してユーザーと関わることができます。Once the app is deployed, developers can monitor the status and usage of their app using the Analytics and Diagnostics services, and engage with users using the Push service. また、開発者は Auth を利用してユーザーを認証し、データ サービスを利用してクラウド内のアプリ データを保持および同期することもできます。Developers can also leverage Auth to authenticate their users and Data service to persist and sync app data in the cloud.

モバイル アプリケーションにクラウド サービスを統合することを検討している場合は、今すぐ App Center にサインアップしてください。If you are looking to integrate cloud services in your mobile application, sign up with App Center today.


このチュートリアルでは、Xamarin iOS 向けの Azure モバイル アプリのオフライン同期機能について説明します。This tutorial introduces the offline sync feature of Azure Mobile Apps for Xamarin.iOS. オフライン同期を使用すると、エンド ユーザーはネットワークにアクセスできなくても、データの表示、追加、変更など、モバイル アプリケーションとやり取りできます。Offline sync allows end users to interact with a mobile app--viewing, adding, or modifying data--even when there is no network connection. 変更は、ローカル データベースに格納されます。Changes are stored in a local database. デバイスが再びオンラインになると、これらの変更がリモート サービスと同期されます。Once the device is back online, these changes are synced with the remote service.

このチュートリアルでは、「Xamarin.iOS アプリを作成する」で作成した Xamarin iOS アプリ プロジェクトを更新し、Azure Mobile Apps のオフライン機能をサポートできるようにします。In this tutorial, update the Xamarin.iOS app project from Create a Xamarin iOS app to support the offline features of Azure Mobile Apps. ダウンロードしたクイック スタートのサーバー プロジェクトを使用しない場合は、データ アクセス拡張機能パッケージをプロジェクトに追加する必要があります。If you do not use the downloaded quick start server project, you must add the data access extension packages to your project. サーバーの拡張機能パッケージの詳細については、「 Work with the .NET backend server SDK for Azure Mobile Apps (Azure Mobile Apps 用の .NET バックエンド サーバー SDK を操作する)」を参照してください。For more information about server extension packages, see Work with the .NET backend server SDK for Azure Mobile Apps.

オフラインの同期機能の詳細については、トピック「 Azure Mobile Apps でのオフライン データ同期」をご覧ください。To learn more about the offline sync feature, see the topic Offline Data Sync in Azure Mobile Apps.

オフライン機能をサポートするようにクライアント アプリを更新するUpdate the client app to support offline features

Azure モバイル アプリのオフライン機能を使用すると、オフラインになっている状況でも、ローカル データベースとやり取りすることができます。Azure Mobile App offline features allow you to interact with a local database when you are in an offline scenario. アプリケーションでこれらの機能を使用するには、SyncContext をローカル ストアに初期化します。To use these features in your app, initialize a SyncContext to a local store. [IMobileServiceSyncTable] インターフェイスを使用してテーブルを参照します。Reference your table through the [IMobileServiceSyncTable] interface. SQLite は、デバイス上のローカル ストアとして使用されます。SQLite is used as the local store on the device.

  1. Xamarin.iOS アプリを作成する」チュートリアルで作成したプロジェクトの NuGet パッケージ マネージャーを開き、Microsoft.Azure.Mobile.Client.SQLiteStore NuGet パッケージを検索してインストールします。Open the NuGet package manager in the project that you completed in the Create a Xamarin iOS app tutorial, then search for and install the Microsoft.Azure.Mobile.Client.SQLiteStore NuGet package.
  2. QSTodoService.cs ファイルを開き、#define OFFLINE_SYNC_ENABLED の定義をコメント解除します。Open the QSTodoService.cs file and uncomment the #define OFFLINE_SYNC_ENABLED definition.
  3. クライアント アプリの再構築と実行Rebuild and run the client app. アプリは、オフライン同期を有効にする前と同じように動作します。ただし今度は、オフライン シナリオで使用できるデータがローカル データベースに格納されます。The app works the same as it did before you enabled offline sync. However, the local database is now populated with data that can be used in an offline scenario.

アプリを更新してバックエンドから切断するUpdate the app to disconnect from the backend

ここでは、オフライン状況をシミュレートするために、モバイル アプリ バックエンドへの接続を解除します。In this section, you break the connection to your Mobile App backend to simulate an offline situation. データ項目を追加すると、例外ハンドラーによって、アプリがオフライン モードであることが通知されます。When you add data items, your exception handler tells you that the app is in offline mode. この状態では、新しい項目はローカル ストアに追加され、プッシュが次に接続状態で実行したときに、モバイル アプリ バックエンドに同期されます。In this state, new items added in the local store and will be synced to the mobile app backend when push is next run in a connected state.

  1. 共有プロジェクトの QSToDoService.cs を編集します。Edit QSToDoService.cs in the shared project. applicationURL を、無効な URL を指すように変更します。Change the applicationURL to point to an invalid URL:

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

    また、デバイス上で Wi-Fi および移動体通信ネットワークを無効にするか、機内モードを使用して、オフライン動作をデモンストレーションすることもできます。You can also demonstrate offline behavior by disabling wifi and cellular networks on the device or using airplane mode.

  2. アプリケーションをビルドし、実行します。Build and run the app. アプリを起動した際の更新時には同期が失敗することに注意してください。Notice your sync failed on refresh when the app launched.

  3. 新しい項目を入力し、 [保存] をクリックするたびに [CancelledByNetworkError] ステータスでプッシュが失敗することを確認します。Enter new items and notice that push fails with a [CancelledByNetworkError] status each time you click Save. ただし、新しい todo 項目は、モバイル アプリ バックエンドにプッシュされるまでは、ローカル ストア内に存在します。However, the new todo items exist in the local store until they can be pushed to the mobile app backend. 運用アプリでは、これらの例外を抑制した場合、クライアント アプリはモバイル アプリ バックエンドにまだ接続されているかのように動作します。In a production app, if you suppress these exceptions the client app behaves as if it's still connected to the mobile app backend.

  4. アプリケーションを終了し、再起動して、作成した新しい項目がローカル ストアに保存されていることを確認します。Close the app and restart it to verify that the new items you created are persisted to the local store.

  5. (省略可能) PC に Visual Studio がインストールされている場合は、サーバー エクスプローラーを開きます。(Optional) If you have Visual Studio installed on a PC, open Server Explorer. [Azure] -> [SQL Databases] を選択して、データベースに移動します。Navigate to your database in Azure-> SQL Databases. データベースを右クリックし、 [SQL Server オブジェクト エクスプローラーで開く] を選択します。Right-click your database and select Open in SQL Server Object Explorer. これで SQL データベースのテーブルとその内容を参照できます。Now you can browse to your SQL database table and its contents. バックエンド データベース内のデータが変更されていないことを確認します。Verify that the data in the backend database has not changed.

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

モバイル アプリ バックエンドに再接続するようにアプリケーションを更新するUpdate the app to reconnect your Mobile App backend

ここでは、アプリをモバイル アプリ バックエンドに再接続します。In this section, reconnect the app to the mobile app backend. これは、アプリケーションがオフライン状態から、モバイル アプリ バックエンドとのオンライン状態に移行したことをシミュレートします。This simulates the app moving from an offline state to an online state with the mobile app backend. ネットワーク接続を無効にしてネットワーク破損をシミュレートした場合、コードを変更する必要はありません。If you simulated the network breakage by turning off network connectivity, no code changes are needed. ネットワークを再び有効にします。Turn the network on again. 初めてアプリケーションを実行すると、RefreshDataAsync メソッドが呼び出されます。When you first run the application, the RefreshDataAsync method is called. これが次に SyncAsync を呼び出し、ローカル ストアとバックエンドのデータベースを同期します。This in turn calls SyncAsync to sync your local store with the backend database.

  1. 共有プロジェクトの QSToDoService.cs を開き、applicationURL プロパティの変更を元に戻します。Open QSToDoService.cs in the shared project, and revert your change of the applicationURL property.

  2. アプリケーションを再構築して実行します。Rebuild and run the app. アプリは、OnRefreshItemsSelected メソッドが実行されると、プッシュとプルの操作によって、ローカルでの変更を Azure Mobile Apps バックエンドに同期します。The app syncs your local changes with the Azure Mobile App backend using push and pull operations when the OnRefreshItemsSelected method executes.

  3. (省略可能) SQL Server Object Explorer または Fiddler などの REST ツールを使用して、更新データを表示します。(Optional) View the updated data using either SQL Server Object Explorer or a REST tool like Fiddler. データが同期されるのは、Azure モバイル アプリのバックエンドのデータベースとローカル ストアの間であることに注意してください。Notice the data has been synchronized between the Azure Mobile App backend database and the local store.

  4. アプリケーションで、ローカル ストアで完了させる項目の横にあるチェック ボックスをクリックします。In the app, click the check box beside a few items to complete them in the local store.

    CompleteItemAsyncSyncAsync を呼び出し、完了した各項目をモバイル アプリ バックエンドと同期します。CompleteItemAsync calls SyncAsync to sync each completed item with the Mobile App backend. SyncAsync はプッシュとプルの両方を呼び出します。SyncAsync calls both push and pull. クライアントが変更を行ったテーブルに対してプルを実行するたびに、クライアントの同期コンテキストへのプッシュが常に最初に自動的に実行されますWhenever you execute a pull against a table that the client has made changes to, a push on the client sync context is always executed first automatically. 暗黙的なプッシュは、ローカル ストアのすべてのテーブルとリレーションシップの一貫性を確実に保つためです。The implicit push ensures all tables in the local store along with relationships remain consistent. この動作については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。For more information on this behavior, see Offline Data Sync in Azure Mobile Apps.

クライアント同期コードの確認Review the client sync code

チュートリアル「 Xamarin.iOS アプリを作成する 」を完了した際にダウンロードした Xamarin クライアント プロジェクトには、ローカルの SQLite データベースを使用したオフライン同期をサポートするコードがすでに含まれてます。The Xamarin client project that you downloaded when you completed the tutorial Create a Xamarin iOS app already contains code supporting offline synchronization using a local SQLite database. チュートリアルのコードにすでに含まれているものの概要を示します。Here is a brief overview of what is already included in the tutorial code. 機能の概念的な概要については、「 Azure Mobile Apps でのオフライン データ同期」をご覧ください。For a conceptual overview of the feature, see Offline Data Sync in Azure Mobile Apps.

  • テーブル操作を実行する前に、ローカル ストアを初期化する必要があります。Before any table operations can be performed, the local store must be initialized. QSTodoListViewController.ViewDidLoad()QSTodoService.InitializeStoreAsync() を実行すると、ローカル ストアのデータベースが初期化されます。The local store database is initialized when QSTodoListViewController.ViewDidLoad() executes QSTodoService.InitializeStoreAsync(). このメソッドにより、Azure Mobile Apps クライアント SDK で提供される MobileServiceSQLiteStore クラスを使用して、新しいローカルの SQLite データベースが作成されます。This method creates a new local SQLite database using the MobileServiceSQLiteStore class provided by the Azure Mobile App client SDK.

    DefineTable メソッドを実行すると、提供された型のフィールドに一致するテーブルがローカル ストアに作成されます。この例では、ToDoItem になります。The DefineTable method creates a table in the local store that matches the fields in the provided type, ToDoItem in this case. この型に、リモート データベース内のすべての列を含める必要はありません。The type doesn't have to include all the columns that are in the remote database. 列のサブセットのみ格納できます。It is possible to store just a subset of columns.

      // QSTodoService.cs
      public async Task InitializeStoreAsync()
          var store = new MobileServiceSQLiteStore(localDbPath);
          // Uses the default conflict handler, which fails on conflict
          await client.SyncContext.InitializeAsync(store);
  • QSTodoServicetodoTable メンバーは、IMobileServiceTable ではなく、IMobileServiceSyncTable 型です。The todoTable member of QSTodoService is of the IMobileServiceSyncTable type instead of IMobileServiceTable. IMobileServiceSyncTable は、テーブルの作成、読み取り、更新、削除 (CRUD) などのすべての操作がローカル ストア データベースに対して行われるようにします。The IMobileServiceSyncTable directs all create, read, update, and delete (CRUD) table operations to the local store database.

    IMobileServiceSyncContext.PushAsync()を呼び出すことによって、これらの変更がいつ Azure モバイル アプリ バックエンドにプッシュされるかを決定します。You decide when those changes are pushed to the Azure Mobile App backend by calling IMobileServiceSyncContext.PushAsync(). 同期コンテキストは、 PushAsync が呼び出されたときに、クライアント アプリが変更を行ったすべてのテーブルで、変更を追跡およびプッシュすることで、テーブルの関係を保持するのに役立ちます。The sync context helps preserve table relationships by tracking and pushing changes in all tables a client app has modified when PushAsync is called.

    todoitem リストの更新、または todoitem の追加や完了があれば、提供されているコードは QSTodoService.SyncAsync() を呼び出して同期します。The provided code calls QSTodoService.SyncAsync() to sync whenever the todoitem list is refreshed or a todoitem is added or completed. アプリは、ローカルの変更があるたびに同期されます。The app syncs after every local change. コンテキストによって追跡された保留中のローカル更新のあるテーブルに対してプルが実行される場合、そのプル操作はコンテキストのプッシュを最初に自動的にトリガーします。If a pull is executed against a table that has pending local updates tracked by the context, that pull operation will automatically trigger a context push first.

    提供されたコードでは、リモートの TodoItem テーブルのすべてのレコードはクエリされますが、クエリ ID やクエリを PushAsync に渡すことでレコードをフィルター処理することも可能です。In the provided code, all records in the remote TodoItem table are queried, but it is also possible to filter records by passing a query id and query to PushAsync. 詳細については、「 Azure Mobile Apps でのオフライン データ同期 」の「 Azure Mobile Apps でのオフライン データ同期」セクションを参照してください。For more information, see the section Incremental Sync in Offline Data Sync in Azure Mobile Apps.

      // QSTodoService.cs
      public async Task SyncAsync()
              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);

その他のリソースAdditional Resources