17. Jul 2023
iOSNáš iOS tech stack pro vývoj mobilních aplikací
Tech stack poskytuje produktovému týmu nástroje, které potřebuje k budování a údržbě produktu a k zajištění toho, aby splňoval potřeby zákazníků. Tech stack se obvykle skládá z programovacích jazyků, frameworků, analytických nástrojů, architektonických vzorů a dalších. V tomto článku vám představím zásobník řešení našeho týmu pro iOS.
Programovací jazyk
Swift
Swift je programovací jazyk společnosti Apple pro vývoj aplikací pro platformy macOS, watchOS a iOS. Motivací pro vznik Swiftu bylo vytvořit použitelnou alternativu k jazyku Objective-C. Zjednodušeně by se dal Swift popsat jako moderní, rychlý a výkonný programovací jazyk navržený s důrazem na bezpečnost.
UI Frameworky
Vývojáři mají k dispozici dva rámce pro stylizaci uživatelského rozhraní nativních aplikací iOS: SwiftUI nebo UIKit. V současné době používáme oba, ale převažuje UIKit, a to hlavně proto, že ne vše, co je v UIKitu, lze v současné době implementovat pomocí SwiftUI, což znamená, že pro složitější aplikace je třeba kombinovat UIKit a SwiftUI, nebo používat pouze UIKit. Podrobnější pohled na problematiku spojenou se SwiftUI naleznete v tomto článku v části „SwiftUI nebo UIKit?“
UIKit
Většina projektů iOS v GoodRequest je tvořena s využitím frameworku UIKit.
Framework obsahuje komponenty určené k vytváření uživatelských rozhraní pro aplikace iOS, iPasOS, WatchOS nebo tvOS.
Poskytuje architekturu pro tvorbu UI, infrastrukturu pro zpracování uživatelských vstupů a interakci mezi uživatelem, systémem a naší aplikací.
SwiftUI
SwiftUI je moderní framework pro vytváření uživatelských rozhraní pro libovolnou platformu Apple. Byl vytvořen jako alternativa k UIKitu s deklarativním přístupem k programování. Framework jsme začali používat teprve 3 roky po jeho uvedení a ještě stále má omezení, se kterými se developeři při vývoji aplikací setkávají.
Výhodou je deklarativní přístup k programování, který zjednodušuje proces tvorby uživatelského rozhraní, a schopnost spolupracovat s UIKitem. Velkým pomocníkem jsou náhledy, díky nimž developer téměř okamžitě vidí všechny provedené změny, aniž by musel aplikaci spustit.
Interní frameworky
V rámci týmu dále pracujeme na různých interních frameworcích, které nám pomáhají zefektivnit vybrané činnosti a zároveň zajistit vysokou kvalitu projektů.
GRProvider
Interní knihovna sloužící k usnadnění práce s TableView a CollectionView v našich aplikacích. GRProvider „přebírá odpovědnost“ a vývojář nemusí sám implementovat všechny požadované metody jednotlivých nativních komponent.
iOS Extensions
Knihovna GoodExtensions-iOS „od vývojářů pro vývojáře“ je sbírka modulů a vylepšení, od komunikace se serverem až po formátování textu, které usnadňují práci našim developerům.
Package management
V našich projektech pro iOS dodnes používáme jak SPM, tak CocoaPods, přičemž o výběru jednoho z nich rozhoduje to, zda jeho výhody převažují nad nevýhodami při použití v konkrétní situaci, nebo dostupnost podpory potřebných knihoven.
SPM
Swift Package Manager(SPM) je nástroj pro správu distribuce kódu napsaného v jazyce Swift. Výhodou je, že závislosti můžeme integrovat do projektů přímo prostřednictvím Xcode. Na rozdíl od CocoaPods se soubory ukládají pouze na místní zařízení a „nenafukují“ tak velikost projektu. Vývojáře však nepotěší, že se při každém buildu aplikace budují i všechny závislosti, což prodlužuje dobu buildu. Další nepříjemnou skutečností je, že SPM se zatím nevyrovnal CocoaPods v počtu poskytovaných knihoven.
CocoaPods
CocoaPods je další ze správců, který se používá ke správě závislostí na úrovni aplikace. Obsahuje velké množství použitelných knihoven a umožňuje elegantní škálování jakéhokoli projektu. Zde na rozdíl od SPM vývojáře potěší, že knihovny se budují déle jen jednou a potom je doba sestavení podstatně příjemnější. Nevýhodou může být, že CocoaPods je třeba do projektů integrovat externě.
Nástroje
SwiftLint
Tento nástroj pomáhá vývojářům udržovat dobrou čitelnost kódu a zajišťuje dodržování konvencí a stylu při psaní kódu v jazyce Swift. SwiftLint upozorňuje vývojáře na chyby přímo prostřednictvím uživatelského rozhraní Xcode.
SwiftFormat
SwiftFormat je nástroj pro automatické formátování kódu. SwiftFormat dokáže automaticky upravovat mezery, přidávat nebo odstraňovat implicitní self, odstraňovat nepotřebné závorky a odstraňovat další odchylky od standardizovaných idiomů jazyka Swift.
Logen
Logen je interní nástroj napsaný v jazyce Python, který pomáhá vývojářům generovat lokalizované řetězce pro projekty Swift přímo z tabulky Google Docs
Swiftgen
SwiftGen je nástroj pro automatické generování kódu v jazyce Swift, konkrétně pro zdroje, jako jsou barvy, obrázky nebo lokalizované řetězce, aby byly type-safe.
Analytické služby
Firebase
Firebase je skupina několika služeb pro aplikace libovolného typu.
Využíváme notifikace prostřednictvím Firebase Cloud Messaging. Hlavní výhodou je, že náš backend se implementuje pouze vůči jedné službě a ta dále automaticky komunikuje s aplikacemi iOS a Android.
Firebase Crashlytics je služba, která posílá zprávy o selhání aplikací z produkce. Umožňuje nám je sledovat, rychle na ně reagovat a zlepšovat tak kvalitu našich aplikací.
Proces CI/CD
Kontinuální integrace a dodávání (CI/CD) umožňuje častěji integrovat nový kód, aniž by se snížila kvalita samotné aplikace. CI/CD je navržen tak, aby automatizoval opakující se úlohy, jako je sestavování, testování a nasazování, a upozorňoval na potenciální problémy. My pro tyto účely používáme především tři nástroje.
Fastlane
Fastlane je OpenSource platforma navržená pro zjednodušení procesu nasazování aplikací pro iOS. Fastlane nám umožňuje automatizovat téměř každý aspekt našeho pracovního postupu ve fázi vývoje nebo vydávání softwaru.
Bitrise
Umožňuje vývojářům automatizovat základní pracovní postupy, díky čemuž můžeme kombinovat běžné úlohy, jako je nasazení testerem, informování týmu na Slacku o nové verzi nebo zvýšení čísla verze.
Danger JS
Danger je nástroj nasazený v rámci procesu CI. Umožňuje nám automatizovat práci spojenou s kontrolou kódu a komentováním našich PR na základě předem definovaných pravidel. To umožňuje týmu developerů soustředit se v procesu revize kódu na složitější problémy.
Architektura
MVVM
Vývojářům usnadňuje oddělit vývoj uživatelského rozhraní od vývoje logiky. V projektech to vypadá takto: View a ViewModel jsou definovány samostatně, View má přiřazen vlastní ViewModel. View se stará o všechny komponenty uživatelského rozhraní a zobrazování dat z přiřazeného ViewModelu. ViewModel je zodpovědný za zajištění potřebného zpracování dat zobrazených View.
Reactor
ReactorKit vznikl jako kombinace Flux a Reactive Programming.
View slouží k zobrazení dat. Reactor je vrstva nezávislá na uživatelském rozhraní, spravuje stav View.
V praxi to vypadá následovně: View například odešle akci do Reactoru, například na základě nějakého uživatelského vstupu. Reaktor na danou akci „reaguje“, provede veškerou logiku definovanou jako reakci na danou akci a jako odpověď View vrátí stav, který způsobí změny ve View.
Coordinator
Coordinator pattern je dalším ze vzorů strukturálního návrhu, které používáme. Slouží k uspořádání logiky toku mezi jednotlivými obrazovkami. V aplikaci si definujeme všechny kroky všech obrazovek. Každý krok představuje přechod na novou obrazovku nebo její uzavření.