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

Omówienie

W tym samouczku wprowadzono funkcję synchronizacji w trybie offline platformy Azure Mobile Apps dla platformy Xamarin.iOS. Synchronizacja w trybie offline umożliwia użytkownikom mobilnym interakcję z aplikacją mobilną — wyświetlanie, dodawanie lub modyfikowanie danych — nawet wtedy, gdy 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 zaktualizujemy projekt aplikacji platformy Xamarin.iOS z tematu Create a Xamarin iOS app to support the offline features of Azure Mobile Apps (Tworzenie aplikacji platformy Xamarin iOS w celu obsługi funkcji offline usługi Azure Mobile Apps). Jeśli nie używasz pobranego projektu serwera Szybki start, musisz dodać do projektu pakiety rozszerzeń dostępu do danych. Aby uzyskać więcej informacji na temat pakietów rozszerzeń serwera, zobacz Praca z zestawem SDK serwera zaplecza platformy .NET dla usługi Azure Mobile Apps.

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

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

Funkcje aplikacji mobilnej platformy Azure w trybie offline umożliwiają interakcję z lokalną bazą danych w scenariuszu offline. Aby korzystać z tych funkcji w aplikacji, zaimicjuj aplikację SyncContext w magazynie lokalnym. Odwołaj się do tabeli za pomocą interfejsu [IMobileServiceSyncTable]. SqLite jest używany jako magazyn lokalny na urządzeniu.

  1. Otwórz menedżera pakietów NuGet w projekcie ukończonym w samouczku Tworzenie aplikacji platformy Xamarin dla systemu iOS, a następnie wyszukaj i zainstaluj pakiet NuGet Microsoft.Azure.Mobile.Client.SQLiteStore.
  2. Otwórz plik QSTodoService.cs i odłącz definicję #define OFFLINE_SYNC_ENABLED .
  3. Skompilowanie i uruchomienie aplikacji klienckiej. Aplikacja działa tak samo jak przed rozpoczęciem synchronizacji w trybie offline. Jednak lokalna baza danych jest teraz wypełniona danymi, których można używać w scenariuszu offline.

Aktualizowanie aplikacji w celu rozłączenia z zaplecza

W tej sekcji przerwiesz połączenie z zaplecza 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 dodane w magazynie lokalnym i będą synchronizowane z zaplecza aplikacji mobilnej po następnym uruchomieniu wypychania w stanie połączenia.

  1. Edytuj pliki QSToDoService.cs w udostępnionym projekcie. Zmień adres 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 sieci Wi-Fi i komórkowe na urządzeniu lub używając trybu samolotowego.

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

  3. Wprowadź nowe elementy i zwróć uwagę, że wypychanie kończy się niepowodzeniem ze stanem [CancelledByNetworkError] po każdym kliknięciu przycisku Zapisz. Jednak nowe elementy todo istnieją w magazynie lokalnym, dopóki nie będzie można ich wypchnąć do zaplecza aplikacji mobilnej. Jeśli pominiesz te wyjątki w aplikacji produkcyjnej, aplikacja kliency zachowuje się tak, jakby nadal była połączona z zaplecza aplikacji mobilnej.

  4. Zamknij aplikację i uruchom ją ponownie, aby sprawdzić, czy nowo utworzone elementy są utrwalane w magazynie lokalnym.

  5. (Opcjonalnie) Jeśli zainstalowano Visual Studio komputerze, otwórz Eksplorator serwera. Przejdź do bazy danych w usłudze Azure-SQL>Databases. Kliknij prawym przyciskiem myszy bazę danych i wybierz polecenie Otwórz w SQL Server Eksplorator obiektów. Teraz możesz przejść do tabeli SQL bazy danych 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 wysłać zapytanie do zaplecza mobilnego przy użyciu zapytania GET w postaci https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

Aktualizowanie aplikacji w celu ponownego nawiązania połączenia z zaplecza aplikacji mobilnej

W tej sekcji ponownie połączysz aplikację z zapleczami aplikacji mobilnej. Symuluje to przejście aplikacji ze stanu offline do stanu online przy użyciu zaplecza aplikacji mobilnej. Jeśli zasymulowaliśmy przerwę w sieci, wyłączając łączność sieciową, nie są wymagane żadne zmiany kodu. Włącz ponownie sieć. Przy pierwszym uruchomieniu aplikacji wywoływana RefreshDataAsync jest metoda . To z kolei wywołuje synchronizację SyncAsync magazynu lokalnego z bazą danych zaplecza.

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

  2. Ponownie skompilować i uruchomić aplikację. Aplikacja synchronizuje lokalne zmiany z zaplecza aplikacji mobilnej platformy Azure przy użyciu operacji wypychania i ściągania podczas OnRefreshItemsSelected wykonywania metody.

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

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

    CompleteItemAsync wywołuje SyncAsync usługę w celu zsynchronizowania każdego ukończonego elementu z zaplecza aplikacji mobilnej. SyncAsync Wywołuje zarówno wypychanie, jak i ściąganie. Zawsze, gdy wykonujesz ściągnięcie względem tabeli, w których klient wykonał zmiany, wypychanie do kontekstu synchronizacji klienta jest zawsze wykonywane najpierw automatycznie. Niejawne wypychanie zapewnia, że wszystkie tabele w magazynie lokalnym wraz z relacjami pozostają spójne. Aby uzyskać więcej informacji na temat tego zachowania, zobacz Offline Data Sync in Azure Mobile Apps (Tryb 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 tego, co zostało już uwzględnione w kodzie samouczka. Aby uzyskać koncepcyjne omówienie tej funkcji, zobacz Offline Data Sync in Azure Mobile Apps (Omówienie offline w usłudze Azure Mobile Apps).

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

    Metoda DefineTable tworzy w magazynie lokalnym tabelę, która ToDoItem w tym przypadku pasuje do pól w podanego typu. Typ nie musi zawierać wszystkich kolumn, które znajdują się w zdalnej bazie danych. Istnieje możliwość przechowywania tylko podzestawu 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łonkiem todoTable jest QSTodoService typ , IMobileServiceSyncTable a nie IMobileServiceTable. Tabela IMobileServiceSyncTable kieruje wszystkie operacje tworzenia, odczytu, aktualizacji i usuwania tabeli (CRUD) do lokalnej bazy danych magazynu.

    Decydujesz, kiedy te zmiany zostaną wypchniętą do zaplecza aplikacji mobilnej platformy Azure, wywołując .IMobileServiceSyncContext.PushAsync() Kontekst synchronizacji pomaga zachować relacje tabeli, śledząc i wypychając zmiany we wszystkich tabelach, które aplikacja klienca zmodyfikował po wywołaniu PushAsync .

    Podany kod wywołuje synchronizację QSTodoService.SyncAsync() za każdym razem, gdy lista zadań do zadania zostanie odświeżona lub zostanie dodane lub zakończone todoitem. Aplikacja jest synchronizowana po każdej zmianie lokalnej. Jeśli ściąganie jest wykonywane względem tabeli, która ma oczekujące aktualizacje lokalne śledzone przez kontekst, ta operacja ściągania najpierw automatycznie wyzwoli wypychanie kontekstowe.

    W podanym kodzie wszystkie TodoItem rekordy w tabeli zdalnej są odpytywalne, ale istnieje również możliwość filtrowania rekordów przez przekazanie identyfikatora zapytania i zapytania do .PushAsync Aby uzyskać więcej informacji, zobacz sekcję Incremental Sync in Offline Data Sync in Azure Mobile Apps (Synchronizacja przyrostowa 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