Включение автономной синхронизации для мобильного приложения Xamarin.iOS
Обзор
В этом учебнике представлена функция автономной синхронизации мобильных приложений Azure для Xamarin.iOS. Автономная синхронизация позволяет конечным пользователям взаимодействовать с мобильным приложением — просматривать, добавлять или изменять данные — даже при отсутствии подключения к сети. Изменения сохраняются в локальной базе данных. Как только устройство возвращается в режим подключения к сети, эти изменения синхронизируются с удаленной службой.
Из этого руководства вы узнаете, как обновить проект приложения Xamarin.iOS, описанный в руководстве Создание приложения Xamarin.iOS, чтобы обеспечить поддержку автономных функций мобильных приложений Azure. Если вы не используете скачанный проект быстрого запуска сервера, в проект необходимо добавить пакет расширений доступа к данным. Дополнительные сведения о пакетах расширений для сервера см. в статье Работа с пакетом SDK для внутреннего сервера .NET для мобильных приложений Azure.
Дополнительные сведения о функции автономной синхронизации см. в статье Синхронизация автономных данных в мобильных приложениях Azure.
Обновление клиентского приложения для поддержки автономных функций
Автономные функции мобильных приложений Azure позволяют взаимодействовать с локальной базой данных в случае автономной работы. Чтобы использовать эти функции в приложении, необходимо инициализировать SyncContext в локальном хранилище. Затем необходимо сослаться на таблицу с помощью интерфейса [IMobileServiceSyncTable]. SQLite используется как локальное хранилище на устройстве.
- откройте диспетчер пакетов NuGet в проекте, который вы выполнили в учебнике создание приложения Xamarin для iOS , а затем найдите и установите пакет Microsoft. Azure. Mobile. Client. SQLiteStore NuGet.
- Откройте файл QSTodoService.cs и раскомментируйте определение
#define OFFLINE_SYNC_ENABLED
. - Повторно выполните сборку и запустите клиентское приложение. Приложение работает так же, как и до включения автономной синхронизации. Однако локальная база данных теперь заполняется данными, которые можно использовать в автономном сценарии.
Обновление приложения для отключения от серверной части
В этом разделе вы разорвете связь с серверной частью мобильного приложения для имитации автономного режима. При добавлении элементов данных обработчик исключений сообщает, что приложение работает в автономном режиме. В этом состоянии новые элементы добавляются в локальное хранилище и будут синхронизированы с серверной частью мобильного приложения при следующей отправке данных в подключенном состоянии.
Отредактируйте файл QSToDoService.cs в общем проекте. Укажите для параметра applicationURL недопустимый URL-адрес.
const string applicationURL = @"https://your-service.azurewebsites.fail";
Чтобы продемонстрировать поведение в автономном режиме, отключите на устройстве Wi-Fi и мобильную связь и включите режим "в самолете".
Выполните сборку и запустите приложение. Обратите внимание, синхронизацию не удалось выполнить при обновлении во время запуска приложения.
Введите новые элементы. Учтите, что при каждом нажатии кнопки Сохранить отправка завершается сбоем с состоянием [CancelledByNetworkError]. Однако новые элементы списка существуют в локальном хранилище, пока они не будут перемещены в серверную часть мобильного приложения. В рабочем приложении при подавлении этих исключений клиентское приложение ведет себя так, как если бы оно по-прежнему было подключено к серверной части мобильного приложения.
Закройте приложение и перезапустите его, чтобы убедиться, что новые элементы сохранены в локальном хранилище.
(Необязательно.) Если на компьютере установлена среда Visual Studio, откройте обозреватель серверов. перейдите к базе данных в базах данных Azure>SQL. Щелкните правой кнопкой мыши базу данных и выберите пункт Открыть в обозревателе объектов SQL Server. Теперь можно перейти к таблице базы данных SQL и ее содержимому. Убедитесь, что данные в серверной базе данных не изменились.
(Необязательно.) Воспользуйтесь инструментом REST, например Fiddler или Postman, чтобы выполнить запрос к мобильной серверной части с помощью запроса GET вида
https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem
.
Обновление приложения для повторного подключения к серверной части мобильного приложения
В этом разделе вы повторно подключите приложение к серверной части мобильного приложения. Эта процедура имитирует переход приложения из автономного состояния в оперативное состояние для серверной части мобильного приложения. Если вы имитировали повреждение сети, отключив сетевое подключение, вносить изменения в код не требуется.
Включите сеть снова. При первом запуске приложения вызывается метод RefreshDataAsync
. Это, в свою очередь, приведет к вызову SyncAsync
для синхронизации локального хранилища с серверной базой данных.
Откройте файл QSToDoService.cs в общем проекте и отмените изменения в свойстве applicationURL.
Скомпилируйте и запустите приложение. Приложение синхронизирует локальные изменения с серверной частью мобильного приложения Azure, применяя операции отправки и извлечения после выполнения метода
OnRefreshItemsSelected
.(Необязательно.) Просмотрите обновленные данные, используя обозреватель объектов SQL Server или инструмент REST, например Fiddler. Обратите внимание, что данные синхронизированы между базой данных серверной части мобильного приложения Azure и локальным хранилищем.
В приложении установите флажки рядом с некоторыми элементами, отметив их в локальном хранилище как выполненные.
CompleteItemAsync
вызываетSyncAsync
для синхронизации каждого выполненного элемента с серверной частью мобильного приложения.SyncAsync
вызывает операцию отправки и извлечения данных. При каждом извлечении из таблицы, в которую клиент внес изменения, сначала всегда будет автоматически выполняться отправка для контекста синхронизации клиента. Неявная отправка позволяет обеспечить согласованность всех таблиц в локальном хранилище, а также связей между ними. Дополнительные сведения об этом поведении см. в статье Автономная синхронизация данных в мобильных приложениях Azure.
Просмотр кода синхронизации клиента
Клиентский проект Xamarin, скачанный при изучении руководства Создание приложения Xamarin.iOS, уже содержит код, который поддерживает автономную синхронизацию с использованием локальной базы данных SQLite. Вот краткое содержание материала, уже включенного в код учебника. Общие сведения об этой функции см. в статье Синхронизация автономных данных в мобильных приложениях Azure.
Прежде чем можно будет выполнить операции с таблицами, необходимо инициализировать локальное хранилище. Инициализация базы данных локального хранилища происходит, когда
QSTodoListViewController.ViewDidLoad()
выполняетQSTodoService.InitializeStoreAsync()
. При этом создается новая локальная база данных SQLite с помощью классаMobileServiceSQLiteStore
, предоставленного клиентским пакетом SDK для мобильных приложений Azure.Метод
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); }
Элемент
todoTable
вQSTodoService
имеет типIMobileServiceSyncTable
, а неIMobileServiceTable
. IMobileServiceSyncTable направляет все операции создания, чтения, обновления и удаления (CRUD) с таблицей в базу данных локального хранилища.Вы можете решить, когда эти изменения будут передаваться в серверную часть мобильного приложения, вызвав
IMobileServiceSyncContext.PushAsync()
. Контекст синхронизации помогает сохранить связи между таблицами, отслеживая и отправляя изменения во всех таблицах, измененных клиентским приложением при вызовеPushAsync
.Представленный код вызывает метод
QSTodoService.SyncAsync()
для синхронизации при каждом обновлении списка элементов Todoitem или добавлении либо завершении элемента Todoitem. Приложение синхронизируется после каждого локального изменения. При извлечении из таблицы, для которой есть ожидающие локальные обновления, отслеживаемые по контексту, операция извлечения сначала автоматически активирует отправку контекста.В представленном коде запрашиваются все записи из удаленной таблицы
TodoItem
, однако их можно также отфильтровать путем передачи идентификатора запроса и запроса вPushAsync
. Дополнительные сведения см. в разделе Добавочная синхронизация статьи Автономная синхронизация данных в мобильных приложениях Azure.// 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); } }