Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Začínáme s
Programování pro iOS 1. díl - Rozdíly mezi "i" a "Mac"
4. srpna 2010, 00.00 | Začneme od základů. Seznámíme se s nejpodstatnějšími rozdíly mezi vývojovým prostředím Mac OS X a iOS. Příště se pustíme do sestavování jednoduché aplikace ilustrující jednotlivé postupy.
Nedávno jsme spustili v našem seriálu o programování v Kakau samostatnou větev věnovanou aplikacím pro kapesní uzavřená zařízení Apple (iPhone, iPod Touch a iPad) řízená operačním systémem iOS (dříve známým jako OS X nebo iPhone OS). Začali jsme ukázkou kódu, který fungoval stejně dobře na Macu i na iPhone. Dnes se už soustředíme na specifika iOS.
Co je stejné
Sám iOS se od Mac OS X příliš neliší. Je to stejný operační systém, nabízející stejné služby, stejné funkční prvky, procesy, systémové funkce a aplikační knihovny. Prostředí iOSu je ovšem zjednodušené a mnohé z "luxusních" služeb Mac OS X zde nenajdeme. Všechny základní a podstatné prvky zde ale jsou a jsou stejné.
Totéž proto platí i pro základní principy aplikačního programování: v obou architekturách je aplikace objektovou sítí vzájemně spolupracujích objektů, implementovaných v témže jazyce, v Objective C – jeho základy jsme probrali v prvních dílech našeho seriálu. Kromě standardního "programu" mohou být také předem připravené objekty sestavené pomocí aplikace Interface Builder a jako hotová objektová síť načteny z disku při spuštění aplikace – i to je v obou prostředích stejné. Aplikace Interface Builder i aplikace Xcode, v níž projekty spravujeme, jsou zcela stejné. Stejně tak je aplikace ve skutečnosti složkou, obsahující vlastní kód i všechny potřebné pomocné soubory, od objektových sítí NIB až po standardní informační soubor Info.plist, který informuje systém o všech podstatných atributech aplikace.
Jen na okraj. Budoucí verze Xcode aplikaci Interface Builder zruší a sama přebere její funkčnost. Je otázka, zda to je dobře nebo špatně. Až bude Xcode 4 "oficiálně venku" a nejen v předběžných náhledech, samozřejmě se mu budeme věnovat podrobněji.
Vraťme se ale k programování. Vedle základní struktury aplikací, programovacího jazyka a vývojového prostředí je dalším ze základních prvků paleta služeb standardních knihoven. S těmi to už není tak jednoduché:
• knihovna základních systémových služeb Foundation Kit je k dispozici téměř ve stejné podobě v iOSu i v Mac OS X;
• aplikační knihovna je sice navržena na základě obdobných koncepcí, ale v detailech se liší zásadně, a proto se i jinak jmenuje – UIKit v iOS, AppKit v Mac OS X – a podíváme se na ni později;
• další pomocné knihovny jsou kus od kusu různé. Obecně ale v iOSu spíše scházejí nebo jsou jejich služby omezené. Někdy jsou v iOS naopak knihovny, s nimiž se nesetkáme v Mac OS X (např. neobyčejně nevhodně pojmenovaná knihovna GameKit, s níž jsme se už setkali, a která slouží pro komunikaci mezi aplikacemi s použitím Bluetooth), ale to jsou skutečně spíše výjimky.
Co je jinak
Zatímco Mac OS X podporuje v podstatě libovolný programovací jazyk – přímo v něm nalezneme vedle Objective C také velmi omezenou podporu Javy, takřka neomezenou podporu Ruby či Pythonu a není problém doplnit cokoli dalšího – iOS je omezen jen na Objective C (a samozřejmě, jako jeho podmnožinu, na standardní C). Využití jiných vývojových prostředí a jazyků je limitováno technicky a především licenčně. V iOS je k dispozici také JavaScript, ale to je samostatná kapitola s poměrně specifickým a omezeným využitím.
Zatímco Mac OS X je otevřený operační systém, s nímž si můžete dělat cokoli (až na jistá omezení na úrovni licenční ochrany před zneužitím kódu chráněného copyrightem a na dost diskutabilní DRM), s iOS je tomu naopak. V iOS podle licenčního ujednání nesmíte dělat nic jiného, než to málo, co Apple explicitně povolil – a toho opravdu moc není. Navíc je součástí systému i řada technických omezení, jež se snaží to, co nesmíme, podepřít tím, že to skutečně dělat nejde.
Naštěstí existuje jailbreak, který odstraní technická omezení. Stran licenčního omezení vizte např. zde. Přesto však jde o omezení velmi nepříjemné a svazující.
S uzavřeností systému okrajově souvisí dost komplikovaná instalace aplikací na vlastní zařízení. K tomu se ale ještě vrátíme.
Vraťme se k běžnému aplikačnímu programování. Zmínili jsme, že programovací jazyk Objective C a základní služby objektového systému Foundation Kit jsou k dispozici v iOS téměř v téže podobě jako v Mac OS X. Drobná omezení zde tedy jsou a nejpodstatnější z nich jsou tato:
• Objective C pro iOS až do verze 3 včetně nepodporuje bloky (od verze 4 dále již jsou k dispozici, ovšem zpětné kompatibility s iOS 3 se ještě poměrně dlouho nezbavíme);
• Objective C a Foundation pro iOS vůbec nepodporují garbage collector – ve všech verzích musíte používat explicitní správu paměti (v prvých dílech jsme jí říkali "poloautomatický garbage collector");
• Foundation pro iOS vůbec nepodporuje objektové vazby (bindings) – ve všech verzích musíte používat zastaralé a poměrně nepohodlné mechanizmy komunikace mezi modelem a objekty uživatelského rozhraní, založené na datových zdrojích, mechanizmu akce/cíl apod.
Je třeba mít na paměti také to, že iOS nepodporuje virtuální paměť (ačkoli samozřejmě virtualizace adres je k dispozici). Musíte proto s pamětí šetřit daleko víc, než v Mac OS X. Liší se také aplikační knihovny a instalace softwaru na cílové zařízení.
AppKit vs UIKit
Aplikační knihovnu AppKit samozřejmě dávno důvěrně znáte. Knihovna UIKit, jež ji nahrazuje v iOS, je samozřejmě funkčně ekvivalentní a zajišťuje odpovídající služby – interakci aplikace s operačním systémem, zpracování událostí a řízení běhu aplikace, třídy pro implementaci standardních prvků grafického uživatelského rozhraní apod. Je také navržena s týmž – či v některých detailech možná větším – důrazem na čistou a korektní strukturu MVC jako AppKit.
Zároveň jsou zde ale poměrně zásadní rozdíly, dané především tím, že iOS – jakkoli velmi dobře běhá na iPadu, který se zaměřením řadí spíše mezi notebooky – je principiálně určen pro kapesní zařízení, a základní principy práce a ovládání aplikací se proto nutně od plnohodnotného prostředí Mac OS X poněkud liší.
Zásadně odlišné jsou samozřejmě prvky grafického uživatelského rozhraní a do značné míry se liší i základní grafický objektový model. Ten je sice v obou případech založen na spolupráci oken (NSWindow v Mac OS X, UIWindow v iOSu) a rámců (NSView v Mac OS X, UIView v iOS); jejich postavení je ale v iOS poměrně dost odlišné od toho, na něž jsme zvyklí v Mac OS X. Specifická pro iOS je i struktura řídicích objektů – ty zde mají mírně odlišné postavení (připomeňme znovu, že iOS nezná objektové vazby /bindings/), a jejich struktura je mnohem rigidnější a v daleko užší vazbě ke struktuře grafického uživatelského rozhraní.
Zatímco v Mac OS X pro nás byly základními událostmi, řídícími běh aplikace, události generované nabídkou, myší a klávesnicí, v iOS je primárním zdrojem událostí doteková obrazovka. Uvidíme ale, že princip zpracování událostí je týž. Objekty uživatelského rozhraní vyšší úrovně typicky využívají mechanizmy delegace a akce/cíl, na nízké úrovni implementujeme odpovídající služby ve vlastních rámcích (podtřídách standardní třídy UIView), velmi podobně, jako tomu bylo v Mac OS X. Finálně pak aplikační objekt UIApplication sice odpovídá staré známé NSApplication, ovšem jeho konkrétní služby se liší v řadě technických podrobností.
V následujících dílech seriálu si na konkrétním příkladu jednoduché aplikace ukážeme, jak tyto služby v iOS vypadají a jak jich využívat. Budeme je tedy moci dobře srovnat s tím, co již známe z AppKitu.
Instalace a distribuce
Ačkoli již v Mac OS X jsme si zvykli rozlišovat ladicí a finální build, v iOS je mezi nimi rozdíl naprosto zásadní. Sestavujeme zde totiž aplikace pro odlišnou architekturu a pro odlišný stroj, než je ten, na němž vyvíjíme.
Prvým krokem obvykle bývá odladění aplikace v emulátoru. Výhodou je to, že se obejdeme bez konkrétního hardware a je to mnohem rychlejší. Nevýhod je ale také řada.
Pak je načase vyzkoušet aplikaci v cílovém zařízení. Zde opět narážíme na uzavřenost systému. Apple neumožňuje instalovat a spustit v iOS žádný kód, který není digitálně podepsán speciálním certifikátem (ponecháme-li samozřejmě opět stranou jailbreak). Takový certifikát dokáže vytvořit pouze Apple na explicitní vyžádání a jinak není možné jej získat.
Předtím, než vůbec vyzkoušíte první vlastní aplikaci na iPhone, tedy musíte být registrovanými vývojáři. Registrovat se takto může každý, ale není to zdarma. Cena je 99 USD. Na základě této registrace Apple umožní přístup k webovým stránkám, jejichž prostřednictvím je možné potřebné certifikáty vygenerovat a instalovat do Xcode. Pak je teprve možné sestavit aplikaci, která bude pracovat na iPhone či iPadu.
Certifikáty jsou v zásadě tří typů:
• vývojářský certifikát je striktně vázán na konkrétní zařízení – při požadavku na jeho vygenerování zasíláte Apple sériová čísla všech přístrojů, pro něž má platit. Na nich pak aplikace, která byla s jeho pomocí sestavena, poběží a jinde ne. Tento certifikát lze využít při vlastním testování i pro betatestery. Platí pouze čtvrt roku a pak si je nutné požádat jeho prodloužení;
• firemní certifikát umožňuje velké firmě vývoj a distribuci in-house aplikací; v praxi se s touto variantou nejspíš nesetkáte;
• produkční certifikát slouží pro distribuci aplikace prostřednictvím AppStore.
Produkční certifikát přitom neznamená, že aplikaci můžeme "uploadovat na AppStore": namísto toho ji posíláme Apple, která ji prozkoumá, a pak ji buď na AppStore uloží, nebo také ne – problémy s tím, co Apple "pouští" a co ne (a jak dlouho jim to trvá) jsou všeobecně známé.
Obsah seriálu (více o seriálu):
- Nastal čas na kakao...
- Tak nejdřív kakao ochutnáme...
- Programovací jazyk C: velmi, velmi stručně
- Objective C: to si vysvětlíme podrobněji
- Co jsme si o Objective C ještě neřekli...
- Nastal čas na kakao - Vznik a zánik objektů
- Nastal čas na kakao - Kopírování objektů
- Nastal čas na kakao - Skryté podtřídy
- Nastal čas na kakao - Základní služby objektů
- Nastal čas na kakao - Jak správně psát v Objective C
- Nastal čas na kakao - Jak správně importovat
- Nastal čas na kakao - Podtřídy, delegáti, vkládání, jak se to rýmuje?
- Nastal čas na kakao - Využití kategorií namísto dědičnosti
- Nastal čas na kakao - Vkládání objektů a přesměrování zpráv
- Nastal čas na kakao - Inicializace a rušení objektů
- Nastal čas na kakao - Metody initWith... a designovaný inicializátor
- Nastal čas na kakao - Inicializace: tipy a triky
- Nastal čas na kakao - Accesory: přístup k proměnným instancí
- Nastal čas na kakao - Šedá je teorie, zelený je strom života...
- Nastal čas na kakao - Více o XCode: inspektory
- Nastal čas na kakao - Aplikace RSS2: datový model
- Nastal čas na kakao - Aplikace RSS: implementace datového modelu
- Nastal čas na kakao - Aplikace RSS: parsování XML
- Nastal čas na kakao - Interface Builder a uživatelské rozhraní
- Nastal čas na kakao - Interface Builder: atributy objektů
- Nastal čas na kakao - Interface Builder: atributy objektů
- Nastal čas na kakao - Druhý kontrolér a dokončení aplikace
- Nastal čas na kakao - Drobná vylepšení a zdokonalení...
- Nastal čas na kakao - Ladění
- Nastal čas na kakao - Třídy Foundation Kitu
- Nastal čas na kakao - Třídy Foundation Kitu (2)
- Nastal čas na kakao - Textové řetězce: NS(Mutable)String
- Nastal čas na kakao - Čísla, binární data a další...
- Nastal čas na kakao - Archivace objektů
- Nastal čas na kakao - Trocha magie, aneb distribuované objekty
- Nastal čas na kakao - Málem bychom zapomněli: NSAutoreleasePool
- Nastal čas na kakao - Zpracování výjimek: NSException
- Nastal čas na kakao - NSInvocation a černá magie
- Nastal čas na kakao - Kakao v Tygrovi
- Nastal čas na kakao - Notifikace: nepřímé předávání zpráv
- Nastal čas na kakao - NSUserDefaults
- Nastal čas na kakao - Co nového ve Foundation Kitu
- Nastal čas na kakao – s Intelem, s Intelem, jedeme do...
- Co nového v Xcode
- Začínáme s AppKitem
- Jak MVC v Kakau vypadá doopravdy?
- Jak MVC v Kakau vypadá doopravdy: dokončení
- Přehled tříd AppKitu
- Nastal čas na kakao - Přehled tříd AppKitu 2
- Přehled tříd AppKitu 3: zbývající třídy GUI
- Přehled tříd AppKitu 4: textový systém
- Nastal čas na kakao - Přehled tříd AppKitu 5: hlavně grafika
- Přehled tříd AppKitu 6: dokumentový systém
- Přehled tříd AppKitu 7: dokončení
- Pojmenované vlastnosti objektů
- Pojmenované vlastnosti objektů: implementace
- Pojmenované vlastnosti objektů: relace 1:N
- Pojmenované vlastnosti objektů: řazení jmen a agregační funkce
- Sledování změn objektů
- Sledování změn objektů – ukázka
- Sledování změn objektů – zdrojový kód
- Sledování změn objektů: kód modelu
- Sledování změn objektů: přímý přístup
- Kontroléry a vazby
- Vázání vazeb
- Další vazby s jednoduchým kontrolérem
- Implementace a použití převodu hodnot
- Validace hodnot
- Validace a chyby, a jedna hezká vazba...
- Práce s polem objektů
- Základní vazby NSArrayControlleru
- Převodníky, přepínače, placeholdery
- Mírná vylepšení v mezích zákona
- Objective C 2.0 - novinky z Leoparda
- NSTreeController
- Programování v Cocoa - Pár tipů a triků
- Programování v Cocoa - Základy kreslení
- Kterak nakreslit modrý obdélník...
- Další služby pro kreslení
- Obrázky a písmenka...
- Události a myš
- Lepší práce s myší
- Události klávesnice
- Input Management
- Příkazy a schránka
- Další události
- Táhni a padni
- Byli jsme na tahu; nyní padneme.
- Zvolme si, jak vhodit
- Drobnosti a chybičky
- Speciální případy tahání či házení
- Kterak táhnout něco, co neexistuje?
- Jak na sítě...
- NSURLConnection
- Safari za minutu
- Služby WebKitu
- Kakao v Leopardu
- Druhé Objective C
- Druhé Objective C: různé drobnosti
- Druhé Objective C: kategorie a protokoly
- Druhé Objective C: nový příkaz cyklu
- Druhé Objective C: atributy a accesory
- Druhé Objective C: atributy a accesory
- 64 je dvakrát 32
- Ubicumque dulce est, ibi et acidum invenies...
- Irbis: že prý žádné novinky?
- Blok sem, blok tam, nám už je to všechno jasné...
- Bloky jsou i v AppKitu
- Irbis a Foundation Kit
- Kde jsou má data?
- Kde jsou má data? V NSCache!
- Soubor, jméno, URL, jak se to rýmuje...
- Další podpora NSURL
- Zabíjení!
- A máme tady i...OS!
- Systémové prvky GUI
- Programování pro iOS 1. díl - Rozdíly mezi "i" a "Mac"
- Programování pro iOS - 2. Začínáme programovat
- Programování pro iOS - 3. základní ovladače a propojení GUI s kódem
- Programování pro iOS - 4. Varovná hlášení
- Programování pro iOS - 5. Rámce a jejich řídicí objekty
- Programování pro iOS - 6. Ukládání dat
- Programování pro iOS - 7. Správa paměti a starý restík
- Programování pro iOS - 8. Dokončení aplikace
- Programování pro iOS - 9. Jak dostat aplikaci do iPhone
- Programování pro iOS - 10. Instalace aplikace do cizího iPhone
- Programování pro iOS - 11. Jak dostat aplikaci do libovolného iPhone
- Programování pro iOS - 12. Touching!
- Programování pro iOS - 13. Kreslíme na iPhone
- Programování pro iOS - 14. Udělejme gesto
- Programování pro iOS - 15. Další gesta
- Programování pro iOS - 16. Více prstů, více zábavy
- Programování pro iOS - 17. Podpora standardních gest
- Programování pro iOS - 18. Recognizery v iOS
- Programování pro iOS - 19. Další standardní recognizery
- Programování pro iOS - 20. Co nového v iOSu
- Programování pro iOS - 21. "Multitasking"
- Programování pro iOS - 22. Nulla est honesta avaritia nisi temporis
- Programování pro iOS - 23. Jak se aktivovat, jsme-li v pozadí
- Programování pro iOS - 24. Zbývající drobnosti
- Programování pro iOS - 25. Řídicí objekty rámců
- Programování pro iOS - 26. Jak se dělá UIViewController
- Programování pro iOS - 27. Kde vzít rámce
- Programování pro iOS - 28. Základní služby
- Programování pro iOS - 29. Práce s rámci
- Programování pro iOS - 30. Rotace zařízení
- Programování pro iOS - 31. Správa paměti v rámcích
- Programování pro iOS - 32. Řídicí objekt pro tabulky
- Programování pro iOS - 33. Řídicí objekt pro strom
- Programování pro iOS - 33. Více o UINavigationControlleru
- Programování pro iOS - 35. Ještě jednou UINavigationController
- Programování pro iOS - 36. Po navigátoru taby
- Programování pro iOS - 37. Více o UITabBarControlleru
- Programování pro iOS - 38. Dokončení UITabBarControlleru
- Programování pro iOS - 39. UIPopoverController
- Programování pro iOS - 40. Další triky UIPopoverControlleru
- Programování pro iOS - 41. Zbývající služby UIPopoverControlleru
- Programování pro iOS - 42. UISplitViewController
- Programujeme v
iTunesXcode 4 - Programování pro iOS - 44. Předvolby Xcode 4
- Programování pro iOS - 45. Práce v Xcode 4
- Xcode 4: projekt a cíle
- Xcode 4: práce s cíli
- Xcode 4: Build Settings
- Xcode 4: Build Phases
- Xcode4: Build Phases podruhé
- Xcode 4: Co jsou to Build Rules?
- Xcode4: taje editoru
- Xcode4: automatické doplňování v editoru
- XIBy chyby
- Více o XIBech
- Editor XIBů
- Inspektory pro XIBy
- Vazby mezi objekty v XIBech
- Vazby mezi objekty v kódu
- Paletky Xcode pro XIBy
- Xcode 4: levý sloupec
- Xcode 4: okno Organizer
- Xcode 4: okno Organizer, část druhá
- Xcode 4: co je to Workspace?
- Xcode 4: základy schémat
- Xcode 4: akční schémata