Activación de la sincronización sin conexión para la aplicación móvil Xamarin.iOSEnable offline sync for your Xamarin.iOS mobile app

Información generalOverview

Este tutorial presenta la característica de sincronización sin conexión de Azure Mobile Apps para Xamarin.iOS.This tutorial introduces the offline sync feature of Azure Mobile Apps for Xamarin.iOS. La sincronización sin conexión permite a los usuarios finales interactuar con una aplicación móvil (ver, agregar o modificar datos), incluso cuando no hay ninguna conexión de red.Offline sync allows end users to interact with a mobile app--viewing, adding, or modifying data--even when there is no network connection. Los cambios se almacenan en una base de datos local.Changes are stored in a local database. Una vez que el dispositivo se vuelve a conectar, estos cambios se sincronizan con el servicio remoto.Once the device is back online, these changes are synced with the remote service.

En este tutorial, actualice el proyecto de la aplicación de Xamarin.iOS de Creación de una aplicación Xamarin.iOS para poder admitir las características sin conexión de 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. Si no usa el proyecto de servidor de inicio rápido descargado, debe agregar paquetes de extensión de acceso de datos al proyecto.If you do not use the downloaded quick start server project, you must add the data access extension packages to your project. Para obtener más información acerca de los paquetes de extensión de servidor, consulte Trabajar con el SDK del servidor back-end de .NET para Aplicaciones móviles de Azure.For more information about server extension packages, see Work with the .NET backend server SDK for Azure Mobile Apps.

Para obtener más información acerca de la característica de sincronización sin conexión, consulte el tema Sincronización de datos sin conexión en Aplicaciones móviles de Azure.To learn more about the offline sync feature, see the topic Offline Data Sync in Azure Mobile Apps.

Actualización de la aplicación cliente para que admita características sin conexiónUpdate the client app to support offline features

Las características sin conexión de Aplicaciones móviles de Azure permiten interactuar con una base de datos local cuando el usuario se encuentra en un escenario sin conexión.Azure Mobile App offline features allow you to interact with a local database when you are in an offline scenario. Para usar estas características en una aplicación, inicialice SyncContext en un almacén local.To use these features in your app, initialize a SyncContext to a local store. Haga referencia a la tabla mediante la interfaz [IMobileServiceSyncTable].Reference your table through the [IMobileServiceSyncTable] interface. SQLite se utiliza como almacén local en el dispositivo.SQLite is used as the local store on the device.

  1. Abra el administrador de paquetes NuGet en el proyecto que completó en el tutorial de Creación de una aplicación Xamarin.iOS, busque el paquete NuGet Microsoft.Azure.Mobile.Client.SQLiteStore e instálelo.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. Abra el archivo QSTodoService.cs y quite la marca de comentario de la definición de #define OFFLINE_SYNC_ENABLED.Open the QSTodoService.cs file and uncomment the #define OFFLINE_SYNC_ENABLED definition.
  3. Vuelva a compilar la aplicación cliente y ejecútela.Rebuild and run the client app. La aplicación funciona igual que lo hacía antes de habilitar la sincronización sin conexión. Sin embargo, la base de datos se rellena con datos que pueden utilizarse en un escenario sin conexión.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.

Actualización de la aplicación para desconectarla del back-endUpdate the app to disconnect from the backend

En esta sección, se interrumpe la conexión con el back-end de aplicación móvil para simular un escenario sin conexión.In this section, you break the connection to your Mobile App backend to simulate an offline situation. Al agregar elementos de datos, el controlador de excepciones le indicará que la aplicación está en modo sin conexión.When you add data items, your exception handler tells you that the app is in offline mode. En este estado, se agregan nuevos elementos al almacén local y se sincronizarán con el back-end de aplicación móvil cuando se vuelva a ejecutar la inserción en estado conectado.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. Editar QSToDoService.cs en el proyecto compartido.Edit QSToDoService.cs in the shared project. Cambie applicationURL para que apunte a una dirección URL no válida:Change the applicationURL to point to an invalid URL:

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

    Además, puede mostrar el comportamiento sin conexión mediante la deshabilitación de las redes Wi-Fi y móvil en el dispositivo o el uso del modo avión.You can also demonstrate offline behavior by disabling wifi and cellular networks on the device or using airplane mode.

  2. Compile y ejecute la aplicación.Build and run the app. Observe que la sincronización no se pudo actualizar cuando se inició la aplicación.Notice your sync failed on refresh when the app launched.

  3. Escriba nuevos elementos y observe que la operación de inserción produce un error con un estado de [CancelledByNetworkError] cada vez que hace clic en Guardar.Enter new items and notice that push fails with a [CancelledByNetworkError] status each time you click Save. No obstante, los nuevos elementos Todo están en el almacén local hasta que se puedan insertar en el back-end de aplicación móvil.However, the new todo items exist in the local store until they can be pushed to the mobile app backend. En una aplicación de producción, si suprime estas excepciones, la aplicación cliente se comporta como si aún estuviera conectada al back-end de aplicación móvil.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. Cierre la aplicación y reiníciela para comprobar que los nuevos elementos que creó se mantienen en el almacén local.Close the app and restart it to verify that the new items you created are persisted to the local store.

  5. (Opcional) Si Visual Studio está instalado en un equipo, abra Explorador de servidores.(Optional) If you have Visual Studio installed on a PC, open Server Explorer. Vaya a la base de datos en Azure-> SQL Databases.Navigate to your database in Azure-> SQL Databases. Haga clic con el botón derecho en la base de datos y seleccione Abrir en el Explorador de objetos de SQL Server.Right-click your database and select Open in SQL Server Object Explorer. Ahora puede buscar la tabla de base de datos SQL y su contenido.Now you can browse to your SQL database table and its contents. Compruebe que no han cambiado los datos de la base de datos back-end.Verify that the data in the backend database has not changed.

  6. (Opcional) Use una herramienta REST como Fiddler o Postman para consultar el back-end móvil mediante una consulta GET con la forma https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.(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.

Actualización de la aplicación para volver a conectar el back-end de la aplicación móvilUpdate the app to reconnect your Mobile App backend

En esta sección, vuelva a conectar la aplicación al back-end de la aplicación móvil.In this section, reconnect the app to the mobile app backend. De este modo se simula que la aplicación pasa de un estado sin conexión a un estado en línea con el back-ende de aplicación móvil.This simulates the app moving from an offline state to an online state with the mobile app backend. Si ha simulado daños en la red mediante la desactivación de la conectividad de red, no se necesitan cambios en el código.If you simulated the network breakage by turning off network connectivity, no code changes are needed. Vuelva a activar la red.Turn the network on again. La primera vez que se ejecuta la aplicación, se realiza una llamada al método RefreshDataAsync.When you first run the application, the RefreshDataAsync method is called. Este, a su vez, llama a SyncAsync para sincronizar el almacén local con la base de datos back-end.This in turn calls SyncAsync to sync your local store with the backend database.

  1. Abra QSToDoService.cs en el proyecto compartido y revierta el cambio de la propiedad applicationURL.Open QSToDoService.cs in the shared project, and revert your change of the applicationURL property.

  2. Recompile y ejecute la aplicación.Rebuild and run the app. La aplicación sincroniza los cambios locales con el back-end de Azure Mobile App mediante operaciones de inserción e incorporación de cambios cuando se ejecuta el método OnRefreshItemsSelected.The app syncs your local changes with the Azure Mobile App backend using push and pull operations when the OnRefreshItemsSelected method executes.

  3. (Opcional) Vea los datos actualizados mediante el Explorador de objetos de SQL Server o una herramienta REST como Fiddler.(Optional) View the updated data using either SQL Server Object Explorer or a REST tool like Fiddler. Observe que los datos se han sincronizado entre la base de datos del back-end de la aplicación móvil de Azure y el almacén local.Notice the data has been synchronized between the Azure Mobile App backend database and the local store.

  4. En la aplicación, haga clic en la casilla situada junto a algunos elementos para completarlos en el almacén local.In the app, click the check box beside a few items to complete them in the local store.

    CompleteItemAsync llama a SyncAsync para sincronizar cada elemento completado con el back-end de Mobile App.CompleteItemAsync calls SyncAsync to sync each completed item with the Mobile App backend. SyncAsync llama a las operaciones de inserción y extracción.SyncAsync calls both push and pull. Cada vez que se ejecuta una incorporación de cambios en una tabla en la que el cliente ha realizado cambios, primero se ejecuta una inserción de forma automática en el contexto de sincronización del cliente.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. La inserción implícita garantiza la coherencia de todas las tablas del almacén local, junto con sus relaciones.The implicit push ensures all tables in the local store along with relationships remain consistent. Para obtener más información sobre este comportamiento, consulte Sincronización de datos sin conexión en Aplicaciones móviles de Azure.For more information on this behavior, see Offline Data Sync in Azure Mobile Apps.

Revisión del código de sincronización de clienteReview the client sync code

El proyecto de cliente de Xamarin que descargó cuando completó el tutorial Creación de una aplicación Xamarin.iOS ya contiene el código que admite la sincronización sin conexión con una base de datos SQLite local.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. Esta es una breve descripción de lo que ya está incluido en el código del tutorial.Here is a brief overview of what is already included in the tutorial code. Para obtener información general conceptual de la característica, consulte Sincronización de datos sin conexión en Aplicaciones móviles de Azure.For a conceptual overview of the feature, see Offline Data Sync in Azure Mobile Apps.

  • Antes de poder realizar cualquier operación de tabla, se debe inicializar el almacén local.Before any table operations can be performed, the local store must be initialized. La base de datos del almacén local se inicializa cuando QSTodoListViewController.ViewDidLoad() ejecuta QSTodoService.InitializeStoreAsync().The local store database is initialized when QSTodoListViewController.ViewDidLoad() executes QSTodoService.InitializeStoreAsync(). Este método crea una nueva base de datos SQLite local mediante la clase MobileServiceSQLiteStore que proporciona el SDK del cliente de Azure Mobile App.This method creates a new local SQLite database using the MobileServiceSQLiteStore class provided by the Azure Mobile App client SDK.

    El método DefineTable crea una tabla en el almacén local que coincide con los campos del tipo proporcionado, ToDoItem en este caso.The DefineTable method creates a table in the local store that matches the fields in the provided type, ToDoItem in this case. El tipo no tiene que incluir todas las columnas que se encuentran en la base de datos remota.The type doesn't have to include all the columns that are in the remote database. Es posible almacenar solo un subconjunto de columnas.It is possible to store just a subset of columns.

      // 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);
      }
    
  • El miembro todoTable de QSTodoService es del tipo IMobileServiceSyncTable en lugar de IMobileServiceTable.The todoTable member of QSTodoService is of the IMobileServiceSyncTable type instead of IMobileServiceTable. IMobileServiceSyncTable dirige todas las operaciones de la tabla de creación, lectura, actualización y eliminación (CRUD) a la base de datos del almacén local.The IMobileServiceSyncTable directs all create, read, update, and delete (CRUD) table operations to the local store database.

    Decida cuándo desea que dichos cambios pasen al back-end de Azure Mobile App, mediante una llamada aIMobileServiceSyncContext.PushAsync().You decide when those changes are pushed to the Azure Mobile App backend by calling IMobileServiceSyncContext.PushAsync(). El contexto de sincronización ayuda a mantener las relaciones entre tablas mediante el seguimiento y la inserción de los cambios en todas las tablas modificadas por una aplicación cliente cuando se llama a 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.

    El código proporcionado llama a QSTodoService.SyncAsync() para sincronizarse cada vez que se actualiza la lista todoitem o se agrega o completa un todoitem.The provided code calls QSTodoService.SyncAsync() to sync whenever the todoitem list is refreshed or a todoitem is added or completed. La aplicación se sincroniza inmediatamente después de cada cambio local.The app syncs after every local change. Si se ejecuta una incorporación de cambios en una tabla que tiene actualizaciones locales pendientes seguidas por el contexto, la operación desencadenará primero una inserción de contexto automáticamente.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.

    En el ejemplo proporcionado, se consultan todos los registros de la tabla TodoItem remota, pero también es posible filtrar registros pasando un identificador de consulta y una consulta a 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. Para más información, consulte la sección Sincronización incremental en Sincronización de datos sin conexión en Aplicaciones móviles de Azure.For more information, see the section Incremental Sync in Offline Data Sync in 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);
          }
      }
    

Recursos adicionalesAdditional Resources