Udostępnij za pośrednictwem


Włączanie synchronizacji w trybie offline dla aplikacji mobilnej platformy Xamarin.iOS

Przegląd

W tym samouczku przedstawiono funkcję synchronizacji offline usługi Azure Mobile Apps for Xamarin.iOS. Synchronizacja w trybie offline umożliwia użytkownikom końcowym interakcję z aplikacją mobilną — wyświetlanie, dodawanie lub modyfikowanie danych — nawet jeśli nie ma połączenia sieciowego. Zmiany są przechowywane w lokalnej bazie danych. Po powrocie urządzenia do trybu online te zmiany są synchronizowane z usługą zdalną.

W tym samouczku zaktualizuj projekt aplikacji platformy Xamarin.iOS z Utwórz aplikację platformy Xamarin dla systemu iOS w celu obsługi funkcji trybu offline usługi Azure Mobile Apps. Jeśli nie używasz pobranego projektu serwera Szybki start, musisz dodać pakiety rozszerzeń dostępu do danych do projektu. Aby uzyskać więcej informacji na temat pakietów rozszerzeń serwera, zobacz Work with the .NET backend server SDK for Azure Mobile Apps.

Aby dowiedzieć się więcej na temat funkcji synchronizacji offline, zobacz temat Offline Data Sync w usłudze Azure Mobile Apps.

Aktualizowanie aplikacji klienckiej w celu obsługi funkcji w trybie offline

Funkcje trybu offline aplikacji mobilnej Platformy Azure umożliwiają interakcję z lokalną bazą danych w scenariuszu offline. Aby użyć tych funkcji w aplikacji, zainicjuj SyncContext do sklepu lokalnego. Odwołaj się do swojej tabeli za pośrednictwem interfejsu [IMobileServiceSyncTable]. SqLite jest używany jako magazyn lokalny na urządzeniu.

  1. Otwórz menedżera pakietów NuGet w projekcie, który ukończyłeś w ramach samouczka Tworzenie aplikacji Xamarin dla systemu iOS, a następnie wyszukaj i zainstaluj pakiet NuGet Microsoft.Azure.Mobile.Client.SQLiteStore.
  2. Otwórz plik QSTodoService.cs i usuń komentarz z definicji #define OFFLINE_SYNC_ENABLED.
  3. Przebuduj i uruchom aplikację kliencką. Aplikacja działa tak samo jak przed włączeniem synchronizacji w trybie offline. Jednak lokalna baza danych jest teraz wypełniana danymi, które mogą być używane w scenariuszu offline.

Zaktualizuj aplikację, aby rozłączyć się z backendem

W tej sekcji przerywasz połączenie z zapleczem aplikacji mobilnej, aby symulować sytuację w trybie offline. Po dodaniu elementów danych program obsługi wyjątków informuje, że aplikacja jest w trybie offline. W tym stanie nowe elementy, które zostaną dodane do lokalnego magazynu, będą zsynchronizowane z zapleczem aplikacji mobilnej przy następnym uruchomieniu synchronizacji, gdy aplikacja jest w stanie połączonym.

  1. Edytuj QSToDoService.cs w udostępnionym projekcie. Zmień applicationURL, aby wskazać nieprawidłowy adres URL:

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

    Możesz również zademonstrować zachowanie w trybie offline, wyłączając sieć Wi-Fi i sieci komórkowe na urządzeniu lub korzystając z trybu samolotowego.

  2. Skompiluj i uruchom aplikację. Zwróć uwagę, że synchronizacja nie powiodła się podczas odświeżania po uruchomieniu aplikacji.

  3. Wprowadź nowe elementy i zwróć uwagę, że operacja wypychania kończy się niepowodzeniem z komunikatem [CancelledByNetworkError] za każdym razem, gdy klikniesz Zapisz. Jednak nowe pozycje na liście zadań istnieją w lokalnym magazynie danych do momentu, gdy mogą zostać przesłane do backendu aplikacji mobilnej. W aplikacji produkcyjnej, jeśli pomijasz te wyjątki, aplikacja kliencka zachowuje się tak, jakby nadal była połączona z zapleczem aplikacji mobilnej.

  4. Zamknij aplikację i uruchom ją ponownie, aby sprawdzić, czy nowo utworzone elementy są zapisane w pamięci lokalnej.

  5. (Opcjonalnie) Jeśli program Visual Studio jest zainstalowany na komputerze, otwórz program Server Explorer. Przejdź do swojej bazy danych w Azure—>SQL Databases. Kliknij prawym przyciskiem myszy bazę danych i wybierz pozycję Otwórz w Eksploratorze obiektów programu SQL Server. Teraz możesz przejść do tabeli bazy danych SQL i jej zawartości. Sprawdź, czy dane w bazie danych zaplecza nie uległy zmianie.

  6. (Opcjonalnie) Użyj narzędzia REST, takiego jak Fiddler lub Postman, aby wykonać zapytanie względem zaplecza mobilnego przy użyciu zapytania GET w formularzu https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

Aktualizowanie aplikacji w celu ponownego połączenia zaplecza aplikacji mobilnej

W tej sekcji ponownie połącz aplikację z zapleczem aplikacji mobilnej. Symuluje to przejście aplikacji ze stanu offline do stanu online przy użyciu zaplecza aplikacji mobilnej. Jeśli zasymulujesz awarię sieci, wyłączając łączność sieciową, nie są potrzebne żadne zmiany kodu. Ponownie włącz sieć. Po pierwszym uruchomieniu aplikacji wywoływana jest metoda RefreshDataAsync. To z kolei wywołuje SyncAsync w celu zsynchronizowania magazynu lokalnego z bazą danych zaplecza.

  1. Otwórz QSToDoService.cs w udostępnionym projekcie i cofnij zmianę właściwości applicationURL.

  2. Przebuduj i uruchom aplikację. Aplikacja synchronizuje zmiany lokalne z zapleczem usługi Azure Mobile App przy użyciu operacji wypychania i ściągania po wykonaniu metody OnRefreshItemsSelected.

  3. (Opcjonalnie) Wyświetl zaktualizowane dane przy użyciu Eksploratora obiektów programu SQL Server lub narzędzia REST, takiego jak Fiddler. Zwróć uwagę, że dane zostały zsynchronizowane między bazą danych zaplecza aplikacji mobilnej Azure a magazynem lokalnym.

  4. W aplikacji kliknij pole wyboru obok kilku elementów, aby je ukończyć w sklepie lokalnym.

    CompleteItemAsync wywołuje SyncAsync, aby zsynchronizować każdy ukończony element z zapleczem aplikacji mobilnej. SyncAsync powoduje zarówno wypychanie, jak i ściąganie. Zawsze, gdy wykonasz ściągnięcie względem tabeli, do której klient wprowadził zmiany, wypychanie kontekstu synchronizacji klienta jest zawsze wykonywane automatycznie. Niejawne wypychanie zapewnia, że wszystkie tabele w magazynie lokalnym, wraz z ich powiązaniami, pozostają spójne. Aby uzyskać więcej informacji na temat tego zachowania, zobacz Synchronizacja danych w trybie offline w usłudze Azure Mobile Apps.

Przeglądanie kodu synchronizacji klienta

Projekt klienta platformy Xamarin pobrany po ukończeniu samouczka Tworzenie aplikacji platformy Xamarin dla systemu iOS zawiera już kod obsługujący synchronizację w trybie offline przy użyciu lokalnej bazy danych SQLite. Poniżej przedstawiono krótkie omówienie elementów, które zostały już uwzględnione w kodzie samouczka. Aby zapoznać się z koncepcyjnym omówieniem tej funkcji, zobacz Offline Data Sync w usłudze Azure Mobile Apps.

  • Przed rozpoczęciem wykonywania jakichkolwiek operacji na tabeli należy zainicjować lokalny magazyn. Baza danych lokalnego sklepu jest inicjowana, gdy QSTodoListViewController.ViewDidLoad() uruchamia QSTodoService.InitializeStoreAsync(). Ta metoda tworzy nową lokalną bazę danych SQLite przy użyciu klasy MobileServiceSQLiteStore dostarczonej przez zestaw SDK klienta aplikacji mobilnej platformy Azure.

    Metoda DefineTable tworzy tabelę w magazynie lokalnym, która jest zgodna z polami określonego typu, w tym przypadku ToDoItem. Typ nie musi zawierać wszystkich kolumn, które znajdują się w zdalnej bazie danych. Można przechowywać tylko podzbiór kolumn.

      // 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);
      }
    
  • Członek todoTable z QSTodoService jest typu IMobileServiceSyncTable zamiast IMobileServiceTable. Tabela IMobileServiceSyncTable kieruje wszystkie operacje tabel tworzenia, odczytu, aktualizacji i usuwania (CRUD) do bazy danych magazynu lokalnego.

    Decydujesz, kiedy te zmiany są wypychane do zaplecza aplikacji mobilnej Platformy Azure, wywołując IMobileServiceSyncContext.PushAsync(). Kontekst synchronizacyjny pomaga zachować relacje między tabelami poprzez śledzenie i przesyłanie zmian we wszystkich tabelach, które aplikacja kliencka zmodyfikowała po wywołaniu PushAsync.

    Podany kod wywołuje QSTodoService.SyncAsync() do synchronizacji za każdym razem, gdy lista zadań do wykonania zostanie odświeżona lub zostanie dodana lub ukończona. Aplikacja jest synchronizowana po każdej zmianie lokalnej. Jeśli ściągnięcie jest wykonywane względem tabeli, która ma oczekujące aktualizacje lokalne śledzone przez kontekst, operacja ściągania automatycznie wyzwoli wypychanie kontekstu jako pierwsze.

    W podanym kodzie są odpytywane wszystkie rekordy w zdalnej tabeli TodoItem, ale istnieje również możliwość filtrowania rekordów poprzez przekazanie identyfikatora zapytania i zapytania do PushAsync. Aby uzyskać więcej informacji, zobacz sekcję Synchronizacji przyrostowej w sekcji Synchronizacja danych w trybie offline w usłudze 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);
          }
      }
    

Dodatkowe zasoby