29. Nov 2022iOS

Náš iOS tech stack pre vývoj mobilných aplikácií

Tech stack poskytuje produktovému tímu nástroje, ktoré potrebuje na budovanie a údržbu produktu a na zabezpečenie toho, aby spĺňal potreby zákazníkov. Tech stack zvyčajne pozostáva z programovacích jazykov, frameworkov, analytických nástrojov, architektonických vzorov a mnohých ďalších. V tomto článku vám predstavím zásobník riešení nášho iOS tímu.

Sebastian MráziOS Developer

Programovací jazyk

Swift

Swift je programovací jazyk od spoločnosti Apple, určený pre vývoj aplikácii pre platformy macOS, watchOS a iOS. Motiváciou ktorá stála za vznikom Swiftu bolo vytvoriť použiteľnú alternatívu k jazyku Objective-C. V jednoduchosti by sa dal Swift popísať ako moderný, rýchly a výkonný programovací jazyk navrhnutý s dôrazom na bezpečnosť.

UI Frameworky

Na štylizáciu používateľského rozhrania natívnych aplikácií pre iOS majú vývojári k dispozícii 2 rámce: SwiftUI alebo UIKit. V súčasnosti používame oba, avšak prevláda UIKit, a to najmä preto, že nie všetko z UIKit sa v súčasnosti dá implementovať pomocou SwiftUI, čo znamená, že pri zložitejších aplikáciách je potrebné kombinovať UIKit a SwiftUI alebo používať len samotný UIKit. Pre podrobnejší pohľad na problematiku spojenú so SwiftUI môžete nájsť v tomto článku v sekcií "SwiftUI or UIKit?"

UIKit

Väčšina iOS projektov v GoodRequest je tvorená s využitím frameworku UIKit.

Framework zahŕňa komponenty určené pre tvorbu používateľského rozhrania pre aplikácie iOS, iPasOS, WatchOS alebo tvOS.

Poskytuje architektúru pre tvorbu UI, infraštruktúru pre spracovanie používateľských vstupov a interakciu medzi používateľom, systémom a našou aplikáciou.

SwiftUI

SwiftUI je moderný framework určený pre tvorbu používateľského rozhrania pre ktorúkoľvek platformu Apple. Vznikol ako alternatíva pre UIKit s deklaratívnym prístupom k programovaniu. Framework sme začali používať až 3 roky po jeho predstavení a ešte stále má limity s ktorými sa developeri pri vývoji aplikácii stretávajú.

Výhodou je deklaratívny prístup k programovaniu ktorý zjednodušuje proces tvorby používateľského rozhrania, schopnosť spolupracovať s UIKit. Veľkou pomocou sú previews, pomocou ktorých developer takmer okamžite vidí všetky vykonané zmeny bez potreby spustenia aplikácie

Interné frameworky

V rámci tímu pracujeme aj na rôznych interných frameworkoch, ktoré nám pomáhajú zefektívniť vybrané činnosti a zároveň zabezpečiť vysokú kvalitu projektov.

GRProvider

Interná knižnica používaná pre uľahčenie práce s TableView a CollectionView v našich aplikáciách. GRProvider "preberá zodpovednosť" a developer tak nemusí sám implementovať všetky požadované metódy jednotlivých natívnych komponentov.

iOS Extensions

"Od vývojárov pre vývojárov" knižnica GoodIOSExtensions je zbierka modulov a vylepšení od komunikácie so serverom až po formátovanie textu, ktoré uľahčujú prácu našim developerov.

Package management

V našich projektoch pre iOS dodnes používame SPM aj CocoaPods, pričom o výbere jedného z nich rozhoduje to, či jeho výhody prevažujú nad nevýhodami pri použití v konkrétnej situácii, alebo dostupnosť podpory potrebných knižníc.

SPM

Swift Package Manager(SPM) je nástroj na správu distribúcie kódu napísaného v jazyku Swift. Výhodou je, že závislosti môžeme do projektov integrovať priamo prostredníctvom Xcode. Na rozdiel od CocoaPods sa súbory ukladajú len na lokálne zariadenia, a "nenafukujú" tak veľkosť projektu. Developerov však nepoteší, že pri každom builde aplikácie sa buildujú aj všetky závislosti, čím sa predlžuje dĺžka buildu. Ďalším nepríjemným faktom je, že SPM sa zatiaľ nevyrovnal CocoaPods v počte poskytovaných knižníc.

CocoaPods

CocoaPods je ďalší zo správcov, ktorý sa používa na správu závislostí na úrovni aplikácie. Obsahuje veľké množstvo použiteľných knižníc a umožňuje elegantné škálovanie akéhokoľvek projektu. Tu na rozdiel od SPM vývojárov poteší, že knižnice sa buildujú dlhšie len raz a potom je čas zostavenia podstatne príjemnejší. Nevýhodou môže byť skutočnosť, že CocoaPods je potrebné do projektov integrovať externe.

Nástroje

SwiftLint

Tento nástroj pomáha developerom udržiavať dobrú čitateľnosť kódu a zabezpečuje dodržiavanie konvencií a štýlu pri písaní kódu v jazyku Swift. SwiftLint upozorňuje developera na jeho chyby priamo prostredníctvom používateľského rozhrania Xcode.

SwiftFormat

SwiftFormat je nástroj na automatické formátovanie kódu. SwiftFormat dokáže automaticky upravovať medzery, pridávať alebo odstraňovať implicitný self, odstraňovať nepotrebné zátvorky a odstraňovať ďalšie odchýlky od štandardizovaných idiómov jazyka Swift.

Logen

Logen je interný nástroj napísaný v jazyku Python, ktorý developerom pomáha generovať lokalizované stringy pre Swift projekty priamo z Google Docs tabuľky.

Swiftgen

SwiftGen je nástroj na automatické generovanie kódu v jazyku Swift, konkrétne pre zdroje, ako sú farby, obrázky alebo lokalizované stringy, tak aby boli type-safe.

Analytické služby

Firebase

Firebase je skupina niekoľkých servisov pre aplikácie akéhokoľvek typu.

Využívame notifikácie cez Firebase Cloud messaging. Hlavnou výhodou je, že náš back-end implementuje len voči jednej službe a tá ďalej komunikuje s iOS a Android aplikáciami automaticky.

Firebase Crashlytics je služba ktorá reportuje crashe aplikácii z produkcie. Umožňuje nám ich sledovať, rýchlo na ne reagovať a zvyšovať tak kvalitu našich aplikácii

CI/CD proces

Kontinuálna integrácia a dodávanie (CI/CD) umožňuje častejšie integrovať nový kód bez toho, aby sa znížila kvalita samotnej aplikácie. CI/CD je navrhnutý tak, aby automatizoval opakujúce sa úlohy, ako je zostavovanie, testovanie a nasadzovanie, a upozorňoval na potenciálne problémy. My pre tieto účely používame primárne tri nástroje.

Fastlane

Fastlane je OpenSource platforma navrhnutá na zjednodušenie procesu nasadenia iOS aplikácií. Fastlane nám umožňuje automatizovať takmer každý aspekt nášho work flowu vo fáze vývoja alebo vydávania softvéru.

Bitrise

Developerom umožňuje automatizovať základné pracovné postupy, čo nám umožňuje kombinovať bežné úlohy, ako je nasadenie testerom, informovanie tímu na Slacku o novej verzii alebo zvýšenie čísla verzie.

Danger JS

Danger je nástroj nasadený v rámci procesu CI. Poskytuje nám možnosť automatizovať prácu spojenú s kontrolou kódu a komentovaním našich PR na základe vopred definovaných pravidiel. To umožňuje tímu developerov sústrediť sa na komplexnejšie problémy v procese revízie kódu.

Architektúra

MVVM

Developerom uľahčuje oddeliť vývoj používateľského rozhrania od vývoja logiky. V projektoch to potom vyzerá nasledovne: View a ViewModel sú definované samostatne, View má priradený svoj ViewModel. View sa stará o všetky komponenty používateľského rozhrania a zobrazovanie dát z priradeného ViewModelu. Zodpovednosťou ViewModelu je zabezpečiť potrebnú obsluhu dát, ktoré zobrazuje View.

Reactor

ReactorKit vznikol ako kombinácia Flux a Reactive Programming.

View slúži na zobrazenie dát. Reactor je vrstva nezávislá od používateľského rozhrania, spravuje stav View.

V praxi flow vyzerá nasledovne: View pošle Reactoru akciu napríklad, napríklad na základe nejakého používateľského vstupu. Reactor na danú akciu "reaguje", vykoná všetku logiku definovanú ako reakciu na danú akciu a ako odpoveď View vráti stav, ten spôsobí zmeny na View.

Coordinator

Coordinator pattern je ďalším zo vzorom štrukturálneho návrhu ktorý používame. Slúži na organizáciu logiky toku medzi jednotlivými obrazovkami. V aplikácii si definujeme všetky kroky všetkých obrazoviek. Každý krok predstavuje prechod na novú obrazovku alebo jej zatvorenie.

Sebastian MráziOS Developer