Seit der Entwicklung des Smartphones fragen viele Entwickler dieselbe Frage: Wie kann man mit EINER entwickelten App möglichst viele User und alle Plattformen erreichen?
Mehr als 11 Jahre ist es jetzt her, als Apple das erste iPhone auf den Markt brachte und einen weltweit verfügbaren Handelsplatz für mobile Applikationen anbot, anschließend folgte BlackBerry, dann Android und zu guter Letzt, das Windows Phone – für jede einzelne Plattform eine App zu entwickeln ist aufwändig und teuer – sicherlich gibt es doch eine günstigere Lösung, oder?
Wir bei all about apps, setzen seit sieben Jahren vorwiegend auf eine native Umsetzung von mobilen Applikationen. Unter nativer Entwicklung versteht man, dass die jeweils vom Hersteller empfohlenen Tools, Programmiersprachen und Konzepte verwendet bzw. angewendet werden. Die Hauptargumente, die für die native Umsetzung von Apps sprechen sind Qualität und Sicherheit. Alle Entwicklungen, die sich an die Vorgaben und Empfehlungen der Hersteller halten, profitieren von den automatischen Sicherheitsupdates und Optimierungen, die laufend bereitgestellt werden.
Dennoch beobachten wir aufmerksam alle Entwicklungen im Bereich Cross-Plattform Development und haben bereits umfangreiche Erfahrungen mit den diversen plattformübergreifenden Lösungen wie Cordova, Xamarin und React Native sammeln können.
Einige dieser Lösungen haben durchaus vorteilhafte Ansätze, wenn es um simple Applikationen geht, doch sobald es etwas anspruchsvoller wird, empfehlen wir unbedingt die native Umsetzung für Android und iOS. Weshalb und warum, erfährst du in diesem Blog-Post.
Was versteht man unter Cross-Plattform?
iOS Apps werden traditionell in Xcode mittels Objective-C oder in Swift geschrieben; Android Apps via Android Studio in Java oder Kotlin. Das sind jeweils die nativen Entwicklungsumgebungen und Programmiersprachen, die von den Systemherstellern standardmäßig unterstützt und empfohlen werden. Wenn du also eine App für beide Plattformen erstellen möchtest, benötigst du Erfahrung mit jeweils einem speziellen Tool und Kenntnisse in zwei Programmiersprachen.
Plattformübergreifende Lösungen zielen darauf ab, dieses Problem zu vereinfachen, indem ein einziges Tool mit nur einer Programmiersprache für mehrere Plattformen verwendet wird. Dabei unterscheidet man in zwei Kategorien:
- Diejenigen, die eine Web-Technologie verwenden und von allen Plattformen unterstützt werden. Diese Kategorie von Apps werden mittels JavaScript erstellt und in einem Web-Container auf der jeweiligen Plattform ausgeführt. Zu den bekanntesten Vertretern zählen Cordova, Sencha und Ionic.
- Die andere Kategorie wird oft als „native Cross-Plattform“ bezeichnet – weil der geschriebene Code automatisch in einen nativen Code übersetzt wird. Das hat den Vorteil, dass die App eine nahezu native Leistung erzielen kann, während die webbasierte Lösung, häufig mit Performance-Problemen zu kämpfen hat. Zu dieser Kategorie gehören „React Native“ und Xamarin.
Alle diese Cross-Plattform-Technologien sind ziemlich raffiniert. Nehmen wir einen Blick auf die Vorteile, der oben genannten Optionen:
„Shared Code“
Eine gemeinsame Codebasis für alle Plattformen. Dadurch wird der Arbeitsaufwand für die Erstellung der Apps vermindert, was die Kosten reduziert und zu einer kürzeren Time-to-launch führt.
Wartung
Geteilter Code reduziert nicht nur die Kosten während der Entwicklungsphase, sondern erfordert im Wartungsfall auch nur einen Eingriff in der Code-Basis (Zumindest, ist das der Gedanke dahinter).
Eine Sprache für alles
Für mehrere Plattformen ist nur eine Sprache nötig. Normalerweise benötigt man gleich mehrere Sprachen wie eine Programmierer-, Skript- und Markup-Sprache für die Benutzeroberfläche.
Ein Team für alles
Das ist ein riesiger Vorteil. Denn ein einzelnes Team ist günstiger, erleichtert das Projektmanagement erheblich und arbeitet effizienter. Zudem wird alles Wissen innerhalb des Teams leichter weitergegeben.
Funktioniert auch im Web
Nahezu alle Cross-Plattform Lösungen (mit Ausnahme von Xamarin) können mit wenig Aufwand auch am Desktop Browser ausgeführt werden. Dies bietet alle oben genannten Vorteile auch für die Webversion deiner App.
Zu gut, um wahr zu sein
Im Laufe der Jahre haben wir viele dieser Cross-Plattform-Technologien beobachtet und teilweise für Demos und Prototypen eingesetzt. Doch bei vielen Technologien sind wir auf einige Haken gestoßen, die wirklich geschmerzt haben:
iOS und Android sind komplett verschieden
Alleine aus der neuropsychologischen Sicht, sind Nutzer von Android- und iOS unterschiedlich und sollten anders angesprochen werden. Jede Plattform hat ihre eigenen Richtlinien und Regeln. Man kann die eine Plattform nicht einfach per Copy-Paste in die andere einfügen.
Performance
Nativer Code ist unschlagbar. Der plattformübergreifende Code wird zwar in Bytecode oder einen nativen Maschinencode übersetzt und sollte theoretisch eine so gute Leistung wie der native Code erzielen, jedoch gibt es häufig Nachteile. Nehmen wir als Beispiel Xamarin: Jede App wird standardgemäß mit einer ganzen Bibliothek an Funktionen übersetzt – das spiegelt sich zwar nicht auf die Flüssigkeit der Animationen und der User Aktionen ab, jedoch sehr am Speicherverbrauch und der Größe, der App. Folglich können aus einer simplen „hello world“-App, schnell mal 16 MB werden.
Auf der oberen Grafik ist klar zu erkennen, dass die Leistung eines web-basierten Ansatzes noch nicht mal annähernd an die eines Nativen herankommt. Und obwohl die Technik sich hier stetig verbessert hat, ist der Unterschied in der Reaktionsfähigkeit nicht nur messbar, sondern auch auffällig.
Kannst du dich an die alte und furchtbar langsame Facebook-App erinnern? Das waren alles Webansichten!
„Da das gesamte Rendering mithilfe von Web-Technologie erfolgt, können wir leider keine nativen Benutzererfahrungen anbieten.“ – Facebook
Bugs
Obwohl Xamarin ein durchdachtes Tool ist, ist es auch gleichzeitig eine wahre Bug-Brutstätte. Die komplexe Toolchain, erfordert einen komplexen Debugging-Prozess. Wann immer etwas schief geht, ist das Problem schwer zu lokalisieren, zu googeln oder zu wissen, ob der Fehler am Code selbst, oder an der Plattform liegt. Das kostet wertvolle Zeit, die meistens nicht einberechnet wurde.
Unausgereifte Tools
Die Tatsache, dass plattformübergreifende Toolchains weniger ausgereift sind als ihre nativen Konkurrenten, führt zu einer hohen Anzahl an Bugs und stört die Entwicklung erheblich. Mit den automatisierten Code-Checks, die Xcode und Android Lint ausführen, um vor Sicherheitsproblemen während der Entwicklung zu warnen, können plattformübergreifende Tools nicht mithalten. Das gilt auch für die IDEs, die helfen, Codes zu vervollständigen, zu beschleunigen und Bugs aufzuspüren. Native Plattformen haben hier einfach einen jahrelangen Vorsprung.
Langsame Integration neuer Plattform-Features
Xcode und Android Studio (basierend auf IntelliJ) haben sich bewährt und veröffentlichen immer neue Funktionen mit ihren Updates. Außerdem bieten sie den Entwicklern garantierten Zugriff auf 100% der Funktionen. Im Gegensatz zu nativen Plattformen, werden plattformübergreifende Tools aufgrund ihrer Art, bei jedem Update auf der Strecke bleiben. Xamarin ist zwar sehr bemüht Updates schnell zu implementieren, jedoch gibt es immer Probleme.
Verfügbarkeit von Bibliotheken
Viele plattformübergreifende Tools haben einen nützlichen Paketmanager, der ein breites Angebot von Plug-Ins und Bibliotheken zur Verfügung stellt. Eine besonders große Palette an Angeboten, bietet dabei der Paketmanager von Xamarin NuGet-Repository. Keines dieser Repositories ist mit der Anzahl der für native Plattformen verfügbaren Bibliotheken (zum Beispiel auf GitHub) vergleichbar. Zwar gibt es die Möglichkeit, vorhandene native Bibliotheken auf Xamarin zu portieren, ohne grundlegendes Wissen der nativen Plattform ist dies allerdings nur schwer zu realisieren.
Wartung
Bei einer sauberen Implementierung von nativen Apps verursacht die laufende Wartung oft nur sehr geringe Aufwände, da die Plattform-Hersteller bei den Updates der Betriebssysteme im frühzeitig informieren und passende Lösungsansätze bieten. Sicherheitskritische Updates werden ebenfalls von der Plattform abgedeckt und müssen nicht in der App durchgeführt werden. Bei Cross-Plattform-Apps hat man hingegen oft das Problem, dass Sicherheitslücken sehr spät oder gar nicht gemeldet werden. Zudem muss man als App Entwickler selbst dafür sorgen, dass sicherheitsrelevante Fehler behoben werden.
White Labeling
Dieser Begriff ist wichtig, wenn du deine App mit unterschiedlichen Brandings für verschiedene Clients bereitstellen willst. Die Features “Build Flavours” auf Android oder “Targets” auf iOS, unterstützen diese Funktionen, ohne größeren Probleme. Bis dato gibt es leider keine plattformübergreifenden Ansätze, die hier mit ihren nativen Konkurrenten mithalten können. Das bedeutet mehr kostbare Entwicklungszeiten und komplexere Implementierungen.
Fazit
Geht es in deinem Projekt darum, komplexe Anforderungen umzusetzen und möchtest du für deine User eine großartige User Experience kreieren, sollte die App native entwickelt werden. Auch was die Entwicklungen in der Zukunft betrifft, wird man aus jetziger Sicht mit nativen Lösungen auf der sicheren Seite stehen. Denn Apple und Google werden ihre Plattformen kontinuierlich verbessern und aufbauen. Zusätzlich profitieren Entwickler von der umfangreichen und weltweiten Unterstützung der nativen Communities.
Cross-Plattform-Ansätze sind dagegen vollständig von den jeweiligen Unternehmen abhängig, die sie finanzieren. Es gibt keine Garantie für Unterstützung und Zukunftspläne. Das bedeutet, dass deine ganze Arbeit mit dem nächsten iOS oder Android Update nicht mehr kompatibel sein könnte. Wenn das passiert, kann man nur noch hoffen, dass der plattformübergreifende Ansatz als Open-Source-Projekt an die Community weitergegeben wird.