Dela via


Aktivera offlinesynkronisering för din Xamarin.iOS-mobilapp

Översikt

I den här självstudien introduceras offlinesynkroniseringsfunktionen i Azure Mobile Apps för Xamarin.iOS. Med offlinesynkronisering kan slutanvändare interagera med en mobilapp – visa, lägga till eller ändra data – även om det inte finns någon nätverksanslutning. Ändringar lagras i en lokal databas. När enheten är online igen synkroniseras ändringarna med fjärrtjänsten.

I den här självstudien uppdaterar du Xamarin.iOS-approjektet från Skapa en Xamarin iOS-app för att stödja offlinefunktionerna i Azure Mobile Apps. Om du inte använder det nedladdade snabbstartsserverprojektet måste du lägga till dataåtkomsttilläggspaketen i projektet. Mer information om servertilläggspaket finns i Arbeta med SDK för .NET-serverserver för Azure Mobile Apps.

Mer information om offlinesynkroniseringsfunktionen finns i avsnittet Offline Data Sync i Azure Mobile Apps.

Uppdatera klientappen så att den stöder offlinefunktioner

Med offlinefunktionerna i Azure Mobile App kan du interagera med en lokal databas när du befinner dig i ett offlinescenario. Om du vill använda dessa funktioner i din app initierar du en SyncContext till en lokal butik. Referera till tabellen via gränssnittet [IMobileServiceSyncTable]. SQLite används som lokalt lager på enheten.

  1. Öppna NuGet-pakethanteraren i projektet som du slutförde i självstudien Skapa en Xamarin iOS-app . Sök sedan efter och installera NuGet-paketet Microsoft.Azure.Mobile.Client.SQLiteStore .
  2. Öppna filen QSTodoService.cs och avkommentera #define OFFLINE_SYNC_ENABLED definitionen.
  3. Återskapa och kör klientappen. Appen fungerar på samma sätt som innan du aktiverade offlinesynkronisering. Den lokala databasen fylls dock nu med data som kan användas i ett offlinescenario.

Uppdatera appen för att koppla från backend

I det här avsnittet bryter du anslutningen till mobilapps-backend för att simulera en offline-situation. När du lägger till dataobjekt anger undantagshanteraren att appen är i offlineläge. I det här tillståndet läggs nya objekt till i det lokala arkivet och synkroniseras till mobilappens backend när push-körningen körs i ett anslutet tillstånd nästa gång.

  1. Redigera QSToDoService.cs i det delade projektet. Ändra applicationURL så att den pekar på en ogiltig URL:

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

    Du kan också demonstrera offlinebeteendet genom att inaktivera Wi-Fi och mobilnät på enheten eller använda flygplansläge.

  2. Kompilera och kör appen. Observera att synkroniseringen misslyckades vid uppdatering när appen startades.

  3. Ange nya objekt och lägg märke till att push-meddelandet misslyckas med statusen [CancelledByNetworkError] varje gång du klickar på Spara. De nya att göra-objekten finns dock i det lokala arkivet tills de kan skickas till mobilappens backend-enhet. Om du ignorerar de här undantagen i en produktionsapp beter sig klientappen som om den fortfarande är ansluten till mobilappens backend.

  4. Stäng appen och starta om den för att kontrollera att de nya objekten som du skapade är beständiga i det lokala arkivet.

  5. (Valfritt) Om du har Visual Studio installerat på en dator öppnar du Server Explorer. Gå till databasen i Azure-SQL>Databaser. Högerklicka på databasen och välj Öppna i SQL Server Object Explorer. Nu kan du bläddra till SQL databastabellen och dess innehåll. Kontrollera att data i serverdatabasen inte har ändrats.

  6. (Valfritt) Använd ett REST-verktyg som Fiddler eller Postman för att fråga din mobila backend med hjälp av en GET-fråga i formuläret https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

Uppdatera appen för att återansluta mobilapps-backend

I det här avsnittet återansluter du appen till mobilappens backend. Detta simulerar att appen flyttas från ett offlinetillstånd till ett onlinetillstånd med mobilappens backend. Om du simulerade nätverksavbrottet genom att stänga av nätverksanslutningen behövs inga kodändringar. Aktivera nätverket igen. När du kör programmet första gången anropas RefreshDataAsync metoden . Detta anropar i sin SyncAsync tur för att synkronisera ditt lokala arkiv med serverdelsdatabasen.

  1. Öppna QSToDoService.cs i det delade projektet och återställ ändringen av egenskapen applicationURL .

  2. Återskapa och kör appen. Appen synkroniserar dina lokala ändringar med Azure Mobile App-backend med push- och pull-åtgärder när OnRefreshItemsSelected metoden körs.

  3. (Valfritt) Visa uppdaterade data med hjälp av antingen SQL Server Object Explorer eller ett REST-verktyg som Fiddler. Observera att data har synkroniserats mellan serverdatabasen i Azure Mobile App och det lokala arkivet.

  4. I appen klickar du på kryssrutan bredvid några objekt för att slutföra dem i det lokala arkivet.

    CompleteItemAsync anropar SyncAsync för att synkronisera varje slutfört objekt med mobilapps-backend. SyncAsync anropar både push och pull. När du kör en pull-körning mot en tabell som klienten har gjort ändringar i körs alltid en push-push i klientsynkroniseringskontexten först automatiskt. Implicit push säkerställer att alla tabeller i det lokala arkivet tillsammans med relationer förblir konsekventa. Mer information om det här beteendet finns i Offline-Data Sync i Azure Mobile Apps.

Granska klientsynkroniseringskoden

Xamarin-klientprojektet som du laddade ned när du slutförde självstudien Skapa en Xamarin iOS-app innehåller redan kod som stöder offlinesynkronisering med hjälp av en lokal SQLite-databas. Här är en kort översikt över vad som redan ingår i självstudiekoden. En översikt över funktionen finns i Offline-Data Sync i Azure Mobile Apps.

  • Innan du kan utföra tabellåtgärder måste det lokala arkivet initieras. Den lokala lagringsdatabasen initieras när QSTodoListViewController.ViewDidLoad() kör QSTodoService.InitializeStoreAsync(). Den här metoden skapar en ny lokal SQLite-databas med hjälp av MobileServiceSQLiteStore klassen som tillhandahålls av Azure Mobile App-klientens SDK.

    Metoden DefineTable skapar en tabell i det lokala arkivet som matchar fälten i den angivna typen, i ToDoItem det här fallet. Typen behöver inte innehålla alla kolumner som finns i fjärrdatabasen. Det är möjligt att lagra bara en delmängd av kolumner.

      // 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);
      }
    
  • Medlemmen todoTable i är QSTodoService av typen IMobileServiceSyncTable i stället för IMobileServiceTable. IMobileServiceSyncTable dirigerar alla crud-tabellåtgärder (skapa, läsa, uppdatera och ta bort) till den lokala lagringsdatabasen.

    Du bestämmer när ändringarna ska skickas till Azure Mobile App-backend genom att anropa IMobileServiceSyncContext.PushAsync(). Synkroniseringskontexten hjälper till att bevara tabellrelationer genom att spåra och push-pusha ändringar i alla tabeller som en klientapp har ändrat när PushAsync anropas.

    Den angivna koden anropar QSTodoService.SyncAsync() för att synkronisera när todoitem-listan uppdateras eller en todoitem läggs till eller slutförs. Appen synkroniseras efter varje lokal ändring. Om en pull-åtgärd körs mot en tabell som har väntande lokala uppdateringar som spåras av kontexten utlöser den pull-åtgärden automatiskt en kontext-push först.

    I den angivna koden efterfrågas TodoItem alla poster i fjärrtabellen, men det är också möjligt att filtrera poster genom att skicka ett fråge-ID och en fråga till PushAsync. Mer information finns i avsnittet Inkrementell synkronisering i offline Data Sync i 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);
          }
      }
    

Ytterligare resurser