Welche Fähigkeiten sind erforderlich, um eine iOS-Anwendung zu erstellen? Yandex-Bericht

Ein mobiler Entwickler muss über klare Fähigkeiten verfügen. Sie müssen im Zusammenhang mit bestimmten Aufgaben, die bei der Erstellung und Veröffentlichung der Anwendung auftreten, darüber sprechen. Arthur Antonov arbeitet als iOS-Entwickler in der Abteilung für maschinelle Übersetzung von Yandex. In seinem Bericht für Studenten und Anfänger erklärte Arthur, was ein Entwickler tun muss, um moderne mobile Software zu erstellen.


- In unserer Abteilung gibt es zwei mobile Anwendungen: Yandex.Translate und Yandex.Keyboard. In Translator verfügen wir über viele ausgefeilte Technologien, z. B. Spracheingabe, Texterkennung durch Foto, Textübersetzung mithilfe neuronaler Netze. Eine separate Herausforderung besteht darin, diese Funktionalität offline zu halten. Das heißt, diese Funktionalität funktioniert auch ohne Internet für Sie.



Die Tastatur ist eine separate Klasse von Anwendungen. Für ihre Geschwindigkeit und die Qualität der Anwendung selbst gelten separate Anforderungen. Autokorrektur auf Russisch funktioniert bei uns: Es hilft dem Benutzer, stört ihn aber nicht. Spracheingabe, Wischeingabe.





Eine separate coole Funktion ist das dynamische Raster: Es versucht, den nächsten Buchstaben vorherzusagen und ändert abhängig davon den Tabson. Das heißt, es ist einfacher, in einen wahrscheinlicheren Brief zu gelangen.



In der Schule beschäftigte ich mich mit Sportprogrammierung. Aber als ich an die Universität kam, schien es mir schon ein bisschen langweilig, ich wollte Programme für normale Leute entwickeln, und es ist wünschenswert, dass sie immer und überall verfügbar sind. Also habe ich mich für die mobile Entwicklung entschieden. Mobile Anwendungen sind jedoch vielfältig, und die größte Frage, die sich vor mir gestellt hat, ist, wo ich anfangen soll.

Das Internet ist jetzt voll von Online-Kursen, Tutorials, Büchern zu verschiedenen Themen, und der Kopf explodiert einfach. Es ist nicht klar, wo ich anfangen soll. Daher möchte ich Ihnen in meinem Bericht dabei helfen, Ihren Lernpfad zum mobilen Entwickler aufzubauen. Was es wert ist, am Anfang studiert zu werden, das Studium dessen, was verschoben werden kann.



Nachdem ich meine Arbeit über mehrere Jahre analysiert hatte, identifizierte ich einige Schlüsselkompetenzen, die zur Lösung der meisten Probleme erforderlich sind. Dies sind grundlegende Fähigkeiten und sogenannte Toolbox-Fähigkeiten. Sie werden bei der Entwicklung mobiler Anwendungen nicht benötigt. Wenn Sie sie jedoch besitzen, wird Ihr Leben einfacher und die Qualität Ihrer Anwendungen wird viel besser.

Da eine Theorie ohne Praxis tot ist, werden wir die Fähigkeiten am Beispiel einer vereinfachten Version von Yandex.Translator untersuchen. Wenn Sie das Projekt abgeschlossen haben, sehen Sie nur einen weißen Bildschirm.

Lassen Sie uns unsere Anwendung über die Benutzeroberfläche wiederbeleben.





Es gibt zwei klassische Möglichkeiten, eine Benutzeroberfläche zu erstellen - einen grafischen Editor und Code. Dies ist eines ihrer Hollywood-Themen in der mobilen Entwicklung. Es gibt Anhänger der Entwicklung in einem grafischen Editor, und jemand erkennt nichts außer Code. Ich rate Ihnen jedoch, beide Methoden auszuprobieren. Sie werden sicherlich auf sie stoßen, und außerdem verbietet Ihnen niemand, Ansätze zu kombinieren, zum Beispiel einfache Dinge, die in einem grafischen Editor zu tun sind, und komplexe Dinge, die bereits im Code enthalten sind.



Und kürzlich haben iOS-Entwickler ein neues SwiftUI-Framework, das versucht, diese beiden Ansätze zu kombinieren. Das heißt, wenn Sie in einem grafischen Editor Änderungen vornehmen, ändert sich Ihr Code und umgekehrt. Wenn dieser Rahmen weit verbreitet wird, geraten möglicherweise alle Streitigkeiten in Vergessenheit.

Leider ist SwiftUI erst ab iOS 13 verfügbar, sodass es bisher nicht in großen Projekten verwendet werden kann.



Der grafische Editor hat eine sehr einfache Oberfläche. Wir nehmen vorgefertigte Komponenten, ziehen sie auf einen virtuellen Bildschirm und sehen sofort, was wir bekommen. Aus diesem Grund ist es sehr schnell, einfache UI-Komponenten zu erstellen. Wir können auch die Größe des virtuellen Bildschirms für verschiedene Geräte ändern und unsere Benutzeroberfläche testen, ohne die Anwendung zu starten.





Auf der anderen Seite haben wir ein Schnittstellendesign im Code. Wenn Sie eine Schnittstelle in Ihrem Code entwickeln, ist die UIKit-Bibliothek hilfreich, und Sie verwenden kleine Bausteine ​​namens UIView. UIView-Objekte entsprechen in etwa den Komponenten, die Sie auf dem Bildschirm angezeigt haben. Und genau wie in einem grafischen Editor verfügen Sie über vorgefertigte Unterklassen für häufig verwendete Komponenten wie Schaltflächen und Text.

Bei der Entwicklung in Code ist es sehr wichtig zu verstehen, dass andere UIViews UIView in sich selbst erstellen können, dh Sie können Schnittstellen beliebiger Komplexität erstellen. Als Ergebnis erhalten Sie den sogenannten Baum. Es ist einfacher, Code zu ändern. Wenn Sie also eine sehr dynamische Benutzeroberfläche haben, lohnt es sich möglicherweise, diese in Code zu schreiben, und Sie können sie später leichter ändern.



Mal sehen, welcher Code für unseren Übersetzer geschrieben werden kann.

Zuerst setzen wir die Hintergrundfarbe auf Gelb. Dann fügen wir ein Eingabefeld hinzu, in das der Benutzer den Text auf Englisch eingibt. Als nächstes fügen wir ein Trennzeichen für Schönheit hinzu und fügen schließlich ein Ausgabefeld hinzu, während der Benutzer daran gehindert wird, es zu bearbeiten.

Wir haben eine Benutzeroberfläche bereit, aber die Anwendung ist immer noch ziemlich nutzlos. Es löst nicht die Hauptaufgabe des Benutzers - die Übersetzung des Textes.

Fügen wir diese Funktionalität hinzu. Die Funktionen der SDK-Plattform werden uns helfen.



Plattform-SDKs sind eine Reihe von Tools und Bibliotheken zum Erstellen mobiler Anwendungen, die uns von Apple und dementsprechend von Google zur Verfügung gestellt werden.

Derzeit verfügt das SDK über viele Bibliotheken auf niedriger Ebene für die Interaktion mit dem Betriebssystem, und fast jede Idee einer mobilen Anwendung kann ohne großen Aufwand implementiert werden.

Welche Bibliotheken Sie verwenden, hängt von den Besonderheiten Ihrer Anwendung ab. Wenn wir beispielsweise eine Kamera erstellen möchten, benötigen Sie höchstwahrscheinlich zwei Bibliotheken: AVFoundation für die Arbeit mit der Kamera und CoreImage für die Bildverarbeitung.

Daher ist es zu diesem Zeitpunkt nicht erforderlich, alle Bibliotheken auswendig zu lernen, es ist einfach unmöglich. Wichtiger ist die Fähigkeit, die richtigen Werkzeuge zu finden. Und leider dokumentiert die offizielle Dokumentation die Funktionen nicht immer vollständig. Manchmal finden Sie einige interessante Dinge, zum Beispiel in einem Blog oder auf Twitter eines anderen Entwicklers. Es lohnt sich, dem Informationsfeld zu folgen.

Was brauchen wir also vom SDK für unseren Übersetzer?



Unser Übersetzer ist eine klassische Client-Server-Anwendung: Wir stellen eine Anfrage an den Server und erhalten eine Antwort. Dann transformieren wir es irgendwie und zeigen es dem Benutzer. Das Foundation Framework wird uns bei dieser Aufgabe helfen. Es enthält praktische Abstraktionen zur Lösung alltäglicher Aufgaben.

Wir werden die URLSession-Klasse daraus entnehmen. Dies ist die Klasse für die Arbeit mit dem Server unter Verwendung des http-Protokolls. JSONSerialization ist die Klasse, mit der wir Objekte aus dem JSON-Format konvertieren können.



Mal sehen, welchen Code wir für diese Funktionalität schreiben müssen. Links sehen Sie eine Methode, die jedes Mal ausgeführt wird, wenn Benutzereingaben geändert werden. Wir erstellen zunächst eine URL mit der Adresse des Übersetzerservers und stellen eine Anfrage. Nachdem wir die Antwort erhalten haben, analysieren wir sie aus dem JSON-Format und erhalten den gewünschten Text, dh den Übersetzungstext. Und der letzte Schritt - wir sagen, dass Sie im Eingabefeld die empfangene Antwort einstellen müssen.

Mal sehen, was wir haben. Der Benutzer gibt Hallo ein und "Hallo" erscheint:



Aber "Hallo" erschien irgendwie lange Zeit, es schien nicht wie Netzwerkverzögerungen. Vergleichen wir zur Zuverlässigkeit den älteren Bruder:

Öffnen Sie GIF

In beiden Anwendungen geben wir den Text Hallo ein und sehen, dass die Übersetzung auf dem realen Übersetzer bereits mehrmals erschienen ist. Auf unserem Übersetzer erscheint die Übersetzung mit einem großen Hang.

Um dieses Problem zu beheben, müssen wir uns mit dem Multithreading-Modell in mobilen Anwendungen vertraut machen.



Mobile Anwendungen werden genau wie Desktop-Computer in einer Multithread-Umgebung ausgeführt. Es gibt jedoch eine wichtige Einschränkung. Eine mobile Anwendung hat einen Hauptthread oder einen sogenannten UI-Thread. Und jede Operation mit der Benutzeroberfläche, jede Änderung der Benutzeroberfläche muss in diesem Hauptthread erfolgen. Wenn Sie die Farbe der Schaltfläche ändern oder verschieben möchten, sollte sich alles im UI-Stream befinden.

Andererseits kommen alle Benutzerinteraktionen auch im Haupt-Thread zu uns. Das heißt, der Benutzer hat auf eine Schaltfläche geklickt - wir haben eine Nachricht im Hauptthread erhalten. Der Text wurde wie in unserem Fall geändert - wir haben ihn auch im Haupt-Thread erhalten. Da es nur einen Stream gibt und alle Aktionen mit der Benutzeroberfläche darin stattfinden, ist es sehr wichtig, sich darum zu kümmern und so wenig wie möglich zu berechnen. Andernfalls besteht die Gefahr, dass Sie sich in einer Situation befinden, in der Sie eine Benutzeraktion für eine lange Zeit verarbeiten und eine Warteschlange von anderen Benutzeraktionen haben. Dann fängt alles an zu frieren.

Aus diesem Grund werden viele Systembibliotheken standardmäßig in einem Hintergrunddatenstrom ausgeführt. Beispielsweise dauert eine Fahrt zum Netzwerk durchschnittlich 100 bis 500 Millisekunden. Dies ist eine ziemlich teure Operation für den Hauptstrom, so dass die gesamte Interaktion mit dem Netzwerk im Hintergrundstrom stattfindet.

Dies führt wiederum zu Problemen für uns, denn wenn wir das vom Server erhaltene Ergebnis versehentlich sofort zum Ändern der Benutzeroberfläche verwenden, kann dies zu einem Absturz oder Abstürzen führen.

Erinnern Sie sich an unsere letzte Zeile:

self.textOutputView.text = translation

Darin haben wir das Ergebnis des Servers genommen und in das Ausgabefeld gesetzt. Daher haben wir die erste Regel verletzt - wir haben die Benutzeroberfläche nicht vom Haupt-Thread aus geändert. Die Standardbibliothek Grand Central Dispatch hilft dabei, dies zu beheben. Es hilft uns ganz einfach, zum Haupt-Thread zu wechseln und diese Aktion für den Haupt-Thread auszuführen.

DispatchQueue.main.async {
  self.textOutputView.text = translation
}

Mal sehen, was wir am Ende mit der Anwendung bekommen haben.



Der Benutzer gibt Text ein und wir sehen, dass die Übersetzung fast sofort erfolgt. Hurra! Wir haben dieses Problem besiegt. Bevor wir die Anwendung veröffentlichen, wollen wir uns jedoch mit einem anderen wichtigen Thema befassen - der Architektur.

Leider kann ich Ihnen beim aktuellen Projekt die Bedeutung der Architektur nicht demonstrieren, sie ist immer noch sehr klein.



Aber ich versichere Ihnen, die Architektur ist nicht aus einem besseren Leben entstanden, nicht aus der Tatsache, dass Entwickler nichts zu tun haben und Abstraktionen schreiben, damit sie nicht gefeuert werden. Architektur ist die Antwort auf die Herausforderungen der mobilen Entwicklung.

Das Hauptproblem ist die Skalierbarkeit. Wenn Ihre Anwendung zu groß wird und unterschiedliche Funktionen hat, ist es wichtig, dass sie leicht zu verstehen, zu erweitern und zu debuggen ist. Andernfalls werden durch Hinzufügen von Funktionen alle alten geändert. Und das Risiko, dass wir Fehler haben, steigt.

Warten Sie nicht, bis Ihre Anwendung wächst. Bereits in der Anfangsphase können Sie die grundlegenden Methoden zum Erstellen von Software erlernen, die auch für mobile Anwendungen wie SOLID (Gang-Muster von vier) geeignet sind.

Die Architektur mobiler Anwendungen hat ihre eigenen Besonderheiten: Ihre globalen oder großen Komponenten werden nach Architekturmustern erstellt, die auf hoher Ebene angeben, welche Objekte zu welcher Schicht gehören sollen. Am beliebtesten sind MVC, MVP und MVVM.

Und vergessen wir nicht, dass Architektur in Wirklichkeit keine Silberkugel ist. Es ist notwendig, die Besonderheiten des Projekts zu berücksichtigen. Wenn Sie mit Tränen in den Augen eine Art Architektur auf Ihr Projekt ziehen, ist möglicherweise etwas schiefgegangen.

Wenn Sie Theorie studieren, wird es Ihnen furchtbar kompliziert erscheinen. Wenn Sie jedoch in einem Projekt mit guter Architektur arbeiten, werden Sie glücklich sein, da es für Sie einfacher geworden ist, Code zu schreiben. Sie wissen, was und wo Sie hinzufügen müssen, damit Sie eine Funktion haben. Um die Architektur in dieser Phase gut kennenzulernen, empfehle ich Ihnen daher, in einem großen Projekt zu arbeiten oder ein Praktikum zu absolvieren. Wenn Sie keine solche Gelegenheit haben, stellen jetzt viele Unternehmen ihre Projekte in Open Source: Wikipedia, Firefox. Und niemand verbietet dir, zu GitHub zu gehen und dort zu sehen.

Unsere Bewerbung ist also fertig. Lassen Sie es uns gemeinfrei machen, damit Benutzer es herunterladen können.



In den meisten Fällen erhalten Nutzer Apps von Google Play und dem App Store. Bevor wir die Anwendung zum Store hinzufügen, müssen wir sie unterschreiben. Dies liegt an der Tatsache, dass Betriebssysteme Anwendungen nur von vertrauenswürdigen Entwicklern ausführen. Auf mobilen Plattformen haben wir daher viel weniger bösartige Anwendungen und Viren, da nur vertrauenswürdige Entwickler Zugriff auf die Arbeit auf mobilen Geräten erhalten.

Dazu müssen Sie ein Entwicklerzertifikat ausstellen. Dies ist eigentlich eine kleine Bürokratie und zum Glück ist sie in den neuesten Versionen von Xcode automatisiert.

Außerdem müssen Sie Screenshots für Ihre Anwendung und Beschreibung machen. Die letzten beiden Schritte sollten nicht vernachlässigt werden, da die Seite Ihrer Anwendung die Werbung ist. Wenn es nicht hell ist, war höchstwahrscheinlich unsere gesamte Entwicklung vergebens, da niemand die Anwendung herunterladen wird.

Die Anwendung wurde hochgeladen. Lassen Sie uns nun über einige zusätzliche Fähigkeiten sprechen, die Ihr Leben vereinfachen und die Qualität der Anwendungen verbessern können.

Die Fähigkeit, die Sie am häufigsten verwenden, ist das Debuggen.



Die Haupt-Debugging-Methode ist das gute alte console.log oder printf. Es hat viele Namen, aber die Bedeutung ist die gleiche. Wenn etwas schief geht, fügen wir Protokollierung hinzu und drucken Variablen. Leider hat diese Methode auch kritische Nachteile.

Der erste Nachteil ist das Ändern des Quellcodes. Es gibt Fehler, die verschwinden, wenn Sie printf hinzufügen. Und du entfernst printf - steh wieder auf. Diese Bugs haben sogar einen eigenen Namen - Heisenbug.

Die zweite Konsequenz ist, dass Sie Ihre Anwendung neu kompilieren und erneut ausführen müssen. In großen Projekten kann dies Minuten dauern. Wenn Sie beim Hinzufügen jedes neuen Protokolls eine Minute warten müssen, verbringen Sie insgesamt viel Zeit.

Und der letzte, kritischste Nachteil von printf - leider hilft es nicht bei allen Fehlern.

Ein Beispiel aus der persönlichen Praxis. Bei der Entwicklung des Tastatur-Onboarding ist Folgendes passiert:



In der folgenden Systemtastatur wurden anstelle der Systemkugel- und Mikrofonsymbole einige Kennungen angezeigt. Beim Debuggen dieses Fehlers fühlte ich mich wie folgt:



Wie kann eine Anwendung eine Systemtastatur beschädigen ?! Es stellte sich heraus, dass es möglich war.



Bei der Untersuchung des Fehlers hat mir das Debugger-Wissen sehr geholfen. Insbesondere Festlegen des Haltepunkts zum Aufrufen bestimmter Funktionen. Sehen Sie sich den Debugger an, in dem wir auf unserer Benutzeroberfläche nachsehen können, wer welche Klasse und welchen Status hat.

Als ich diese ersten beiden Punkte ausnutzte, stellte sich heraus, dass das Problem in der UIKit-Bibliothek lag. iOS-Entwickler sind damit vertraut und wissen, dass es keinen Open Source-Code gibt. Wenn Sie Assembler kennen, wird jede Bibliothek für Sie zu Open Source, sodass kleine Grundlagen des Assemblers nützlich sein können.

Es gibt auch die sogenannte Fähigkeit des Reverse Engineering. Manchmal kann es ziemlich langweilig sein, manchmal ist es interessant - eine Detektivgeschichte, in der Sie untersuchen, wie eine Komponente mit einer anderen verbunden ist und wie alles in der Bibliothek erledigt wird. Als Ergebnis stellte sich heraus, dass das Problem in der Laufzeit der Objective-C-Sprache lag.

Die nächste wichtige Fähigkeit ist die Optimierung unserer Anwendungen.



Mobile Geräte verfügen nur über begrenzte Ressourcen, sodass häufig Leistungsprobleme auftreten. Bei der Entwicklung müssen wir über Dinge wie den CPU-Verbrauch nachdenken. Meistens ist dies die Komplexität des Codes, den Sie schreiben. Rendering-Geschwindigkeit, Speicher und Netzwerkverkehr, da die meisten Benutzer Ihre Anwendung eher im mobilen Verkehr verwenden. Lassen Sie uns die Benutzer respektieren und vielleicht wird es gegenseitig sein.

Der fünfte Punkt ist die Batterie, sie folgt aus den ersten vier.

Das Wichtigste bei der Optimierung von Anwendungen ist die Identifizierung von Problembereichen. Wenn Sie sich nur auf Ihre Annahmen verlassen, werden Sie wahrscheinlich viel Zeit verlieren und nicht zu viel Gewinn erzielen. Dies wird den Plattform-Tools helfen. Dazu gehört ein Profiler - ein Programm, das Ihnen zeigt, wo in Ihrem Code das Programm die meiste Zeit verbringt. Das heißt, Sie sehen die Methode, bei der Ihr Programm am häufigsten hängt, und höchstwahrscheinlich finden Sie den Grund für das Einfrieren.

Wenn Sie die Algorithmen und Datenstrukturen kennen, können Sie eine effizientere Lösung finden. Auch Multithreading-Wissen kann hier helfen. Es gibt jetzt Multi-Core-Prozessoren auf Mobilgeräten. Wenn Sie das Problem über mehrere Threads hinweg parallelisieren, können Sie die Leistung leicht um das N-fache steigern.

Manchmal kommt es vor, dass die ersten beiden Punkte leider nicht helfen. Anschließend lernen Sie, wie das Betriebssystem funktioniert, und kennen Systemaufrufe wie die Speicherzuordnung (mmap). In unserem Fall haben iOS-Tastaturen von Drittanbietern eine Einschränkung des RAM-Verbrauchs - 52 Megabyte. Das heißt, wir möchten Funktionen hinzufügen, eine schöne Benutzeroberfläche erstellen, sind jedoch auf 52 Megabyte begrenzt. Was damit zu tun ist, ist nicht klar.

Beim Hinzufügen einer weiteren Funktion ist dies geschehen. Wir haben oft angefangen, diese Grenze zu überschreiten und wussten nicht, was wir damit anfangen sollten. Infolgedessen kam der Speicherzuordnungssystemaufruf zur Rettung. Wir nahmen eine Datei mit einem Wörterbuch, von wo wir alle Hinweise erhielten, und begannen, die Speicherkarte aufzurufen. Daher arbeiten wir mit einem Teil der Datei, ohne sie vollständig in den Arbeitsspeicher zu laden.

Das letzte häufig auftretende Problem ist die Startzeit. Hier kann ich Ihnen raten, zu lesen, was passiert, bevor Ihr Code funktioniert. Insbesondere über statische und dynamische Verknüpfung.



Die letzte nützliche Fähigkeit ist die kontinuierliche Integration oder Automatisierung langweiliger Aufgaben.

Niemand mag langweilige Aufgaben, deshalb automatisieren wir sie einfach. In den meisten Fällen ist es am einfachsten, die Anwendung für jedes von Ihnen vorgenommene Commit zu erstellen. Je öfter Sie die Anwendung erstellen, desto schneller können Sie das Problem finden. Wenn Sie Tests haben, führen Sie diese auch aus.

Wie gesagt, die Veröffentlichung ist mit einer kleinen Bürokratie verbunden, daher ist sie auch sehr automatisiert, und Sie können die Assembly für jede Poolanforderung im Beta-Store freigeben, damit Tester sie testen können. Sie können auch die Erstellung von Screenshots für den App Store automatisieren, um sie nicht manuell zu erstellen.

Für alle aufgeführten Fähigkeiten habe ich nützliche Materialien gesammelt .das wird in ihrem Studium helfen. Es enthält auch den Quellcode für eine vereinfachte Version des Übersetzers. Vielen Dank für Ihre Aufmerksamkeit. Ich hoffe, Sie haben etwas klarer, was Sie lernen müssen, um Ihre Reise zu beginnen.

Source: https://habr.com/ru/post/undefined/


All Articles