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.
- Ö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 .
- Öppna filen QSTodoService.cs och avkommentera
#define OFFLINE_SYNC_ENABLED
definitionen. - Å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.
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.
Kompilera och kör appen. Observera att synkroniseringen misslyckades vid uppdatering när appen startades.
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.
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.
(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.
(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.
Öppna QSToDoService.cs i det delade projektet och återställ ändringen av egenskapen applicationURL .
Å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.(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.
I appen klickar du på kryssrutan bredvid några objekt för att slutföra dem i det lokala arkivet.
CompleteItemAsync
anroparSyncAsync
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örQSTodoService.InitializeStoreAsync()
. Den här metoden skapar en ny lokal SQLite-databas med hjälp avMobileServiceSQLiteStore
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, iToDoItem
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 ärQSTodoService
av typenIMobileServiceSyncTable
i stället förIMobileServiceTable
. 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ärPushAsync
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 tillPushAsync
. 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); } }