Freigeben über


Aktivieren der Offlinesynchronisierung für Ihre mobile Xamarin.iOS-App

Überblick

In diesem Lernprogramm wird das Offlinesynchronisierungsfeature von Azure Mobile Apps für Xamarin.iOS vorgestellt. Die Offlinesynchronisierung ermöglicht Es Endbenutzern, mit einer mobilen App zu interagieren – selbst wenn keine Netzwerkverbindung besteht. Änderungen werden in einer lokalen Datenbank gespeichert. Sobald das Gerät wieder online ist, werden diese Änderungen mit dem Remotedienst synchronisiert.

Aktualisieren Sie in diesem Lernprogramm das Xamarin.iOS-App-Projekt von "Erstellen einer Xamarin iOS-App ", um die Offlinefunktionen von Azure Mobile Apps zu unterstützen. Wenn Sie das heruntergeladene Schnellstartserverprojekt nicht verwenden, müssen Sie dem Projekt die Datenzugriffserweiterungspakete hinzufügen. Weitere Informationen zu Servererweiterungspaketen finden Sie unter Arbeiten mit dem .NET-Back-End-Server-SDK für Azure Mobile Apps.

Weitere Informationen zum Offlinesynchronisierungsfeature finden Sie im Thema Offlinedatensynchronisierung in Azure Mobile Apps.

Aktualisieren der Client-App zur Unterstützung von Offlinefeatures

Offlinefunktionen von Azure Mobile App ermöglichen ihnen die Interaktion mit einer lokalen Datenbank, wenn Sie sich in einem Offlineszenario befinden. Um diese Features in Ihrer App zu verwenden, initialisieren Sie einen SyncContext für einen lokalen Store. Verweisen Sie auf die Tabelle über die [IMobileServiceSyncTable]-Schnittstelle. SQLite wird als lokaler Speicher auf dem Gerät verwendet.

  1. Öffnen Sie den NuGet-Paket-Manager in dem Projekt, das Sie im Lernprogramm Erstellen einer Xamarin iOS-App abgeschlossen haben, und suchen Sie dann nach dem NuGet-Paket Microsoft.Azure.Mobile.Client.SQLiteStore und installieren Sie es.
  2. Öffnen Sie die Datei QSTodoService.cs und entfernen Sie die Kommentierung der Definition #define OFFLINE_SYNC_ENABLED.
  3. Erstellen Sie die Client-App neu, und führen Sie sie aus. Die App funktioniert genauso wie zuvor, bevor Sie die Offlinesynchronisierung aktiviert haben. Die lokale Datenbank wird jedoch jetzt mit Daten aufgefüllt, die in einem Offlineszenario verwendet werden können.

Aktualisieren der App, um die Verbindung mit dem Back-End zu trennen

In diesem Abschnitt unterbrechen Sie die Verbindung mit Ihrem Mobilen App-Back-End, um eine Offlinesituation zu simulieren. Wenn Sie Datenelemente hinzufügen, teilt Der Ausnahmehandler Ihnen mit, dass sich die App im Offlinemodus befindet. In diesem Zustand werden neue Elemente, die im lokalen Store hinzugefügt wurden, mit dem mobilen App-Back-End synchronisiert, wenn push als nächstes in einem verbundenen Zustand ausgeführt wird.

  1. Bearbeiten Sie QSToDoService.cs im freigegebenen Projekt. Ändern Sie die applicationURL so, dass sie auf eine ungültige URL verweist:

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

    Sie können auch das Offlineverhalten demonstrieren, indem Sie WLAN und Mobilfunknetze auf dem Gerät deaktivieren oder den Flugzeugmodus verwenden.

  2. Erstellen Sie die App und führen Sie sie aus. Beachten Sie, dass die Synchronisierung bei der Aktualisierung nach dem Start der App fehlgeschlagen ist.

  3. Geben Sie neue Elemente ein, und beachten Sie, dass push bei jedem Klicken auf " Speichern" mit einem [CancelledByNetworkError]-Status fehlschlägt. Die neuen Todo-Elemente sind jedoch im lokalen Store vorhanden, bis sie an das mobile App-Back-End übertragen werden können. Wenn Sie diese Ausnahmen in einer Produktions-App unterdrücken, verhält sich die Client-App so, als ob sie weiterhin mit dem mobilen App-Back-End verbunden ist.

  4. Schließen Sie die App, und starten Sie sie neu, um zu überprüfen, ob die von Ihnen erstellten neuen Elemente im lokalen Store beibehalten werden.

  5. (Optional) Wenn Sie Visual Studio auf einem PC installiert haben, öffnen Sie den Server-Explorer. Navigieren Sie zu Ihrer Datenbank in Azure–>SQL-Datenbanken. Klicken Sie mit der rechten Maustaste auf Ihre Datenbank, und wählen Sie Im SQL Server-Objekt-Explorer öffnenaus. Jetzt können Sie zu Ihrer SQL-Datenbanktabelle und ihrem Inhalt navigieren. Überprüfen Sie, ob sich die Daten in der Back-End-Datenbank nicht geändert haben.

  6. (Optional) Verwenden Sie ein REST-Tool wie Fiddler oder Postman, um Ihr mobiles Back-End mithilfe einer GET-Abfrage im Formular https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItemabzufragen.

Aktualisieren Sie die App, um ihr Mobiles App-Backend erneut zu verbinden.

Verbinden Sie die App in diesem Abschnitt erneut mit dem mobilen App-Back-End. Dies simuliert den Wechsel der App von einem Offlinezustand zu einem Onlinestatus mit dem mobilen App-Back-End. Wenn Sie den Netzwerkwechsel simuliert haben, indem Sie die Netzwerkkonnektivität deaktivieren, sind keine Codeänderungen erforderlich. Aktivieren Sie das Netzwerk erneut. Wenn Sie die Anwendung zum ersten Mal ausführen, wird die RefreshDataAsync Methode aufgerufen. Dies wiederum ruft auf SyncAsync , um Ihren lokalen Speicher mit der Back-End-Datenbank zu synchronisieren.

  1. Öffnen Sie QSToDoService.cs im freigegebenen Projekt, und setzen Sie die Änderung der applicationURL-Eigenschaft zurück.

  2. Kompilieren Sie die App neu und führen Sie sie aus. Die App synchronisiert Ihre lokalen Änderungen mit dem Azure Mobile App-Back-End mithilfe von Push- und Pullvorgängen, wenn die OnRefreshItemsSelected Methode ausgeführt wird.

  3. (Optional) Zeigen Sie die aktualisierten Daten mithilfe des SQL Server-Objekt-Explorers oder eines REST-Tools wie Fiddler an. Beachten Sie, dass die Daten zwischen der Back-End-Datenbank der Azure Mobile App und dem lokalen Speicher synchronisiert wurden.

  4. Klicken Sie in der App auf das Kontrollkästchen neben einigen Elementen, um sie im lokalen Store abzuschließen.

    CompleteItemAsync ruft SyncAsync auf, um jedes abgeschlossene Element mit dem Mobilen App-Back-End zu synchronisieren. SyncAsync ruft sowohl Push als auch Pull auf. Wenn Sie einen Pull für eine Tabelle ausführen, an der der Client Änderungen vorgenommen hat, wird immer zuerst automatisch ein Push im Clientsynchronisierungskontext ausgeführt. Durch den impliziten Push wird sichergestellt, dass alle Tabellen im lokalen Speicher zusammen mit Beziehungen konsistent bleiben. Weitere Informationen zu diesem Verhalten finden Sie unter Offlinedatensynchronisierung in Azure Mobile Apps.

Überprüfen des Clientsynchronisierungscodes

Das Xamarin-Clientprojekt, das Sie heruntergeladen haben, wenn Sie das Lernprogramm "Erstellen einer Xamarin iOS-App " abgeschlossen haben, enthält bereits Code zur Unterstützung der Offlinesynchronisierung mithilfe einer lokalen SQLite-Datenbank. Im Folgenden finden Sie eine kurze Übersicht darüber, was bereits im Lernprogrammcode enthalten ist. Eine konzeptionelle Übersicht über das Feature finden Sie unter Offlinedatensynchronisierung in Azure Mobile Apps.

  • Bevor Tabellenvorgänge ausgeführt werden können, muss der lokale Speicher initialisiert werden. Die lokale Filialdatenbank wird initialisiert, wenn QSTodoListViewController.ViewDidLoad()QSTodoService.InitializeStoreAsync() ausgeführt wird. Diese Methode erstellt eine neue lokale SQLite-Datenbank mit der MobileServiceSQLiteStore Vom Azure Mobile App-Client-SDK bereitgestellten Klasse.

    Die DefineTable Methode erstellt eine Tabelle im lokalen Speicher, die den Feldern im angegebenen Typ entspricht, ToDoItem in diesem Fall. Der Typ muss nicht alle Spalten enthalten, die sich in der Remotedatenbank befinden. Es ist möglich, nur eine Teilmenge von Spalten zu speichern.

      // 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);
      }
    
  • Das todoTable Element von QSTodoService ist vom IMobileServiceSyncTable Typ anstelle von IMobileServiceTable. Die IMobileServiceSyncTable leitet alle CruD-Tabellenvorgänge (Create, Read, Update, Delete) an die lokale Speicherdatenbank weiter.

    Sie entscheiden, wann diese Änderungen durch Aufrufen IMobileServiceSyncContext.PushAsync()an das Azure Mobile App-Back-End übertragen werden. Der Synchronisierungskontext trägt dazu bei, Tabellenbeziehungen beizubehalten, indem Änderungen in allen Tabellen nachverfolgt und pusht werden, die eine Client-App geändert hat, wenn PushAsync sie aufgerufen wird.

    Der bereitgestellte Code ruft QSTodoService.SyncAsync() auf, um zu synchronisieren, wann immer die Todoitem-Liste aktualisiert oder ein Todoitem hinzugefügt oder abgeschlossen wird. Die App wird nach jeder lokalen Änderung synchronisiert. Wenn ein Pull für eine Tabelle ausgeführt wird, die über ausstehende lokale Updates verfügt, die vom Kontext nachverfolgt werden, löst dieser Pullvorgang automatisch einen Kontext-Push zuerst aus.

    Im bereitgestellten Code werden alle Datensätze in der Remotetabelle TodoItem abgefragt, aber es ist auch möglich, Datensätze zu filtern, indem eine Abfrage-ID und Abfrage übergeben werden PushAsync. Weitere Informationen finden Sie im Abschnitt "Inkrementelle Synchronisierung in Offlinedatensynchronisierung in 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);
          }
      }
    

Zusätzliche Ressourcen