Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Översikt
I den här självstudien introduceras funktionen för offlinesynkronisering i Azure Mobile Apps för Xamarin.iOS. Med offlinesynkronisering kan slutanvändarna 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 dessa ändringar med fjärrtjänsten.
I den här självstudien uppdaterar du Xamarin.iOS-appprojektet 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 paketen för dataåtkomsttillägg i projektet. Mer information om servertilläggspaket finns i Work with the .NET backend server SDK for Azure Mobile Apps.
Mer information om funktionen för offlinesynkronisering finns i avsnittet Offline Data Sync i Azure Mobile Apps.
Uppdatera klientappen för att stödja offlinefunktioner
Med offlinefunktioner 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 det lokala arkivet på enheten.
- Öppna NuGet-pakethanteraren i projektet som du slutförde i självstudiekursen Skapa en Xamarin iOS-app och sök sedan efter och installera Microsoft.Azure.Mobile.Client.SQLiteStore NuGet-paketet.
- Öppna QSTodoService.cs-filen och avkommentera definitionen för
#define OFFLINE_SYNC_ENABLED. - Bygg om och kör klientappen. Appen fungerar på samma sätt som den gjorde innan du aktiverade offlinesynkronisering. Men den lokala databasen fylls nu med data som kan användas i ett offlinescenario.
Uppdatera appen för att koppla bort från backend
I det här avsnittet bryter du anslutningen till mobilappens serverdel för att simulera en offlinesituation. När du lägger till dataobjekt meddelar undantagshanteraren att appen är i offlineläge. I det här tillståndet läggs nya artiklar till i den lokala butiken och synkroniseras till mobilappens serverdel när push nästa gång körs i ett anslutet tillstånd.
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 offlinebeteende genom att inaktivera wifi och mobilnät på enheten eller använda flygplansläge.
Skapa och kör appen. Observera att synkroniseringen misslyckades vid uppdatering när appen startades.
Ange nya objekt och observera att push-funktionen misslyckas med statusen [CancelledByNetworkError] varje gång du klickar på Spara. De nya att-göra-objekten finns dock kvar i den lokala lagringen tills de kan överföras till mobilappens bakgrundssystem. Om du undertrycker dessa undantag i en produktionsapp fungerar klientappen som om den fortfarande är ansluten till mobilappens serverdel.
Stäng appen och starta om den för att kontrollera att de nya objekten som du skapade är kvar i det lokala lagret.
(Valfritt) Om du har Visual Studio installerat på en dator öppnar du Server Explorer. Gå till din databas i Azure->SQL Databases. 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 serverdelsdatabasen inte har ändrats.
(Valfritt) Använd ett REST-verktyg som Fiddler eller Postman för att fråga din mobila serverdel 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 mobilappens serverdel
I det här avsnittet återansluter du appen till mobilappens serverdel. Detta simulerar att appen flyttas från ett offlinetillstånd till ett onlinetillstånd med mobilappens serverdel. Om du simulerade nätverksbrytningen genom att stänga av nätverksanslutningen behövs inga kodändringar.
Aktivera nätverket igen. När du först kör programmet anropas metoden RefreshDataAsync. Detta anropar SyncAsync för att synkronisera din lokala lagring med backend-databasen.
Ö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-serverdelen med hjälp av push- och pull-åtgärder när
OnRefreshItemsSelected-metoden körs.(Valfritt) Visa uppdaterade data med antingen SQL Server Object Explorer eller ett REST-verktyg som Fiddler. Observera att data har synkroniserats mellan Azure Mobile App-backenddatabasen och det lokala arkivet.
I appen klickar du på kryssrutan bredvid några artiklar för att slutföra dem i den lokala butiken.
CompleteItemAsyncanroparSyncAsyncför att synkronisera varje slutfört objekt med mobilappens serverdel.SyncAsyncanropar både push och pull. När du kör en hämtning mot en tabell som klienten har gjort ändringar i, körs alltid en push-överföring på klientsynkroniseringskontexten först automatiskt. Den implicita push-överföringen säkerställer att alla tabeller i den lokala lagringen och deras relationer förblir konsekventa. Mer information om det här beteendet finns i Offline Data Sync i Azure Mobile Apps.
Granska koden för klientsynkronisering
Xamarin-klientprojektet som du laddade ned när du slutförde självstudien Skapa en Xamarin iOS-app redan innehåller 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 några tabellåtgärder kan utföras måste det lokala lagret 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 av klassenMobileServiceSQLiteStoresom tillhandahålls av Azure Mobile App-klient-SDK.Metoden
DefineTableskapar en tabell i det lokala lagret som matchar fälten i den angivna typen,ToDoItemi det här fallet. Typen behöver inte innehålla alla kolumner som finns i fjärrdatabasen. Du kan bara lagra en delmängd 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); }Den
todoTable:e medlemmen iQSTodoServiceär av typenIMobileServiceSyncTablei stället förIMobileServiceTable. IMobileServiceSyncTable dirigerar alla tabellåtgärder för skapande, läsning, uppdatering och borttagning till den lokala lagringsdatabas.Du bestämmer när ändringarna skickas till Azure Mobile App-serverdelen genom att anropa
IMobileServiceSyncContext.PushAsync(). Synkroniseringskontexten hjälper till att bevara tabellrelationer genom att spåra och skicka ändringar i alla tabeller som en klientapp har ändrat närPushAsyncanropas.Den angivna koden anropar
QSTodoService.SyncAsync()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 körs mot en tabell som har väntande lokala uppdateringar som spåras av kontexten utlöser pull-åtgärden automatiskt en kontext push först.I den angivna koden efterfrågas alla poster i fjärrtabellen
TodoItem, men det går också 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); } }