Herausforderungen und Learnings beim Migrieren einer Xamarin.Forms App zu .NET MAUI

Autor: Simon Hirschel
Software Engineer bei BAYOOMED

Co-Autor: Sebastian Wittor
Project Manager Medical Engineering bei BAYOOMED

 

Mit der Veröffentlichung von .NET MAUI 6 im Mai 2022 stellte sich uns die Frage, ob eine Migration des nicht mehr unterstützten Xamarin.Forms für unser aktuelles Projekt notwendig ist. Hinzu kam eine Deadline für iOS-Releases. Ab diesem Zeitpunkt würde es nicht mehr erlaubt sein, Apps mit veralteten Frameworks in den App Store zu bringen. Wir mussten uns nun also entscheiden, ob wir uns weitgehend blind in die Migration stürzen oder ob wir nach alternativen Lösungen suchen.

Letztendlich entschieden wir uns für eine Migration unseres Projekts auf .NET MAUI 6 und später auch für ein Upgrade auf .NET MAUI 8. Wie wir zu dieser Entscheidung gekommen sind, liest Du in diesem Blogartikel.

Das erste Upgrade

Microsoft stellt ein Tool zur Verfügung, um kleinere Xamarin-Apps auf MAUI zu aktualisieren. Es ersetzt gängige Verwendungen und einige Einstellungen durch die neuen MAUI-Äquivalente. Leider tut es nicht viel mehr als das und es war immer noch eine Menge Arbeit nötig, um die Kompilierung der App ohne eine Vielzahl von Fehlern zu ermöglichen.

Mit MAUI ist es auch empfehlenswert, von mehreren Projekten für jede Plattform zu einem einzigen Projekt mit speziellen Ordnern für jede Plattform zu wechseln.

Außerdem mussten wir Ersatz für einige SOUPs finden, die für das Innenleben unserer App unerlässlich waren. Dazu gehörten Xamarin Essentials, für das es glücklicherweise einen Ersatz im MAUI Community Toolkit gab, und MvvmCross. Da es keinen gleichwertigen Ersatz für MvvmCross gab, mussten wir es entfernen und ersetzen. Da wir MvvmCross sowohl für Views, View Models, Navigation und Lifecycle Events für die App verwendet haben, war dies die größte Hürde, die wir überwinden mussten, um die App wieder zum Laufen zu bringen.

Letztendlich verursachte dies eine Menge Verzögerungen und erforderte das Umschreiben der meisten unserer übergeordneten Ansichten und Ansichtsmodelle, um neu erstellte Ereignisse einzubinden, die der Art und Weise, wie MvvmCross sie handhabte, ähnlich waren. Darüber hinaus mussten wir unser gesamtes Navigationssystem überarbeiten, um die Übergabe und Rückgabe von Parametern auf die gleiche Weise wie zuvor zu ermöglichen. Beide Änderungen waren sehr zeitintensiv und erforderten eine Menge Tests und Fehlersuche, bis sie so funktionierten, dass wir mit Änderungen an der eigentlichen Funktionalität der App und ihrer Ansichten beginnen konnten.

Veränderte Ansicht

Eines der Hauptprobleme war, dass Steuerelemente in .NET MAUI nicht auf die gleiche Weise funktionieren wie in Xamarin.Forms. Dieser Unterschied bedeutet, dass einige vertraute UI-Elemente Anpassungen erfordern, um im neuen Framework korrekt zu funktionieren.

Außerdem haben sich die Standardwerte für Auffüllungen, Ränder und andere layoutbezogene Variablen geändert. Infolgedessen ist eine beträchtliche Menge an Anpassungen erforderlich, damit die Ansichten ähnlich wie ihre früheren Versionen aussehen. Dazu müssen diese Eigenschaften für fast jede einzelne Ansicht in der Anwendung angepasst werden, was eine zeitaufwändige und akribische Arbeit sein kann. Auch visuelle Probleme treten während des Migrationsprozesses häufig auf. Viele Ansichten weisen Unstimmigkeiten auf, die nur durch weitere Umschreibungen behoben werden können. Jede Ansicht muss sorgfältig überprüft und geändert werden, um diese visuellen Probleme zu beheben und ein konsistentes und ausgefeiltes Erscheinungsbild der gesamten Anwendung zu gewährleisten.

MvvmCross

MvvmCross hat in unserem Entwicklungsprozess mit Xamarin eine entscheidende Rolle gespielt und uns eine Menge Arbeit erspart. Es war tief in unsere Codebasis integriert und übernahm wesentliche Aspekte wie den Start der App, den Lebenszyklus der App und fungierte als Singleton-Anbieter. Diese umfassende Einbindung bedeutete, dass MvvmCross mit fast jedem Teil unserer Anwendung verwoben war.

Die Entfernung von MvvmCross während der Migration zu .NET MAUI verursachte jedoch zahlreiche Probleme. Wir mussten viele Lebenszyklusereignisse für unsere Ansichtsmodelle neu schreiben, da die vorherige Implementierung stark auf MvvmCross basierte. Außerdem mussten wir unseren eigenen Navigationsdienst manuell entwickeln, da die von MvvmCross bereitgestellte integrierte Navigation nicht mehr verfügbar war.

Fast alle unsere Ansichten mussten aufgrund des Fehlens von MvvmCross geändert werden. Diese umfangreiche Überarbeitung war notwendig, um sicherzustellen, dass die Ansichten korrekt funktionierten und mit den Anforderungen des neuen Frameworks übereinstimmten. Trotz der Herausforderungen war die Bewältigung dieser Probleme für eine erfolgreiche Migration auf .NET MAUI unerlässlich und ermöglichte es uns, die Funktionalität unserer Anwendung zu erhalten und zu verbessern.

Bugs, Bugs, Bugs

Als .NET MAUI mit .NET 6 als „produktionsreif“ freigegeben wurde, erwarteten wir einen reibungslosen Übergang. Die Realität sah jedoch ganz anders aus. Wir stießen auf zahlreiche Fehler, die sich erheblich auf unseren Entwicklungsprozess auswirkten.

Erstens funktionierten einige Ansichtselemente nicht wie erwartet. Hinzu kamen spürbare Leistungseinbußen, die dazu führten, dass bestimmte Funktionen, wie die Karussellansicht, praktisch unbrauchbar wurden. Außerdem hatten wir mehrere Probleme mit der Ausführung von MAUI in Visual Studio 2022, insbesondere nach bestimmten Updates. Verbindungsprobleme mit MAUI auf dem Mac und Bereitstellungsprobleme für iOS im AppCenter erschwerten die Situation zusätzlich.

Auch das Debugging erwies sich als besonders schwierig. Der Debugger von Visual Studio 2022 hatte häufig Probleme mit MAUI, was es schwierig machte, Probleme effizient zu identifizieren und zu beheben. Obwohl Korrekturen versprochen wurden, verzögerten sie sich oft und wurden erst mit dem nächsten .NET-Upgrade bereitgestellt. Diese Upgrades behoben manchmal bestehende Probleme, brachten aber auch neue mit sich, so dass ein Kreislauf aus Fehlersuche und Anpassung entstand.

Trotz dieser Herausforderungen arbeiteten wir weiter an den Fehlern und Leistungsproblemen und bemühten uns, die neuen Möglichkeiten von .NET MAUI optimal zu nutzen. Auch wenn die Reise voller Hindernisse war, so brachte uns doch jede Korrektur und Umgehung einer stabilen und voll funktionsfähigen Anwendung näher.

Nicht-App-bezogene Herausforderungen

Zusätzlich zu den technischen Hürden sahen wir uns mit mehreren nicht-app-bezogenen Herausforderungen konfrontiert, die unsere Migration zu .NET MAUI erschwerten. Eines der Hauptprobleme war die geringe Entwicklerkapazität. Da nur eine begrenzte Anzahl von Entwickler:innen zur Verfügung stand, wurde die Arbeitslast erdrückend und verlangsamte den Fortschritt erheblich.

Außerdem war unser Fokus aufgrund anderer laufender Projekte geteilt, so dass wir uns nicht voll auf den Migrationsprozess konzentrieren konnten. Dies wurde durch die kontinuierliche Veröffentlichung von Updates und neuen Funktionen für Xamarin noch verschärft, die neben der Migration zu .NET MAUI zusätzliche Zeit und Mühe für die Integration und Verwaltung erforderten.

Diese Faktoren haben den Migrationsprozess insgesamt erschwert, so dass wir unsere Zeit und unsere Prioritäten sorgfältig verteilen mussten, um trotz der Einschränkungen stetige Fortschritte zu erzielen.

MAUI-Migrationsanalyse vor dem Migrationsversuch

Bevor die Migration zu .NET MAUI in Angriff genommen wird, ist es wichtig, die potenziellen Herausforderungen und Anforderungen gründlich zu analysieren. Stelle Dir die folgenden Fragen, um den Migrationsaufwand besser einschätzen zu können:

  • SOUP Kompatibilität: Welche SOUPs (Software of Unknown Pedigree) müssen ersetzt werden, weil sie nicht mit MAUI kompatibel sind?

    Auswirkungen: Beurteile die Auswirkungen der einzelnen SOUPs auf Dein Projekt.
    Ersetzungen: Stelle fest, ob es für diese SOUPs MAUI-spezifische Ersatzgeräte gibt.

  • Projektstruktur: Verwendet das Projekt MAUI oder native Ansichten?

    Erfahrung: Die Migration mit nativen Ansichten geht tendenziell schneller, wie bei anderen Projekten beobachtet wurde.

    Bruch der Ansicht: Sei darauf vorbereitet, dass Ansichten aufgrund von Fehlern und Änderungen der Standardwerte für Kontrollgrößen abbrechen können.

    • Karussell-Ansichten: Leistungsprobleme sind häufig; erwäge, stattdessen eine andere SOUP zu verwenden.
    • GestureRecognizers: Es gibt Probleme in früheren Versionen von .NET MAUI.
    • Ränder: Viele Ränder müssen aufgrund von Änderungen der Standardwerte angepasst werden.
    • Problemverfolgung: Überwache die Fehlerverfolgung regelmäßig auf Aktualisierungen und Korrekturen.
  • MvvmCross Abhängigkeit: Verwendest Du MvvmCross?

    Ersetzen: Es gibt keine einfache Alternative, so dass individuelle Lösungen erforderlich sind:

    • Lifecycle Events
    • Navigation
    • CustomAppStart 

    Erhöhung des Aufwands: Der Migrationsaufwand wird sich durch die tiefe Integration von MvvmCross in die meisten Projekte erheblich erhöhen, was zu einem „Ripple-Effekt“ führt.

  • Benutzerdefinierte Ansichten und Steuerelemente: Verwendest Du benutzerdefinierte Ansichten, Renderer oder Steuerelemente?
    Modifikationen: Die meisten Elemente benötigen kleinere oder größere Änderungen, um in MAUI zu funktionieren.

    Renderer: Erwarte komplette Änderungen in der Funktionsweise der Renderer, einschließlich Umbenennung und möglicher Neuformulierung.

  • Ziel-.NET MAUI Version festlegen: Auf welche .NET MAUI Version soll migriert werden?
    Versionsauswahl: Wähle die letzte produktionsreife Version.

    Bug Fixes: Sei Dir sich bewusst, dass einige Probleme erst in späteren Versionen behoben werden können, was möglicherweise weitere Upgrades während der Entwicklung erforderlich macht.

  • Zusätzlich zu beachten:

    • SOUP-Aktualisierungen: Alle SOUPs müssen aktualisiert und vollständig validiert werden.
    • Unit-Tests: Die Aktualisierung von Unit-Tests kann zeitaufwändig sein, insbesondere bei erheblichen Logikänderungen und MvvmCross-Ersetzungen.
    • Dokumentation: Aktualisierung der allgemeinen Dokumentation zur Berücksichtigung der Migration.
    • UI-Neuausrichtung: Stelle sicher, dass die Benutzeroberfläche mit der Xamarin-Version übereinstimmt, falls erforderlich.
    • Singleton-Behandlung: Anpassung der Singleton-Behandlung an die MAUI-Praktiken.
    • Pipeline-Anpassungen: Ändere Build- und Deployment-Pipelines nach Bedarf.
    • Externe Werkzeuge: Aktualisiere und teste alle anderen externen Tools, die im Projekt verwendet werden.

Wenn diese Faktoren sorgfältig berücksichtigt werden, kannst Du Dich besser auf die Komplexität der Migration zu .NET MAUI vorbereiten und einen reibungsloseren Übergang gewährleisten.

How to migrate – Unsere Empfehlungen

Die Migration auf .NET MAUI ist ein komplexer Prozess, der eine sorgfältige Planung und Ausführung erfordert. Im Folgenden findest Du einige Empfehlungen für Deine Migrationsbemühungen:

Analysieren und planen

  • Überprüfe die Schlüsselfragen: Beginne mit der Analyse der Schlüsselfragen, die Du in Deiner Migrationsanalyse formuliert hast.
  • Testlauf: Führe einen Testlauf des Upgrade-Assistenten durch, um zusätzliche Aufgaben zu identifizieren, die erledigt werden müssen.
  • Fehlerverfolgung: Überprüfe Issue-Tracker auf Elemente, die Du verwendest, um potenzielle Probleme vorauszusehen.
  • Priorisiere den SOUP-Ersatz: Konzentriere Dich darauf, wichtige SOUPs wie MvvmCross frühzeitig im Prozess zu ersetzen.
  • Gemeinsame Kodierung: Ziehe eine gemeinsame Kodierung für die kritischsten Teile der Anwendung in Betracht, um spätere Probleme zu vermeiden.
  • Inkrementelle Änderungen: Teile die Migration in kleinere, überschaubare Aufgaben auf, damit Du nicht überfordert wirst.

Ressourcen verteilen

  • Engagierter Fokus: Stelle sicher, dass sich die Entwickler:innen ohne nennenswerte Ablenkungen voll auf die Migration konzentrieren können.
  • Projekt einfrieren: Friere andere Teile des Projekts ein, bis die Migration abgeschlossen ist, um den Fokus aufrechtzuerhalten.
  • Teamstabilität: Vermeide größere Änderungen im Team während der Migration, um Kontinuität und Dynamik zu erhalten.
  • Kaskadierende Änderungen minimieren
  • Sorgfältige Implementierung: Versuche, Änderungen so zu implementieren, dass der Bedarf an weiteren Anpassungen in anderen Teilen der Anwendung minimiert wird.

Wenn diese Empfehlungen befolgt werden, kannst Du den Migrationsprozess besser steuern und potenzielle Probleme abmildern, was zu einem erfolgreicheren Übergang zu .NET MAUI führt.

Klingt spannend und Du möchtest Dich dazu austauschen?