
App Intents: Jak zpřístupnit aplikaci pomocí Siri, Spotlight a Widgetů

17. Jul 2023
iOSTech stack poskytuje produktovému týmu nástroje, které potřebuje k vytvoření a údržbě produktu - k uspokojení potřeb zákazníků. Obvykle zahrnuje programovací jazyky, frameworky, analytické nástroje, architektonické vzory a mnoho dalších komponentů.
Na mobilní aplikace jsou dnes kladeny vysoké nároky na výkon, bezpečnost a uživatelský zážitek. Abychom tato očekávání splnili, potřebujeme spolehlivý a moderní tech stack, který nám umožní vytvářet řešení rychle, efektivně a udržitelně.
Jak tedy vypadá technologický základ našich iOS aplikací? Pojďme nahlédnout do zákulisí našeho vývoje.
Swift je moderní, výkonný a bezpečný programovací jazyk od společnosti Apple určený pro vývoj aplikací na platformách iOS, macOS, watchOS a tvOS. Byl vytvořen jako náhrada za Objective-C a přináší jednodušší, čitelnější a bezpečnější přístup k vývoji aplikací.
V současné době je Swift naším hlavním jazykem pro nativní vývoj. U nových projektů a vybraných stávajících aplikací již aktivně přecházíme na nejnovější verzi Swift 6, která přináší pokročilou podporu Swift Concurrency, včetně přísnějších pravidel pro bezpečný přístup k datům (strict concurrency checking).
Tato moderní forma asynchronního programování zlepšuje čitelnost a udržovatelnost kódu, což má pozitivní dopad na kvalitu výsledného produktu.
Při vývoji uživatelského rozhraní dnes spoléháme především na SwiftUI, moderní framework společnosti Apple, který nám umožňuje efektivně navrhovat přehledná a konzistentní rozhraní s menším množstvím kódu.
Ve specifických případech - například tam, kde SwiftUI ještě nepokrývá všechny technické požadavky nebo je potřeba podpora starších verzí iOS - používáme UIKit, donedávna standard.
V případě potřeby můžeme oba přístupy kombinovat. To nám dává flexibilitu při vývoji nových projektů i při aktualizaci stávajících aplikací.
Více o našich zkušenostech se SwiftUI najdete v článku Jak začít vyvíjet iOS konkrétně v části SwiftUI nebo UIKit?.
V GoodRequestu se již UIKit jako hlavní framework aktivně nepoužívá, ale stále je přítomen v několika stávajících projektech iOS, kde byl použit při jejich původním vývoji.
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 je moderní framework, který dnes používáme jako hlavní nástroj pro vývoj uživatelského rozhraní pro platformy Apple. V nových projektech nahradil UIKit a postupně se stává standardem i v rámci stávajících aplikací.
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.
Kromě práce na projektech pro klienty trávíme čas také budováním vlastního knihovního ekosystému. To nám pomáhá standardizovat vývoj, zefektivnit opakující se úkoly a zlepšit kvalitu kódu napříč projekty.
Více o tom, jak jsme tyto knihovny navrhli a kde všude se dnes používají, si můžete přečíst v našem článku Náš iOS toolbox.
GoodNetworking je knihovna zaměřená na komunikaci s rozhraními REST API. Stará se o konfiguraci požadavků, zpracování odpovědí a základní scénáře ošetření chyb. Je navržena tak, aby podporovala různé aplikační vrstvy a byla snadno rozšiřitelná.
GoodReactor implementuje architektonický vzor Reactor, který rozšiřuje koncept MVVM. Umožňuje efektivně spravovat stav obrazovek a reagovat na akce uživatele prostřednictvím definovaného toku dat. Knihovna poskytuje základní stavební kameny pro konzistentní implementaci této architektury.
GoodPersistence je framework pro práci s lokálním úložištěm. Zjednodušuje práci s daty uloženými například v UserDefaults nebo Keychain a poskytuje typově bezpečné rozhraní API pro ukládání a čtení dat v rámci aplikace.
„Od vývojářů pro vývojáře“ - knihovna GoodExtensions 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.
V našich projektech pro iOS dnes používáme především Swift Package Manager (SPM), protože je nativně integrován do Xcode a umožňuje jednoduchou a efektivní správu závislostí.
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. SPM nyní podporuje většinu běžných knihoven, včetně Firebase, a je proto naší preferovanou volbou pro nové projekty.
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 jejich chyby přímo prostřednictvím uživatelského rozhraní Xcode.
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 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 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.
Ke sběru analytických dat, monitorování aplikací a doručování oznámení používáme platformu Firebase, která pokrývá několik oblastí vývoje a provozu mobilních aplikací.
K doručování push notifikací používáme Firebase Cloud Messaging. Hlavní výhodou je jednotná integrace na straně back-endu, díky níž služba automaticky komunikuje s aplikacemi pro iOS i Android.
Služba Firebase Crashlytics zajišťuje automatický sběr informací o pádech aplikací v produkčním provozu. Umožňuje je efektivně sledovat, určovat priority a řešit, což přispívá k vyšší stabilitě aplikace.
Firebase Analytics nám poskytuje podrobný přehled o chování uživatelů. Sledování interakcí a událostí aplikace nám pomáhá optimalizovat uživatelské rozhraní i obchodní rozhodnutí.
Firebase Remote Config umožňuje měnit chování nebo vzhled aplikace na dálku - bez nutnosti vydávat novou verzi. Používáme ji například při experimentování s různými variantami funkcí nebo obsahu.
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 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.
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 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.
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 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.
Tento přístup používáme v projektech, kde je důležitá konzistence, předvídatelnost a testovatelnost aplikace. Pro jednotnou implementaci této architektury jsme vytvořili knihovnu GoodReactor, která poskytuje základní stavební kameny pro správu stavu obrazovek.
K organizaci navigace mezi obrazovkami v aplikaci používáme Coordinator pattern. Umožňuje oddělit logiku přechodů od samotného uživatelského rozhraní, což zvyšuje čitelnost, opakovatelnost a testovatelnost kódu.
Tento přístup jsme implementovali jako součást knihovny GoodReactor, kde slouží jako přirozené rozšíření architektury Reactor. To nám umožňuje spravovat navigaci konzistentně s ostatními vrstvami architektury, aniž bychom zbytečně komplikovali vrstvu View nebo Reactor.
Náš iOS tech stack se neustále vyvíjí spolu s technologiemi, které používáme. Sledujeme aktuální trendy, testujeme nové přístupy a aktivně budujeme vlastní ekosystém nástrojů a knihoven, které nám pomáhají udržovat vysokou kvalitu vývoje.
Cílem je vždy dodávat řešení, která jsou udržitelná, stabilní a zároveň připravená škálovat podle potřeb našich klientů. Pokud vás zajímá více informací o naší práci, neváhejte se podívat na další články na našem blogu.