Za´padoˇceska´ univerzita v Plzni Fakulta aplikovany´ch vˇed Katedra informatiky a vy´poˇcetn´ı techniky
Bakal´ aˇ rsk´ a pr´ ace Interaktivn´ı informaˇ cn´ı aplikace pro mobiln´ı zaˇ r´ızen´ı na platformˇ e iOS
Plzeˇ n, 2012
Jiˇr´ı Zikmund
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem bakal´aˇrskou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 10. kvˇetna 2012 Jiˇr´ı Zikmund
Podˇ ekov´ an´ı R´ad bych podˇekoval vedouc´ımu bakal´aˇrsk´e pr´ace Ing. Ladislavu Peˇsiˇckovi za skvˇel´e veden´ı a ˇcas str´aven´ y pˇri konzultac´ıch. D´ale chci podˇekovat rodiˇc˚ um za podporu a pˇr´ıtelkyni za pˇreˇcten´ı pr´ace a v´ ybornou korekturu.
Abstract Subject of this thesis is Interactive information application for iOS mobile devices. In the first part I describe possibilities in retrieving and displaying information by iOS applications in theory, taking into account its use in mobile devices. This part also focuses on classification of information and means of information retrieval from remote sources. In the second part of the thesis I proceed to the development process for iOS platform itself. Product of this task is a working application which provides data from selected information sources and runs on a real device.
Obsah ´ 1 Uvod
1
2 Platforma iOS 2.1 Operaˇcn´ı syst´em iOS . . . . . . . . . . . 2.2 V´ yvoj aplikac´ı pro iOS . . . . . . . . . . 2.3 Xcode a Objective C . . . . . . . . . . . 2.3.1 UI Elements . . . . . . . . . . . . 2.4 Uk´azka vybran´ ych informaˇcn´ıch aplikac´ı 3 Anal´ yza probl´ emu 3.1 Tˇr´ıdˇen´ı informac´ı . . . . . . . . . . . . 3.2 Agregace informaˇcn´ıch zdroj˚ u . . . . . 3.2.1 Pˇr´ım´ y pˇr´ıstup . . . . . . . . . . 3.2.2 Nepˇr´ım´ y pˇr´ıstup pomoc´ı serveru
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
. . . .
. . . . .
2 2 2 3 5 7
. . . .
9 9 10 10 10
4 C´ıl pr´ ace
13
5 Komunikace mezi serverem a aplikac´ı 14 5.1 Form´at XML . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 6 N´ avrh serveru 6.1 Poˇzadavky serveru a vybran´ y webhosting 6.2 Datab´aze . . . . . . . . . . . . . . . . . 6.3 Struktura serveru . . . . . . . . . . . . . 6.4 Zpracov´an´ı informaˇcn´ıch zdroj˚ u . . . . . 6.5 Tvorba parseru . . . . . . . . . . . . . . 6.6 Pouˇzit´ı parseru, uloˇzen´ı dat . . . . . . . 6.7 Vytvoˇren´e parsery . . . . . . . . . . . . 6.7.1 Parser Cinemacity . . . . . . . . 6.7.2 Parser Cinestar . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
18 19 20 20 22 23 24 26 26 28
7 N´ avrh aplikace 7.1 Struktura aplikace . . . 7.2 Komunikace se serverem 7.3 Parsov´an´ı XML . . . . . 7.4 Keˇsov´an´ı dat . . . . . . 7.5 Pr´ace s mapami . . . . . 7.6 Interakce s ud´alostmi . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
29 29 33 34 35 37 38
8 Testov´ an´ı 40 8.1 Funkˇcnost parser˚ u . . . . . . . . . . . . . . . . . . . . . . . . 40 8.2 Bˇeh aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 8.3 Validita zobrazovan´ ych informac´ı . . . . . . . . . . . . . . . . 43 9 Uˇ zivatelsk´ a pˇ r´ıruˇ cka 9.1 Spuˇstˇen´ı . . . . . . . . . . 9.2 Ovl´ad´an´ı aplikace . . . . . ˇ asteˇcn´a aktualizace dat . 9.3 C´ 9.4 Kompletn´ı aktualizace dat 9.5 Maz´an´ı dat . . . . . . . . 10 Z´ avˇ er
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
45 45 45 45 46 46 47
´ Uvod
´ 1 Uvod Mobiln´ı telefony jsou bˇeˇznou souˇc´ast´ı naˇseho ˇzivota a uˇz d´avno neslouˇz´ı pouze k telefonov´an´ı. Staly se z nich multifunkˇcn´ı zaˇr´ızen´ı s vˇsestrann´ ym vyuˇzit´ım a zaˇcaly ˇca´steˇcnˇe nahrazovat fotoapar´aty, multimedi´aln´ı pˇrehr´avaˇce nebo napˇr. navigaˇcn´ı pˇr´ıstroje. D´ıky mobiln´ımu internetu jsou tak´e ide´aln´ı pro okamˇzit´ y pˇr´ıstup k informac´ım. Jedn´ım ze zp˚ usob˚ u prezentace tˇechto informac´ı jsou mobiln´ı internetov´e prohl´ıˇzeˇce. Ty jsou jiˇz relativnˇe vyspˇel´e a mohou v mnoha pˇr´ıpadech slouˇzit jako plnohodnotn´a n´ahrada prohl´ıˇzeˇc˚ u na poˇc´ıtaˇci, nicm´enˇe jsou pro nˇe limituj´ıc´ı zobrazovac´ı schopnosti zaˇr´ızen´ı, na nichˇz jsou provozov´any. Jde pˇredevˇs´ım o velikost displeje, protoˇze u ´hlopˇr´ıˇcky mobiln´ıch telefon˚ u nepˇresahuj´ı zpravidla 5 palc˚ u. Dalˇs´ı moˇznost´ı jsou aplikace, kter´e zpracov´avaj´ı pouze konkr´etn´ı zdroj informac´ı a pˇrizp˚ usobuj´ı jejich zobrazen´ı displej˚ um mobiln´ıho zaˇr´ızen´ı. Pˇr´ıkladem mohou b´ yt zpravodajsk´e servery, u nichˇz se stalo trendem posledn´ı doby m´ıt kromˇe webov´ ych str´anek tak´e odpov´ıdaj´ıc´ı aplikaci dostupnou pro nejrozˇs´ıˇrenˇejˇs´ı mobiln´ı platformy. V r´amci bakal´aˇrsk´e pr´ace budu vyv´ıjet interaktivn´ı informaˇcn´ı aplikaci pro platformu iOS, konkr´etnˇe pro mobiln´ı telefon iPhone. Aplikace bude z´ısk´avat aktu´aln´ı informace dostupn´e na internetu a s ohledem na velikost displeje je vhodnˇe zobrazovat v telefonu. Z´ıskan´a data bude moˇzn´e pouˇz´ıt napˇr. pro pl´anov´an´ı ud´alost´ı v kalend´aˇri nebo jin´e interakce. Informaˇcn´ı zdroje nejsou nijak bl´ıˇze specifikov´any, a proto by mˇela b´ yt aplikace navrˇzena dostateˇcnˇe obecnˇe. Jej´ı funkˇcnost se ovˇeˇr´ı na konkr´etn´ı kategorii informac´ı, napˇr. kinech. ˇ e republice st´ale dosti Protoˇze mobiln´ı pˇripojen´ı k internetu je v Cesk´ omezen´e, zejm´ena co se t´ yk´a mnoˇzstv´ı pˇrenesen´ ych dat, bude vhodn´e, aby aplikace umoˇzn ˇovala lok´aln´ı ukl´ad´an´ı z´ıskan´ ych informac´ı a jejich aktualizace prob´ıhala pouze na vyˇza´d´an´ı. V´ ysledkem by mˇela b´ yt funkˇcn´ı aplikace bˇeˇz´ıc´ı v re´aln´em zaˇr´ızen´ı na platformˇe iOS.
1
Platforma iOS
2 Platforma iOS 2.1
Operaˇ cn´ı syst´ em iOS
Operaˇcn´ı syst´em iOS od spoleˇcnosti Apple byl vyd´an spoleˇcnˇe s mobiln´ım telefonem iPhone v roce 2007. P˚ uvodnˇe se jmenoval iPhone OS, ale protoˇze firma zaˇcala tento syst´em nasazovat postupem ˇcasu i do sv´ ych dalˇs´ıch mobiln´ıch zaˇr´ızen´ı, byl v souladu s jejich n´azvy pˇrejmenov´an obecnˇeji na iOS. Dnes se s n´ım setk´ame v pˇr´ıstroj´ıch iPhone, iPod Touch a iPad. Od sv´eho vzniku si vybudoval opravdu ˇsirokou z´akladnu uˇzivatel˚ u a do podzimu 2011 se prodalo pˇres 250 milion˚ u zaˇr´ızen´ı s t´ımto syst´emem. [5] Vyd´an´ım iOS vytvoˇrila spoleˇcnost Apple zcela nov´ y pohled na mobiln´ı telefony. Oproti konkurenci nab´ızely v t´e dobˇe iPhony velmi pohodln´e dotykov´e ovl´ad´an´ı jen pomoc´ı prst˚ u, syst´em byl uˇzivatelsky pˇr´ıvˇetiv´ y, stabiln´ı a perfektnˇe spolupracoval s hardwarem. To se nezmˇenilo ani po pˇeti letech. V syst´emu samozˇrejmˇe pˇribyly nov´e funkce, ale z´akladn´ı principy ovl´ad´an´ı jsou st´ale stejn´e.
2.2
V´ yvoj aplikac´ı pro iOS
Operaˇcn´ı syst´em iOS je odlehˇcenou verz´ı Mac OS X, kter´ y je pouˇz´ıv´an na poˇc´ıtaˇc´ıch spoleˇcnosti Apple, a stejnˇe jako on je tedy zaloˇzen´ y na Unixu. P˚ uvodnˇe byl vytvoˇren jako u ´plnˇe uzavˇren´ y syst´em bez moˇznosti jak´ehokoliv v´ yvoje aplikac´ı tˇret´ıch stran, alespoˇ n ne ofici´aln´ı cestou. Pˇribliˇznˇe po roce od uveden´ı, tedy v roce 2008, bylo ale uvolnˇeno SDK pro v´ yvoj´aˇre, ˇc´ımˇz se otevˇrela cesta k v´ yvoji pro tuto platformu. SDK bylo vyd´ano pro v´ yvojov´e prostˇred´ı Xcode, kter´e je dostupn´e pouze pro operaˇcn´ı syst´emem Mac OS X. Zd´a se tedy, ˇze jedinou moˇznost´ı v´ yvoje ˇ aplikac´ı pro iOS jsou poˇc´ıtaˇce Apple. Protoˇze ale v Cesk´e republice nejsou zat´ım tolik rozˇs´ıˇren´e, snaˇzil jsem naj´ıt alternativn´ı zp˚ usob. Nab´ızela se moˇznost pouˇzit´ı virtualizaˇcn´ıho n´astroje pro Windows, kter´ y by simuloval bˇeh Mac OS X. Dle licenˇcn´ıch podm´ınek pro pouˇzit´ı softwaru spoleˇcnosti Apple to vˇsak nen´ı moˇzn´e a pro svou pr´aci jsem proto zvolil nativn´ı platformu, poˇc´ıtaˇc Apple Mac mini. [6] 2
Platforma iOS
2.3
Xcode a Objective C
Xcode a Objective C
Xcode je v´ yvojov´e prostˇred´ı zdarma nab´ızen´e spoleˇcnost´ı Apple. Lze ho z´ıskat napˇr. staˇzen´ım z jejich webov´ ych str´anek. Integruje v sobˇe mnoho n´astroj˚ u, kter´e usnadˇ nuj´ı a zefektivˇ nuj´ı v´ yvoj aplikac´ı pro platformu iOS. Podporuje velk´e mnoˇzstv´ı programovac´ıch jazyk˚ u, jako je napˇr. C++, Java nebo Python, ale aplikace pro iOS lze vytv´aˇret pouze v jazyce Objective C, pˇr´ıpadnˇe v C. [7]
Obr´azek 2.1: Z´akladn´ı obrazovka Xcode Objective C vzniklo jako objektovˇe orientovan´e rozˇs´ıˇren´ı jazyka C, s n´ımˇz byla zachov´ana zpˇetn´a kompatibilita. D´ıky objekt˚ um a mnoha knihovn´am ale nab´ız´ı efektivnˇejˇs´ı pr´aci. Nad objekty je definov´ana jedin´a operace, coˇz je pos´ıl´an´ı zpr´av, principi´alnˇe pˇrevzat´e z jazyka Smalltalk. Apple ve sv´ ych zaˇr´ızen´ıch se syst´emem iOS zavedl urˇcit´ y standard, co se t´ yk´a vzhledu a chov´an´ı uˇzivatelsk´eho prostˇred´ı, a dodrˇzuje ho nejen ve sv´ ych aplikac´ıch, ale snaˇz´ı se k nˇemu v´est i ostatn´ı v´ yvoj´aˇre. Souˇc´ast´ı Xcode je proto Interface Builder, velmi v´ ykonn´ y n´astroj pro tvorbu vizu´aln´ı ˇc´asti aplikace (viz obr. 2.2, str. 4). V´ yvoj´aˇr˚ um nab´ız´ı ˇsirokou paletu komponent, ze kter´ ych mohou poskl´adat obrazovky aplikace, napˇr. tlaˇc´ıtka, textov´a pole, pˇrep´ınaˇce, posuvn´ıky a dalˇs´ı. [8] 3
Platforma iOS
Xcode a Objective C
Vˇsechny tyto prvky maj´ı totoˇzn´ y vzhled s nativn´ım prostˇred´ım iOS, ˇc´ımˇz se zaruˇcuje sjednocen´ y vzhled cel´eho prostˇred´ı telefonu. Vydal tak´e pˇr´ıruˇcku iOS Human Interface Guidelines, ve kter´e popisuje doporuˇcen´e z´asady n´avrhu aplikace. [9]
Obr´azek 2.2: Interface builder
4
Platforma iOS
2.3.1
Xcode a Objective C
UI Elements
Pˇri n´avrhu aplikace je v Xcode k dispozici pro iPhone pomˇernˇe ˇsirok´e mnoˇzstv´ı komponent. N´asleduje popis nejd˚ uleˇzitˇejˇs´ıch z nich. [8] Status Bar zobrazuje d˚ uleˇzit´e informace t´ ykaj´ıc´ı se pˇr´ıstroje. V´ yvoj´aˇr m˚ uˇze ovlivnit pouze jeho zobrazen´ı nebo skryt´ı v aplikaci, nikoliv jeho jednotliv´e prvky.
Obr´azek 2.3: Status Bar
Navigation Bar ve vˇetˇsinˇe pˇr´ıpad˚ u ukazuje n´azev aktu´aln´ı obrazovky aplikace a umoˇzn ˇuje navigaci zpˇet, pˇr´ıpadnˇe dalˇs´ı akce. Um´ıstˇen´ı t´eto komponenty je vˇzdy v horn´ı ˇca´sti obrazovky.
Obr´azek 2.4: Navigation Bar
Tab Bar je hlavn´ı komponenta pro navigaci. Jej´ı tlaˇc´ıtka zn´azorˇ nuj´ı jednotliv´e obrazovky aplikace a umoˇzn ˇuj´ı pˇrechod mezi nimi.
Obr´azek 2.5: Tab Bar
Toolbar obsahuje kontextov´a tlaˇc´ıtka pro pr´aci s aktu´aln´ım obsahem obrazovky a je zobrazen vˇzdy ve spodn´ı ˇc´asti aplikace.
Obr´azek 2.6: Toolbar
5
Platforma iOS
Xcode a Objective C
Alert m´a nˇekolik moˇznost´ı zobrazen´ı. Jeho poˇcet tlaˇc´ıtek je variabiln´ı, takˇze kromˇe jednoduch´eho informaˇcn´ıho hl´aˇsen´ı m˚ uˇze slouˇzit i pro interakci s uˇzivatelem.
(a) Z´ akladn´ı podoba
(b) Interakce s uˇzivatelem
Obr´azek 2.7: Alert
Table View pˇredstavuje typicky seznam poloˇzek. Umoˇzn ˇuje seskupov´an´ı a vyhled´av´an´ı podle n´azv˚ u. Jednotliv´e buˇ nky nemus´ı obsahovat pouze text, ale i tlaˇc´ıtka, obr´azky, nebo jak´ekoliv dalˇs´ı prvky. Tato komponenta je d´ıky sv´emu vˇsestrann´emu vyuˇz´ıt´ı jednou z nejpouˇz´ıvanˇejˇs´ıch v˚ ubec.
(a) Z´ akladn´ı podoba
(b) Upraven´a podoba 1
Obr´azek 2.8: Table View
6
(c) Upraven´a podoba 2
Platforma iOS
2.4
Uk´azka vybran´ych informaˇcn´ıch aplikac´ı
Uk´ azka vybran´ ych informaˇ cn´ıch aplikac´ı
Pro platformu iOS existuje velk´e mnoˇzstv´ı aplikac´ı a mezi nimi jsou samozˇrejmˇe i aplikace s podobn´ ym zamˇeˇren´ım, jako moje pr´ace.
Aplikace Kina CSFD.cz ˇ Nab´ız´ı seAplikace Kina CSFD.cz se zamˇeˇruje na kinematografii v CR. znam kin a aktu´alnˇe vys´ılan´e filmy. Kromˇe ˇcas˚ u pˇredstaven´ı v jednotliv´ ych kinech se u detailu filmu zobrazuje uˇzivatelsk´e hodnocen´ı. Jak je vidˇet na obr´azc´ıch, pouˇz´ıv´a k zobrazov´an´ı dat pˇrev´aˇznˇe modifikovanou komponentu Table View.
(a) Seznam kin
(b) Seznam film˚ u
Obr´azek 2.9: Aplikace Kina CSFD.cz
7
Platforma iOS
Uk´azka vybran´ych informaˇcn´ıch aplikac´ı
Aplikace Kde j´ıst a p´ıt Kde j´ıst a p´ıt je aplikace Zlat´ ych str´anek a slouˇz´ı jako alternativa k jejich webov´ ym str´ank´am. Vyuˇz´ıv´a GPS telefonu pro zjiˇst’ov´an´ı aktu´aln´ı polohy a zobrazuje pomoc´ı n´ı nejbliˇzˇs´ı m´ısta v okol´ı. Kromˇe klasick´eho zobrazen´ı v seznamu nab´ız´ı i n´ahled m´ıst na mapˇe. D´ıky rozs´ahl´emu katalogu je aplikace v praxi dobˇre pouˇziteln´a.
(a) Mapa
(b) Seznam m´ıst
Obr´azek 2.10: Aplikace Kde j´ıst a p´ıt
8
Anal´yza probl´emu
3 Anal´yza probl´emu 3.1
Tˇ r´ıdˇ en´ı informac´ı
Jednou z prvn´ıch vˇec´ı, kterou jsem pˇri anal´ yze probl´emu musel vyˇreˇsit, byl zp˚ usob, jak´ ym budu z´ıskan´a data tˇr´ıdit. Protoˇze se nejedn´a o ˇz´adn´ y konkr´etn´ı zdroj informac´ı, muselo b´ yt vˇse zvoleno dostateˇcnˇe obecnˇe. Urˇcil jsem, ˇze z´akladn´ı informaˇcn´ı jednotkou cel´eho syst´emu bude ud´alost, pro kterou bude definov´ano m´ısto a ˇcas. M˚ uˇze tedy pˇredstavovat napˇr. sportovn´ı utk´an´ı, divadeln´ı pˇredstaven´ı nebo hudebn´ı koncert. Navzdory n´azvu se ale nemus´ı jednat pouze o ud´alost jako takovou, lze si pˇredstavit i napˇr. nab´ıdku j´ıdel v restauraci. Vˇse z´aleˇz´ı na vhodn´em zp˚ usobu zpracov´an´ı informaˇcn´ıho zdroje. Dalˇs´ımi vlastnostmi ud´alosti jsou jej´ı n´azev, popis a d´elka trv´an´ı, tedy dostateˇcnˇe obecn´e informace pro mnoho r˚ uzn´ ych zdroj˚ u. S pˇrib´ yvaj´ıc´ım mnoˇzstv´ı ud´alost´ı by se ale jejich rozumn´e a pˇrehledn´e zobrazov´an´ı, nav´ıc s pˇrihl´ednut´ım k mal´emu displeji mobiln´ıho telefonu, stalo znaˇcnˇe obt´ıˇzn´e. Bylo tedy nutn´e ud´alosti nˇejak´ ym zp˚ usobem tˇr´ıdit. Rozumn´e se to jev´ı podle jejich m´ısta. A protoˇze k jednomu m´ıstu se m˚ uˇze vztahovat v´ıce ud´alost´ı, urˇcil jsem m´ısto jako nadˇrazen´e ud´alostem. M´ısto potom patˇr´ı do podkategorie, kter´a d´ale spad´a do kategorie, coˇz je nejobecnˇejˇs´ı prvek kategorizace (viz obr. 3.1, str. 10). • Kategorie - n´azev • Podkategorie - n´azev a kategorie, do kter´e patˇr´ı • M´ısto - n´azev, poloha a podkategorie, do kter´e patˇr´ı • Ud´ alost - n´azev, popis, ˇcas a m´ısto, kam patˇr´ı
9
Anal´yza probl´emu
Agregace informaˇcn´ıch zdroj˚ u
Obr´azek 3.1: Pˇr´ıklad tˇr´ıdˇen´ı dat (pr´azdn´a pole znaˇc´ı dalˇs´ı prvky)
3.2 3.2.1
Agregace informaˇ cn´ıch zdroj˚ u Pˇ r´ım´ y pˇ r´ıstup
Z´akladn´ım pil´ıˇrem aplikace jsou data a ta je potˇreba nˇejak z´ısk´avat. Prvn´ı moˇznost´ı je pˇr´ım´ y pˇr´ıstup, coˇz znamen´a, ˇze aplikace z´ısk´av´a informace z prim´arn´ıho zdroje. Dobr´ ym pˇr´ıkladem jsou programy kin. Uˇzivatel spust´ı aplikaci a chce napˇr. zjistit, jak´e filmy jsou aktu´alnˇe prom´ıt´any v jeho obl´ıben´em kinˇe. V tu chv´ıli se aplikace mus´ı pˇripojit k nˇejak´emu zdroji t´eto informace, j´ımˇz jsou zˇrejmˇe webov´e str´anky dan´eho kina, naˇc´ıst jejich obsah, zpracovat ho a z´ıskat z nˇej potˇrebn´a data. Takov´ y proces m˚ uˇze b´ yt velmi zdlouhav´ y a musel by b´ yt prov´adˇen pˇri kaˇzd´e aktualizaci (viz obr. 3.2, str. 11). Dalˇs´ı nev´ yhodou pˇr´ım´eho pˇr´ıstupu je to, ˇze zdroj mus´ı existovat a b´ yt nˇejak´ ym zp˚ usobem st´ale dostupn´ y. Nav´ıc pokud bychom chtˇeli zobrazit nov´ y zdroj informac´ı, musel by b´ yt pevnou souˇca´st´ı aplikace, coˇz by kv˚ uli aktu´alnosti dat ztr´acelo sv˚ uj smysl.
3.2.2
Nepˇ r´ım´ y pˇ r´ıstup pomoc´ı serveru
Kv˚ uli zm´ınˇen´ ym nev´ yhod´am pˇr´ım´eho pˇr´ıstupu k informac´ım bylo potˇreba naj´ıt alternativn´ı zp˚ usob z´ısk´av´an´ı dat. Jako elegantn´ı ˇreˇsen´ı se uk´azalo vloˇzen´ı serveru mezi uˇzivatelskou aplikaci a prim´arn´ı zdroje dat. Tento server m´a na jedn´e stranˇe na starosti z´ısk´av´an´ı aktu´aln´ıch dat ze vˇsech urˇcen´ ych zdroj˚ u a na druh´e stranˇe jejich poskytov´an´ı aplikaci uˇzivatele (viz obr. 3.3, str. 12). 10
Anal´yza probl´emu
Agregace informaˇcn´ıch zdroj˚ u
Obr´azek 3.2: Pˇr´ım´y pˇr´ıstup k informac´ım
Pojem informaˇcn´ı zdroje je nutn´e v tomto pˇr´ıpadˇe br´at velmi obecnˇe. Mohou totiˇz pˇredstavovat mnoho r˚ uzn´ ych vˇec´ı a hlavnˇe mohou m´ıt libovolnou formu. Nejˇcastˇeji vˇsak zˇrejmˇe p˚ ujde o internetov´e str´anky, jejichˇz obsah bude nutn´e zpracovat a z´ıskat z nich potˇrebn´a data. Tento proces bude pro kaˇzd´ y zdroj velmi individu´aln´ı a pˇrid´av´an´ı nov´ ych zdroj˚ u tak nebude trivi´aln´ı z´aleˇzitost´ı. Z´ıskan´a data budou uloˇzena na serveru a pˇripravena pro zasl´an´ı uˇzivatelsk´e aplikaci aˇz ve chv´ıli, kdy si to vyˇz´ad´a. T´ım se cel´ y proces pˇresouv´an´ı informac´ı z prim´arn´ıho zdroje k uˇzivateli rozdˇel´ı na dvˇe ˇca´sti: • zpracov´ an´ı dat z informaˇcn´ıho zdroje a uloˇzen´ı na server • poskytnut´ı dat uˇzivatelsk´e aplikaci To je velmi v´ yhodn´e, protoˇze zpracov´an´ı dat je ˇcasovˇe relativnˇe n´aroˇcn´e a m˚ uˇze b´ yt prov´adˇeno nez´avisle na jejich poskytov´an´ı uˇzivateli. Ot´azkou z˚ ust´av´a, jak ˇcasto data z informaˇcn´ıch zdroj˚ u zpracov´avat. To je individu´aln´ı a z´aleˇz´ı to na konkr´etn´ım zdroji. V pˇr´ıpadˇe program˚ u kin staˇc´ı aktualizace jednou dennˇe, ale pokud by se jednalo o zpravodajstv´ı, bylo by vhodn´e proces opakovat napˇr. kaˇzd´ ych deset minut tak, aby uˇzivatel z´ıskal vˇzdy aktu´aln´ı informace.
11
Anal´yza probl´emu
Agregace informaˇcn´ıch zdroj˚ u
Dalˇs´ı v´ yhodou pouˇzit´ı serveru je moˇznost ruˇcn´ıho pˇrid´av´an´ı zdroj˚ u, resp. jiˇz konkr´etn´ıch dat. M˚ uˇzeme tak poskytovat informace, kter´e nejsou nikde k dispozici a nedaj´ı se ukl´adat automaticky. Takto navrˇzen´ y syst´em se pˇri spr´avnˇe zvolen´em zp˚ usobu komunikaci mezi serverem a aplikac´ı st´av´a velmi univerz´aln´ım. K pˇrenosu dat proto budu pouˇz´ıvat znaˇckovac´ı jazyk XML, kter´ y je nez´avisl´ y na pouˇzit´e platformˇe. D´ıky tomu by se aplikace dala portovat i na jin´e syst´emy neˇz je iOS.
Obr´azek 3.3: Nepˇr´ım´y pˇr´ıstup k informac´ım pomoc´ı serveru
12
C´ıl pr´ace
4 C´ıl pr´ace Pr´ace je rozdˇelena na serverovou ˇca´st a klientskou aplikaci pro platformu iOS. Server bude schopen zpracov´avat informaˇcn´ı zdroje na internetu a ukl´adat z´ıskan´a data, kter´a bude n´aslednˇe pˇri zaˇza´d´an´ı poskytovat klientovi. Pro ovˇeˇren´ı funkcionality bude server schopn´ y z´ısk´avat programy nˇekolika kin v ˇ CR. Aplikace se bude pˇripojovat k serveru a stahovat data. Ta se budou lok´alnˇe keˇsovat v zaˇr´ızen´ı a aktualizace probˇehne pouze pˇri ˇz´adosti uˇzivatele. V´ ypis informac´ı bude prov´adˇen s ohledem na dostupnost pro mobiln´ı zaˇr´ızen´ı. Kromˇe textov´e reprezentace nab´ıdne aplikace i jejich zobrazen´ı na mapˇe s vyuˇzit´ım geografick´e polohy pˇr´ıstroje. Ud´alosti s definovan´ ym ˇcasem bude moˇzn´e vyuˇz´ıt pro pl´anov´an´ı kalend´aˇre, odesl´an´ı SMS a emailu. Oproti aplikac´ım v kapitole 2.4 nebude tato pr´ace zamˇeˇrena na ˇz´adn´ y konkr´etn´ı zdroj informac´ı a bude moˇzn´e je doplˇ novat. Souˇca´st´ı pr´ace je i n´avrh vhodn´e s´ıt’ov´e komunikace mezi serverem a aplikac´ı.
13
Komunikace mezi serverem a aplikac´ı
5 Komunikace mezi serverem a aplikac´ı Server a aplikace jsou dva nez´avisl´e prvky a mus´ı spolu komunikovat. Ve smˇeru z aplikace na server se bude pos´ılat jen informace o tom, jak´a data jsou poˇzadov´ana. To se d´a velmi jednoduˇse zaˇr´ıdit pomoc´ı parametr˚ u v http protokolu. Odpovˇed´ı ale bude relativnˇe velk´e mnoˇzstv´ı dat a je proto nutn´e urˇcit jejich form´at. Protoˇze server i aplikace funguj´ı na odliˇsn´ ych platform´ach, uk´azalo se jako dobr´a volba XML (viz obr´azek 5.1). Mnoˇzstv´ı dat uloˇzen´ ych na serveru m˚ uˇze b´ yt pˇri rozs´ahlejˇs´ım poˇctu informaˇcn´ıch zdroj˚ u pˇr´ıliˇs velk´e, a proto by nebylo vhodn´e pˇren´aˇset je do aplikace vˇsechna najednou. Z tohoto d˚ uvodu jsem rozdˇelil pˇrenos podle vrstev tˇr´ıdˇen´ı informac´ı (viz obr´azek 3.1, str. 10). Pos´ılaj´ı se tak zvl´aˇst’ kategorie, podkategorie, m´ısta i ud´alosti. Nav´ıc pouze v r´amci jedn´e sv´e nadˇrazen´e tˇr´ıdy. Najednou se tak pˇren´aˇs´ı napˇr. vˇsechny ud´alosti patˇr´ıc´ı k jednomu m´ıstu nebo vˇsechna m´ısta z jedn´e podkategorie.
Obr´azek 5.1: Komunikace serveru s aplikac´ı
14
Komunikace mezi serverem a aplikac´ı
5.1
Form´at XML
Form´ at XML
Aby komunikace prob´ıhala v poˇra´dku, mus´ı b´ yt XML ze serveru odesl´ano ve stejn´em form´atu, jak ho oˇcek´av´a aplikace. Pro form´at jsem zvolil n´asleduj´ıc´ı hlavn´ı znaˇcky: • root - koˇrenov´ y element • status_code - ˇc´ıseln´ y k´od stavu odpovˇedi (viz tabulka 5.1) • status_message - slovn´ı reprezentace status code • data - element zaobaluj´ıc´ı vˇsechna pˇren´aˇsen´a data • node - obecn´ y element, obsahuje vˇzdy jednu informaci (napˇr. jedno m´ısto nebo jednu ud´alost)
status code 200 201 403 404 405 406 407 408 501
status message OK Service OK Parameter category_id is missing Parameter category_id is empty Parameter subcategory_id is missing Parameter subcategory_id is empty Parameter place_id is missing Parameter place_id is empty No results
ˇ ıseln´e k´ody stavu odpovˇedi a jejich slovn´ı reprezentace Tabulka 5.1: C´
Dalˇs´ı znaˇcky jsou pouˇzity pro popis informac´ı a liˇs´ı se podle sv´e tˇr´ıdy (viz tabulka 5.2, str. 16).
15
Komunikace mezi serverem a aplikac´ı
Form´at XML
Kategorie id name timestamp_unix
Identifikaˇcn´ı ˇc´ıslo N´azev ˇ posledn´ı aktualizace v unixov´em form´atu Cas
Podkategorie id category_id name timestamp_unix
Identifikaˇcn´ı ˇc´ıslo ˇ ıslo kategorie, do kter´e patˇr´ı C´ N´azev ˇ posledn´ı aktualizace v unixov´em form´atu Cas
M´ısto id subcategory_id name timestamp_unix description coordinates
Identifikaˇcn´ı ˇc´ıslo ˇ ıslo podkategorie, do kter´e patˇr´ı C´ N´azev ˇ posledn´ı aktualizace v unixov´em form´atu Cas Popis Geolokaˇcn´ı souˇradnice
Ud´ alost id place_id name timestamp_unix date_unix times_unix description length
Identifikaˇcn´ı ˇc´ıslo ˇ ıslo m´ısta, do kter´eho patˇr´ı C´ N´azev Posledn´ı aktualizace v unixov´em form´atu Den ud´alosti v unixov´em form´atu ˇ Casy ud´alosti v dan´em dnu v unixov´em form´atu Popis D´elka v minut´ach
Tabulka 5.2: Znaˇcky pro popis informac´ı jednotliv´ych tˇr´ıd
16
Komunikace mezi serverem a aplikac´ı
Form´at XML
K´ od 1 Pˇr´ıklad XML odpovˇedi pˇri dotazu subcategory?category_id=1
<status_code>200 <status_message>OK <node> 1 1 Kina 1335599267 <node> 2 1 Divadla 1335599062
17
N´avrh serveru
6 N´avrh serveru Pro vytvoˇren´ı serveru jsem zvolil jazyk PHP. Rozhodl jsem se pˇredevˇs´ım na z´akladˇe m´ ych pˇredchoz´ıch zkuˇsenost´ı a bral jsem ohled i na to, ˇze je tento ˇ jazyk velmi rozˇs´ıˇren a podporov´an mnoha webhostingy v CR. Aby byla zaruˇcena bezpeˇcnost serveru a dal se snadno rozˇsiˇrovat, rozhodl jsem se pouˇzit PHP framework. K dispozici je jich nˇekolik a vˇetˇsina je volnˇe dostupn´a. Vybral jsem Nette Framework v aktu´aln´ı verzi 2.0, kter´ y m´a ˇ v CR velmi ˇsirokou komunitu v´ yvoj´aˇr˚ u a je zdarma dostupn´ y jako svobodn´ y software pod licenc´ı New BSD. [10] Serverov´a aplikace nem´a ˇz´adn´e uˇzivatelsk´e rozhran´ı, jej´ı funkcionalita spoˇc´ıv´a ve shromaˇzd’ov´an´ı a poskytov´an´ı dat.
18
N´avrh serveru
6.1
Poˇzadavky serveru a vybran´y webhosting
Poˇ zadavky serveru a vybran´ y webhosting
Poˇzadavky serveru z´avis´ı pˇredevˇs´ım na pouˇzit´em frameworku (viz tabulka 6.1, str. 6.1). Kromˇe toho je nutn´e pˇredpokl´adat, ˇze zpracov´an´ı informaˇcn´ıch zdroj˚ u bude prob´ıhat pˇrev´aˇznˇe z webov´ ych str´anek a mus´ı b´ yt proto povolena funkce cURL pro naˇc´ıt´an´ı jejich obsahu. Pro u ´ˇcely bakal´aˇrsk´e pr´ace jsem se snaˇzil nal´ezt webhosting, kter´ y by odpov´ıdal zm´ınˇen´ ym poˇzadavk˚ um a byl z´aroveˇ n nab´ızen zdarma. Jako vhodn´ y se nakonec uk´azal webhosting na dom´enˇe php5.cz, jehoˇz poskytovatelem je ZONER software, a.s. [11] Poˇ zadavek PHP verze 5.2.0 nebo vyˇsˇs´ı .htaccess file protection .htaccess mod rewrite Function ini set() Function error reporting() Function flock() Register globals Zend.ze1 compatibility mode Session auto-start Reflection extension SPL extension PCRE extension ICONV extension PHP tokenizer PDO extension Multibyte String extension Multibyte String function overloading Memcache extension GD extension Bundled GD extension Fileinfo extension or mime content type()
Popis Vyˇzadov´ano frameworkem Omezen´ı pˇr´ıstupu do sloˇzek Potˇrebn´e pro routov´an´ı Bezpeˇcnostn´ı d˚ uvody Bezpeˇcnostn´ı d˚ uvody Vyˇzaduje cache Mus´ı b´ yt vypnuto Mus´ı b´ yt vypnuto Mus´ı b´ yt vypnuto Vyˇzadov´ano frameworkem Vyˇzadov´ano frameworkem Vyˇzadov´ano frameworkem Vyˇzadov´ano frameworkem Vyˇzadov´ano frameworkem Vyˇzadov´ano Nette\Database Vyˇzadov´ano Nebezpeˇcn´e, mus´ı b´ yt vypnuto Podporov´ano u ´loˇziˇstˇem cache Vyˇzadov´ano Nette\Image Vyˇzadov´ano Nette\Image Detekce uploadovan´ ych soubor˚ u
Tabulka 6.1: Poˇzadavky Nette Frameworku na webov´y server [12]
19
N´avrh serveru
6.2
Datab´aze
Datab´ aze
Datab´aze je realizov´ana v jazyce MySQL. Jak je vidˇet na ERA diagramu (viz obr. 6.1), jej´ı model se drˇz´ı n´avrhu tˇr´ıdˇen´ı informac´ı (viz obr. 3.1, str. 10) a kaˇzd´a tabulka tak pˇredstavuje jednu vrstvu informac´ı.
Obr´azek 6.1: ERA diagram datab´aze
6.3
Struktura serveru
Struktura aplikace serveru vych´az´ı z Nette Framework a je doplnˇena o sloˇzky objects a parsers (viz k´od 2, str. 21). N´asleduje popis hlavn´ıch sloˇzek. • config - sloˇzka s konfiguraˇcn´ımi soubory. Kromˇe z´akladn´ıho souboru config.neon, kter´ y obsahuje napˇr. u ´daje o pˇripojen´ı k datab´azi, zde nalezneme jeˇstˇe parser.neon a xml.neon. V nich je uloˇzen´e nastaven´ı parser˚ u a form´at XML odpovˇedi. • models - modely, tedy tˇr´ıdy slouˇz´ıc´ı jako datov´a vrstva – ParserModel.php ukl´ad´a informace do datab´aze bˇehem parsov´an´ı informaˇcn´ıch zdroj˚ u – ServiceModel.php z´ısk´av´a informace z datab´aze pˇri dotazu klienta • objects - sloˇzka s datov´ ymi strukturami • parsers - sloˇzka s parsery, pro kaˇzd´ y informaˇcn´ı zdroj je zde jeden soubor 20
N´avrh serveru
Struktura serveru
• presenters - zde nalezneme presentery, kter´e maj´ı za u ´kol odpov´ıdat na akci volanou uˇzivatelem – ParserPresenter.php je vol´an pro zah´ajen´ı zpracov´an´ı informaˇcn´ıho zdroje – ServisPresenter.php je vol´an pro z´ısk´an´ı XML se zpracovan´ ymi daty • templates - obsahuje ˇsablony pro jednotliv´e str´anky • libs - knihovny tˇret´ıch stran vˇcetnˇe samotn´eho Nette Framework • log - sloˇzka pro ukl´ad´an´ı logovac´ıch soubor˚ u pˇri ladˇen´ı aplikace • temp - doˇcasn´e soubory, napˇr. zkompilovan´e ˇsablony • www - v´ ychoz´ı sloˇzka Nette Framework obsahuj´ıc´ı index.php K´ od 2 Struktura aplikace serveru a v´ yznamn´e soubory - app + config - models ParserModel.php ServiceModel.php - objects Events.php + parsers - presenters ParserPresenter.php ServicePresenter.php + templates + libs + log + temp + www index.php
21
N´avrh serveru
6.4
Zpracov´an´ı informaˇcn´ıch zdroj˚ u
Zpracov´ an´ı informaˇ cn´ıch zdroj˚ u
Informaˇcn´ı zdroj je definov´an obecnˇe, ale ve vˇetˇsinˇe pˇr´ıpad˚ u se jedn´a o webov´e str´anky. Server z nich stahuje data a pomoc´ı parseru z nich z´ısk´av´a potˇrebn´e informace, kter´e n´aslednˇe ukl´ad´a do sv´e datab´aze (viz obr. 6.2). Probl´em ale je, ˇze tyto webov´e str´anky mohou m´ıt jakoukoliv formu a pro kaˇzd´ y zdroj je tak potˇreba vytvoˇrit jin´ y parser. Pˇrid´av´an´ı nov´ ych zdroj˚ u proto nen´ı trivi´aln´ı z´aleˇzitost´ı, kter´a by byla provediteln´a na uˇzivatelsk´e u ´rovni.
Obr´azek 6.2: Zpracov´an´ı informaˇcn´ıho zdroje
22
N´avrh serveru
6.5
Tvorba parseru
Tvorba parseru
Vytvoˇril jsem tˇr´ıdu BaseParser, od kter´e se vˇsechny parsery dˇed´ı. Obsahuje n´asleduj´ı promˇenn´e a metody: K´ od 3 Promˇenn´e a hlaviˇcky funkc´ı tˇr´ıdy BaseParser private $events; private $originalData; private $placeId; public function __construct($placeId) public function getPlaceId() public function getEvents() public function getOriginalData() protected function addEvent($name, $date, $dateUnix, $times, $timesUnix, $length, $description) protected function remote_data_by_post($url, $params=null, $timeout = 5) protected function remote_data_by_get($url, $params=null, $timeout = 5)
V oddˇedˇen´e tˇr´ıdˇe je nutn´e dopsat funkci pro zpracov´an´ı dat, typicky pojmenovanou parseData(). Pro staˇzen´ı dat z web˚ u jsou pˇripraveny metody remote_data_by_post() a remote_data_by_get(), kter´e pouˇz´ıvaj´ı metodu cURL. Ze z´ıskan´ ych dat je potˇreba dostat n´asleduj´ıc´ı informace vztahuj´ıc´ı se ke kaˇzd´e ud´alosti: • n´azev • datum v textov´e podobˇe • datum v unixov´em form´atu • ˇcasy ud´alosti v dan´em dnu v textov´e podobˇe oddˇelen´e ˇca´rkami • ˇcasy ud´alosti v dan´em dnu v unixov´em form´atu oddˇelen´e ˇca´rkami • d´elku ud´alosti v minut´ach • popis 23
N´avrh serveru
Pouˇzit´ı parseru, uloˇzen´ı dat
Kaˇzd´a takto z´ıskan´a ud´alost se mus´ı pˇridat pomoc´ı funkce addEvent(). Ta ji totiˇz spr´avn´ ym zp˚ usobem uloˇz´ı do objektu Events, kter´ y se nakonec z parseru vrac´ı jako v´ ysledek.
6.6
Pouˇ zit´ı parseru, uloˇ zen´ı dat
Parsery se budou pouˇstˇet pˇri urˇcit´em vol´an´ı serveru. K tomu v Nette Frameworku slouˇz´ı presentery. Pro parsery jsem vytvoˇril ParserPresenter a jeho vol´an´ı se prov´ad´ı n´asleduj´ıc´ım zp˚ usobem: url_serveru/www/parser/render/id Poloˇzky render a id slouˇz´ı jako “parametry“ str´anky. To je dan´e frameworkem. Presentery se v nˇem vˇzdy d´ale dˇel´ı na rendery, id nen´ı povinn´e. Pˇri zad´an´ı adresy bez renderu se vol´a renderDefault(). Urˇcil jsem, ˇze rendery budou pˇredstavovat n´azev parseru, vol´an´ı tedy bude: url_serveru/www/parser/nazev_parseru Id lze vyuˇz´ıt napˇr´ıklad u n´aroˇcn´eho parseru, u nˇehoˇz se parsov´an´ı mus´ı prov´adˇet v nˇekolika kroc´ıch. V praxi se parser pouˇz´ıv´a velice jednoduˇse. Nejprve se vytvoˇr´ı jako objekt, pˇriˇcemˇz parametrem v konstruktoru je ˇc´ıslo m´ısta, ke kter´emu se vztahuje. Pot´e se nad n´ım zavol´a metoda pro z´ısk´an´ı dat, kter´a se typicky jmenuje parseData(). Nakonec se metodou getEvents() z´ısk´a objekt s ud´alostmi, kter´ y bude pomoc´ı modelu ParserModel uloˇzen do datab´aze. Spoleˇcnˇe s renderem nov´eho parseru ve tˇr´ıdˇe ParsePresenter je nutn´e vytvoˇrit i odpov´ıdaj´ıc´ı ˇsablonu ve sloˇzce templates/Parser/ (napˇr. novyParser.latte). I pˇresto, ˇze str´anka nemus´ı m´ıt ˇza´dn´ y uˇzivatelsk´ y v´ ystup, Nette Framework to vyˇzaduje.
24
N´avrh serveru
Pouˇzit´ı parseru, uloˇzen´ı dat
K´ od 4 Pˇr´ıklady pouˇzit´ı parser˚ u ve tˇr´ıdˇe ParserPresenter class ParserPresenter extends BasePresenter { public function renderDefault() { // nen´ ı zadan´ e jm´ eno parseru, nic se neprov´ ad´ ı } public function renderParserJedna() // vol´ ano bez id { $parser = new Parser1(5); // vytvoˇ ren´ ı parseru // pro m´ ısto 5 $parser->parseData(); // zpracov´ an´ ı dat $events = $parser->getEvents(); // z´ ısk´ an´ ı dat $this->parserModel->updateEvents($events); //uloˇ zen´ ı } public function renderParserDva($id) // vol´ ano s id { if($id!=1) return; $parser = new Parser2(7); // vytvoˇ ren´ ı parseru // pro m´ ısto 7 $parser->parseData(); // zpracov´ an´ ı dat $events = $parser->getEvents(); // z´ ısk´ an´ ı dat $this->parserModel->updateEvents($events); //uloˇ zen´ ı } }
25
N´avrh serveru
6.7
Vytvoˇren´e parsery
Vytvoˇ ren´ e parsery
V r´amci bakal´aˇrsk´e pr´ace jsem vytvoˇril parsery dvou informaˇcn´ıch zdroj˚ u. Jedn´a se o multikina Cinestar a Cinemacity.
6.7.1
Parser Cinemacity
Spoleˇcnost Cinemacity nab´ız´ı centralizovan´e webov´e str´anky s programem vˇsech sv´ ych kin. Parser tedy nezpracov´av´a pouze jedno m´ısto, ale je vytvoˇren obecnˇejˇs´ım zp˚ usobem tak, aby z´ısk´aval informace o vˇsech kinech. Z´akladem pro fungov´an´ı parseru je adresa informaˇcn´ıho zdroje, ze kter´e se z´ısk´avaj´ı potˇrebn´a data. V tomto pˇr´ıpadˇe se jedn´a o adresu http://cinemacity.cz/scheduleInfoRows, kter´a je spoleˇcn´a pro vˇsechna kina. Konr´etn´ı poˇzadavek se specifikuje pˇripojen´ım n´asleduj´ıc´ıch parametr˚ u: • locationId - Slouˇz´ı k urˇcen´ı poboˇcky kina. Pro jednotliv´a kina bylo nutn´e zjistit odpov´ıdaj´ıc´ı k´ody (viz tabulka 6.2). • date - Datum poˇzadovan´eho programu ve form´atu DD/MM/YYYY. ´ cel tohoto parametru jsem nezjistil, ale vˇzdy m´a • venueTypeId - Uˇ hodnotu 0. Kino Praha Flora Praha Galaxie Praha Letˇ nany Praha Nov´ y Sm´ıchov Praha Slovansk´ y d˚ um Praha Zliˇc´ın Brno Olympia ˇ ıˇcek Brno Velk´ y Spal´ Plzeˇ n Liberec Pardubice ´ ı nad Labem Ust´ Ostrava
locationId 1010105 1010113 1010110 1010101 1010111 1010104 1010103 1010107 1010106 1010102 1010108 1010109 1010114
Tabulka 6.2: Parametr locationId pro adresu infromaˇcn´ıho zdroje Cinemacity 26
N´avrh serveru
Vytvoˇren´e parsery
Chceme-li z´ıskat napˇr. data o programu kin v Plzni pro den 4.5.2012, bude adresa vypadat n´asledovnˇe: http://cinemacity.cz/scheduleInfoRows?locationId=1010106 &date=04/05/2012&venueTypeId=0 Mus´ı b´ yt zavol´ana metodou GET a v´ ysledkem, kter´ y se vr´at´ı, je HTML tabulka s n´asleduj´ıc´ım form´atem: K´ od 5 Uk´azkov´a data pro z´ısk´an´ı informac´ı ze zdroje Cinemacity ...
... Bitevn´ ı lod’ | MP-12 | ˇ CT | 129 | ... 16:50 | ...
... ...
Pro zpracov´an´ı t´eto tabulky a z´ısk´an´ı konr´etn´ıch informac´ı o programech kin jsem pouˇzil volnˇe dostupn´ y PHP Simple HTML DOM Parser. [13] Informaˇcn´ı zdroj Cinemacity obsahuje celkem 13 kin a programy se stahuj´ı aˇz t´ yden dopˇredu (podle aktu´aln´ı dostupnosti). Cel´ y proces parsov´an´ı je tak ˇcasovˇe relativnˇe n´aroˇcn´ y. Pro kaˇzd´e kino se zpracuje a uloˇz´ı do datab´aze 27
N´avrh serveru
Vytvoˇren´e parsery
pˇribliˇznˇe 100 filmov´ ych pˇredstaven´ı, coˇz trv´a na pouˇzit´em serveru asi 7 vteˇrin. Jelikoˇz m´a server omezen´ı 30 vteˇrin na vykon´an´ı jednoho dotazu, bylo nutn´e rozdˇelit parsov´an´ı na nˇekolik ˇca´st´ı. Spouˇstˇen´ı parseru tedy prob´ıh´a opakovan´ ym vol´an´ım adresy url_serveru/www/parser/cinemacity/id s hodnotami id 1 aˇz 4 (viz kapitola 6.6).
6.7.2
Parser Cinestar
Cinestar stejnˇe jako Cinemacity nab´ız´ı centralizovan´e str´anky s programem pro vˇsechna sv´a kina. I parser proto bude fungovat na podobn´em principu. Rozd´ıl je v adres´ach pro z´ısk´av´an´ı dat, nyn´ı je pro kaˇzd´e kino jin´a (viz tabulka 6.3). V parametrech se urˇcuje pouze datum v unixov´em form´atu. Kino
Adresa
ˇ Praha Cern´ y Most
http://praha9.cinestar.cz/program_multikino.php http://praha5.cinestar.cz/program_multikino.php http://boleslav.cinestar.cz/program_multikino.php http://liberec.cinestar.cz/program_multikino.php http://hradec.cinestar.cz/program_multikino.php http://ostrava.cinestar.cz/program_multikino.php http://olomouc.cinestar.cz/program_multikino.php http://pardubice.cinestar.cz/program_multikino.php http://plzen.cinestar.cz/program_multikino.php http://jihlava.cinestar.cz/program_multikino.php http://budejovice.cinestar.cz/program_multikino.php
Praha Andˇel Mlad´a Boleslav Liberec Hradec Kr´alov´e Ostrava Olomouc Pardubice Plzeˇ n Jihlava ˇ e Budˇejovice Cesk´
Tabulka 6.3: Adresy informaˇcn´ıch zdroj˚ u pro kina Cinestar Adresu je v tomto pˇr´ıpadˇe nutn´e volat metodou POST. Pˇr´ıklad pro z´ısk´an´ı dat o programu kin v Plzni pro den 4.5.2012 je: http://plzen.cinestar.cz/program_multikino.php?datum=1336089600 V´ ysledkem dotazu je opˇet HTML tabulka, kterou zpracov´av´am pomoc´ı PHP Simple HTML DOM Parser [13]. Zpracov´av´a se 11 kin aˇz t´ yden dopˇredu (podle aktu´aln´ı dostupnosti), coˇz opˇet pˇrekraˇcuje 30 vteˇrinov´ y limit serveru. Parser se tedy vol´a v nˇekolika kroc´ıch vol´an´ım adresy url_serveru/www/parser/cinestar/id, nyn´ı s hodnotami id 1 aˇz 3 (viz kapitola 6.6). 28
N´avrh aplikace
7 N´avrh aplikace Pˇri vytv´aˇren´ı aplikace jsem pouˇz´ıval v´ yvojov´e prostˇred´ı Xcode ve verzi 4.2. Ta pˇrin´aˇs´ı dvˇe d˚ uleˇzit´e zmˇeny, kter´e jsem vyuˇzil pˇri v´ yvoji. Prvn´ı z nich je Automatic Reference Counting, coˇz je funkce umoˇzn ˇuj´ıc´ı automatickou spr´avu pamˇeti pro objekty v Objective C. Program´ator se d´ıky tomu nemus´ı starat o uvolˇ nov´an´ı objekt˚ u z pamˇeti a pˇri pˇrekladu programu je k´od pro uvolnˇen´ı automaticky doplnˇen. Druhou novinkou je funkce Storyboarding, kter´a slouˇz´ı k celkov´emu n´avrhu aplikace. Vizu´aln´ı prostˇred´ı se d´ıky tomu nenavrhuje pro kaˇzdou obrazovku zvl´aˇst’, ale k dispozici je n´ahled kompletn´ı aplikace se vˇsemi obrazovkami a se zn´azornˇen´ ymi pˇrechody mezi nimi (viz obr´azek 7.1).
Obr´azek 7.1: Uk´azka storyboardu
7.1
Struktura aplikace
Aplikace pro syst´em iOS maj´ı kv˚ uli mal´ ym u ´hlopˇr´ıˇck´am displej˚ u velmi omezen´ y prostor pro zobrazov´an´ı sv´eho obsahu. M˚ uˇzou vyuˇz´ıvat pouze jedno okno a to je pro sloˇzitˇejˇs´ı aplikace nedostaˇcuj´ıc´ı. Jsou proto k dispozici ob29
N´avrh aplikace
Struktura aplikace
jekty View Controller, kter´e poskytuj´ı infrastrukturu pro spr´avu obsahu aplikace. Jejich pouˇzit´ı umoˇzn´ı ˇclenit uˇzivatelsk´e rozhran´ı na v´ıce ˇc´ast´ı a vytvoˇrit r˚ uzn´e pohledy aplikace. View controllery lze rozdˇelit na n´asleduj´ıc´ı dvˇe skupiny. [14] • Content View Controller pomoc´ı jedn´e nebo v´ıce komponent View zobrazuje obsah aplikace na obrazovce. Bˇeˇznˇe se pouˇz´ıv´a pro zobrazen´ı dat uˇzivateli, pro jejich z´ısk´an´ı a nebo k vykon´an´ı urˇcitˇe ˇcinnosti. K dispozici je nˇekolik odvozen´ ych tˇr´ıd a asi nejpouˇz´ıvanˇejˇs´ı z nich je Table View Controller, kter´a je pˇrizp˚ usobena pro zobrazov´an´ı dat ve stylu tabulky. Vzhled bunˇek m˚ uˇze b´ yt libovolnˇe upraven a m˚ uˇze obsahovat jak´ekoliv dalˇs´ı komponenty. • Container View Controller slouˇz´ı pro organizaci dalˇs´ıch view controller˚ u a zobrazov´an´ı jejich obsahu. Funguje jako navigaˇcn´ı prvek v aplikaci a zajiˇst’uje pˇrechody mezi jednotliv´ ymi pohledy. Nejd˚ uleˇzitˇejˇs´ı a nejpouˇz´ıvanˇejˇs´ı z nich jsou Navigation Controller a Tab Bar Controller (viz obr. 7.2).
Obr´azek 7.2: Tab Bar Controller v aplikaci Hodiny
30
N´avrh aplikace
Struktura aplikace
Pˇri n´avrhu aplikace jsem bral ohled na velikost displeje a snaˇzil se vˇsechna data, kter´a potˇrebuji zobrazit, vhodnˇe rozdˇelit do jednotliv´ ych pohled˚ u. V´ ysledek je zn´azornˇen na obr´azku 7.3, kompletn´ı storyboard potom je k dispozici v pˇr´ıloze.
Obr´azek 7.3: Sch´ema struktury aplikace
Aplikace je pomoc´ı tab bar controlleru rozdˇelena na tˇri z´akladn´ı sekce: • Katalog zobrazuje vˇsechna dostupn´a data v tabulkov´ ych v´ ypisech. Katalog se drˇz´ı n´avrhu tˇr´ıdˇen´ı informac´ı (viz kapitola 3.1) a pro kaˇzdou tˇr´ıdu informac´ı je vytvoˇren samostatn´ y pohled s tabulkou pomoc´ı table view controlleru. Pro pˇrechod mezi nimi je pouˇzit navigation controller. • Mapa nab´ız´ı alternativn´ı zobrazen´ı vˇsech m´ıst z katalogu, jejich polohy jsou zn´azornˇeny jako ˇspendl´ıky na mapˇe. Jedn´a se o z´akladn´ı view controller. Z jednotliv´ ych m´ıst je potom pomoc´ı navigation controlleru umoˇznˇen pˇrechod na dan´ y seznam ud´alost´ı. • Nastaven´ı je pouze z´akladn´ı view controler. Kaˇzd´ y pohled v aplikaci v sobˇe uchov´av´a data, kter´a zobrazuje. Bylo nutn´e definovat strukturu, ve kter´e budou tato data uloˇzena. Urˇcil jsem, ˇze se 31
N´avrh aplikace
Struktura aplikace
bude jednat o pole objekt˚ u, pˇriˇcemˇz objekt reprezentuje konkr´etn´ı informaci a mus´ı tak b´ yt pro kaˇzd´ y pohled jin´ y. V tabulce 7.1 jsou uvedeny objekty pro jednotliv´e pohledy a informace, kter´e obsahuj´ı. Category - pro pohled Kategorie ID identifikaˇcn´ı ˇc´ıslo name n´azev timestamp ˇcas v unixov´em form´atu stringTime ˇcas jako ˇretˇezec Subategory - pro pohled Podkategorie ID identifikaˇcn´ı ˇc´ıslo name n´azev timestamp ˇcas v unixov´em form´atu stringTime ˇcas jako ˇretˇezec categoryId ˇc´ıslo kategorie, do kter´e patˇr´ı Place - pro pohledy M´ısta a Mapa ID identifikaˇcn´ı ˇc´ıslo subcategoryId ˇc´ıslo podkategorie, do kter´e patˇr´ı name n´azev timestamp ˇcas v unixov´em form´atu stringTime ˇcas jako ˇretˇezec description popis coordinates souˇradnice Event - pro pohled Ud´alosti ID identifikaˇcn´ı ˇc´ıslo placeId ˇc´ıslo m´ısta, do kter´eho patˇr´ı name n´azev timestamp ˇcas v unixov´em form´atu stringTime ˇcas jako ˇretˇezec date datum ud´alosti v unixov´em form´atu stringDate datum ud´alosti v textov´e podobˇe times pole ˇcas˚ u v unixov´em form´atu stringTimes pole ˇcas˚ u v textov´e podobˇe description popis length d´elka v minut´ach Tabulka 7.1: Pouˇzit´e objekty a informace, kter´e obsahuj´ı
32
N´avrh aplikace
7.2
Komunikace se serverem
Komunikace se serverem
Protoˇze komunikace se serverem prob´ıh´a na mnoha m´ıstech aplikace, vytvoˇril jsem tˇr´ıdu ServerController, kter´a vˇse zajiˇst’uje. Jej´ı u ´lohou je pˇripojit se k serveru, naˇc´ıst z nˇej poˇzadovan´a data a vr´atit je jako v´ ysledek. Zobrazuje tak´e informaˇcn´ı hl´aˇsen´ı pˇri naˇc´ıt´an´ı dat nebo pˇri nedostupnosti internetov´eho pˇripojen´ı. Protoˇze se bˇehem spojen´ı m˚ uˇze pˇren´aˇset i vˇetˇs´ı mnoˇzstv´ı dat, coˇz nˇejakou dobu trv´a, je realizov´ano asynchronnˇe. T´ım se pˇredejde pozastaven´ı cel´e aplikace pˇri ˇcek´an´ı na dokonˇcen´ı pˇrenosu. Z tohoto d˚ uvodu tˇr´ıda obsahuje protokol ServerControllerDelegate, kter´ y je pˇri pouˇzit´ı nutno pˇrijmout a naimplementovat jeho jedinou metodu serverController:didReceiveData:. Ta se vol´a ve chv´ıli, kdy se dokonˇc´ı pˇrenos a vrac´ı z´ıskan´a data. Z´akladn´ı metodou tˇr´ıdy je sendToServerOnUrl:WithParams:. Jej´ımi parametry jsou url adresa a parametry, se kter´ ymi se poˇsle dotaz na vzd´alen´ y server. Pro pˇripojen´ı pouˇz´ıv´a NSURLConnection, kter´e se inicializuje n´asleduj´ıc´ım zp˚ usobem: K´ od 6 Inicializace NSURLConnection NSURL *nsURL = [[NSURL alloc] initWithString:initUrl]; NSMutableURLRequest *nsMutableURLRequest = [[NSMutableURLRequest alloc] initWithURL:nsURL]; [nsMutableURLRequest setHTTPMethod:@"POST"]; NSData *paramData = [paramDataString dataUsingEncoding:NSUTF8StringEncoding]; [nsMutableURLRequest setHTTPBody: paramData]; nsUrlConnection=[[NSURLConnection alloc] initWithRequest:nsMutableURLRequest delegate:self];
Promˇenn´e initUrl a paramDataString jsou parametry funkce. Jak je v k´odu vidˇet, poˇzadavky se na server pos´ılaj´ı metodou POST. Metodu sendToServerOnUrl:WithParams: vyuˇz´ıvaj´ı vˇsechny n´asleduj´ıc´ı metody: • loadXmlCategoriesAll - naˇcten´ı vˇsech dostupn´ ych kategori´ı • loadXmlSubcategoriesByCategoryId: - naˇcten´ı podkategori´ı, kter´e patˇr´ı do kategorie urˇcen´e parametrem 33
N´avrh aplikace
Parsov´an´ı XML
• loadXmlSubcategoriesAll - naˇcten´ı vˇsech dostupn´ ych podkategori´ı • loadXmlPlacesBySubcategoryId: - naˇcten´ı m´ıst, kter´e patˇr´ı do podkategorie urˇcen´e parametrem • loadXmlPlacesAll - naˇcten´ı vˇsech dostupn´ ych m´ıst • loadXmlEventsByPlaceId: - naˇcten´ı ud´alost´ı, kter´e patˇr´ı do m´ısta urˇcen´eho parametrem • loadXmlEventsAll - naˇcten´ı vˇsech dostupn´ ych ud´alost´ı D´ale bylo nutn´e ve tˇr´ıdˇe pˇrijmout a naimplementovat metody protokolu NSURLConnection: • connection:didReceiveResponse - odezva na pˇripojen´ı • connection:didReceiveData - pˇrijmula se data • connection:didFinishLoading - pˇrij´ım´an´ı dat bylo dokonˇceno, v tuto chv´ıli se vol´a metoda deleg´ata serverController:didReceiveData • connection:didFailWithError - nastala chyba • connection:willSendRequest:redirectResponse - doˇslo k pˇresmˇerov´an´ı
7.3
Parsov´ an´ı XML
Pˇrijat´a XML data ze serveru je nutn´e zpracovat a z´ıskat z nich potˇrebn´e informace. K tomu slouˇz´ı tˇr´ıda XmlParser. Obsahuje pouze tzv. metody tˇr´ıdy, coˇz je obdoba statick´ ych metod v jin´ ych programovac´ıch jazyc´ıch. S tˇr´ıdou se tedy nepracuje jako s objektem, pouze se volaj´ı jej´ı metody: • parseCategories: • parseSubcategories: • parsePlaces: • parseEvents: 34
N´avrh aplikace
Keˇsov´an´ı dat
Parametrem uveden´ ych metod jsou vˇzdy data pˇrijat´a ze serveru a vracej´ı se jiˇz hotov´e objekty naplnˇen´e zpracovan´ ymi informacemi, se kter´ ymi se pracuje v aplikaci. K parsov´an´ı jsem pouˇzil knihovnu Google Data ObjectiveC Client [15].
7.4
Keˇ sov´ an´ı dat
Keˇsov´an´ı dat je realizov´ano pomoc´ı ukl´ad´an´ı do soubor˚ u a prob´ıh´a pˇri kaˇzd´e aktualizaci ze serveru. Protoˇze mnoˇzstv´ı dat potˇrebn´ ych k uloˇzen´ı m˚ uˇze b´ yt pˇri rostouc´ım poˇctu informaˇcn´ıch zdroj˚ u velk´e, nepouˇz´ıv´a se pouze jeden ˇ soubor. Cas naˇc´ıt´an´ı a ukl´ad´an´ı by totiˇz mohl b´ yt pˇr´ıliˇs dlouh´ y a aplikace by se stala ˇspatnˇe pouˇzitelnou. Zvl´aˇst’ jsou proto ukl´ad´any informace o kategori´ıch, podkategori´ıch a m´ıstech. V pˇr´ıpadˇe ud´alost´ı je ˇclenˇen´ı jeˇstˇe podrobnˇejˇs´ı a ud´alosti vztahuj´ıc´ı se k urˇcit´emu m´ıstu jsou vˇzdy uloˇzeny ve vlastn´ım souboru (viz tabulka 7.2). Soubor SavedCategories.plist SavedSubcategories.plist SavedPlaces.plist SavedEventsForPlace_1.plist SavedEventsForPlace_2.plist SavedEventsForPlace_3.plist ... SavedEventsForPlace_n.plist
Pouˇ zit´ı uloˇzen´ı kategori´ı uloˇzen´ı podkategori´ı uloˇzen´ı m´ıst uloˇzen´ı ud´alost´ı pro m´ısto 1 uloˇzen´ı ud´alost´ı pro m´ısto 2 uloˇzen´ı ud´alost´ı pro m´ısto 2 uloˇzen´ı ud´alost´ı pro m´ısto n
Tabulka 7.2: Pouˇzit´e soubory pro ukl´ad´an´ı dat
Pro ukl´ad´an´ı a naˇc´ıt´an´ı soubor˚ u slouˇz´ı tˇr´ıda StorageController. Jej´ımi hlavn´ımi metodami jsou: writeObject:ToFile: a readObjectFromFile:, kter´e zapisuj´ı a ˇctou libovoln´ y objekt do nebo ze souboru. Kaˇzd´a aplikace v iOS m´a pro pr´aci se soubory k dispozici pouze jednu svoj´ı sloˇzku, tzv. sandbox. Cestu k t´eto sloˇzce lze zjistit pomoc´ı standardn´ı sluˇzby NSSearchPathForDirectoriesInDomains, kterou jsem pro zjednoduˇsen´ı pouˇzil v metodˇe storagePatch (viz k´od 7). Implementace ˇcten´ı a zapisov´an´ı objekt˚ u je uk´az´ana v k´odu 8.
35
N´avrh aplikace
Keˇsov´an´ı dat
K´ od 7 Metoda storagePatch pro zjiˇstˇen´ı sloˇzky aplikace +(NSString *)storagePath { return [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex: 0]; } ˇ ı objektu ze souboru a z´apis objektu do souboru K´ od 8 Cten´ // c ˇten´ ı: NSString *storagePath = [self storagePath]; NSString *filePath = [storagePath stringByAppendingPathComponent:fileName]; return [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; // z´ apis: NSString *storagePath = [self storagePath]; NSString *filePath = [storagePath stringByAppendingPathComponent:fileName]; [NSKeyedArchiver archiveRootObject:object toFile:filePath];
D´ale jsou ve tˇr´ıdˇe k dispozici metody zajiˇst’uj´ıc´ı jiˇz konkr´etn´ı naˇc´ıt´an´ı a ukl´ad´an´ı dat kategori´ı, podkategori´ı, m´ıst a ud´alost´ı: • loadAllCategories - nahr´av´a vˇsechny kategorie • saveAllCategories: - ukl´ad´a vˇsechny kategorie • saveSubcategories:forCategoryId: - ukl´ad´a podkategorie pro danou kategorie • loadSubcategoriesForCategoryId: - nahr´av´a podkategorie z dan´e kategorie • saveAllSubcategories: - ukl´ad´a vˇsechny podkategorie • loadAllSubcategories - nahr´av´a vˇsechny podkategorie • savePlaces:forSubcategoryId: - ukl´ad´a m´ısta k dan´e podkategorie • loadPlacesForSubcategoryId: - nahr´av´a m´ısta z dan´e podkategorie 36
N´avrh aplikace
Pr´ace s mapami
• loadAllPlaces - nahr´av´a vˇsechna m´ısta • saveAllPlaces: - ukl´ad´a vˇsechna m´ısta • saveEvents:forPlaceId: - ukl´ad´a ud´alosti k dan´emu m´ıstu • loadEventsForPlaceId: - nahr´av´a ud´alosti z dan´eho m´ısta • saveAllEvents: - ukl´ad´a vˇsechny ud´alosti
7.5
Pr´ ace s mapami
Pohled aplikace, kde je zobrazena mapa, je reprezentov´an tˇr´ıdou Map ViewController, odvozen´e od z´akladn´ıho view controlleru. Stejnˇe jako ostatn´ı pohledy si mus´ı uchov´avat informace o zobrazovan´ ych datech. V tomto pˇr´ıpadˇe se jedn´a o m´ısta, kter´a jsou ve v´ ysledku reprezentov´ana jako ˇspendl´ıky na mapˇe. Naˇc´ıtaj´ı se vˇzdy pˇri inicializaci tˇr´ıdy nebo pˇri aktualizaci ze serveru. Pro zobrazov´an´ı samotn´e mapy je pouˇzita tˇr´ıda Map View dostupn´a v MapKit framework. Sama o sobˇe pˇri spr´avn´e inicializaci nab´ız´ı n´ahled mapy, kter´ y lze libovolnˇe posouvat, pˇribliˇzovat a oddalovat. Nav´ıc zobrazuje i aktu´aln´ı polohu uˇzivatele. Zb´ yv´a tedy zobrazit vˇsechna potˇrebn´a m´ısta na mapˇe. Ty jsou realizov´ana pomoc´ı tzv. anotac´ı, coˇz jsou objekty tˇr´ıdy MKAnnotatin. Pˇri jejich vytv´aˇren´ı je potˇreba kromˇe jejich n´azvu urˇcit tak´e jejich pozici na mapˇe, coˇz se prov´ad´ı pomoc´ı objektu tˇr´ıdy MKCoordinateRegion. Anotace se na mapu pˇrid´av´a pomoc´ı funkce addAnnotation: (viz k´od 9). K´ od 9 Pˇrid´an´ı anotace do mapy MKCoordinateRegion region = { {0.0, 0.0}, {0.0, 0.0} }; region.center.latitude = 49.72488; region.center.longitude = 13.350891; region.span.longitudeDelta = 0.02f; region.span.latitudeDelta = 0.02f; MapAnnotation *ann = [[MapAnnotation alloc] init]; ann.title = @"Jm´ eno m´ ısta"; ann.subtitle = @"Popis m´ ısta"; ann.coordinate = region.center; [mapView addAnnotation:ann];
37
N´avrh aplikace
Interakce s ud´alostmi
Samotn´e anotace vˇsak nejsou ˇz´adn´ ym zp˚ usobem na mapˇe zobrazeny. U kaˇzd´e je nejdˇr´ıve nutn´e nastavit objekt tˇr´ıdy MKAnnotationView, kter´ y pˇredstavuje ˇspendl´ık na mapˇe. K tomu je potˇreba, aby tˇr´ıda MapViewController pˇrijmula protokol MKMapViewDelegate a byla naimplementov´ana metoda mapView:viewForAnnotation:. Jej´ım parametrem je anotace a n´avratovou hodnotou objekt tˇr´ıdy MKAnnotationView, tedy ˇspendl´ık. V tˇele metody je tˇreba tento ˇspendl´ık vytvoˇrit a vr´atit ho, ˇc´ımˇz bude pˇriˇrazen k dan´e anotaci. Pˇri tom lze napˇr. specifikovat jeho barvu nebo pˇridat tlaˇc´ıtko do detailu. To jsem vyuˇzil, aby byl umoˇznˇen pˇrechod na seznam ud´alost´ı dan´eho m´ısta.
7.6
Interakce s ud´ alostmi
Aplikace nab´ız´ı u detailu ud´alosti odesl´an´ı SMS, emailu nebo jej´ı pˇrid´an´ı do kalend´aˇre. Tato akce se vztahuje vˇzdy k vybran´emu ˇcasu.
Odesl´ an´ı SMS Pro odesl´an´ı SMS slouˇz´ı tˇr´ıda MFMessageComposeViewConroller. Z n´azvu je patrn´e, ˇze je odvozena od z´akladn´ıho view cotrolleru, jedn´a se tedy o samostatn´ y pohled aplikace. Nab´ız´ı pˇredpˇripraven´e rozhran´ı totoˇzn´e s aplikac´ı Zpr´avy ze syst´emu iOS. Lze pˇredvyplnit tˇelo zpr´avy a pˇr´ıjemce. Inicializace a zobrazen´ı pohledu je uk´az´ano v k´odu 10. K´ od 10 Zobrazen´ı obrazovky pro odesl´an´ı SMS MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init]; if([MFMessageComposeViewController canSendText]) { controller.body = [NSString stringWithFormat: @"Ahoj, co takhle j´ ıt na %@, %@ v %@?", eventTitle, eventDate, eventTime]; controller.messageComposeDelegate = self; controller.recipients = nil; [self presentModalViewController:controllere animated:YES]; }
38
N´avrh aplikace
Interakce s ud´alostmi
Odesl´ an´ı emailu Email se odes´ıl´a stejn´ ym zp˚ usobem jako zpr´avy SMS. Rozd´ıl je pouze v pouˇzit´e tˇr´ıdˇe, kterou je tentokr´at MFMailComposeViewController. Kromˇe tˇela zpr´avy a pˇr´ıjemc˚ u se u n´ı nastavuje jeˇstˇe pˇredmˇet emailu (viz k´od 11). K´ od 11 Zobrazen´ı obrazovky pro odesl´an´ı emailu MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init]; mailer.mailComposeDelegate = self; [mailer setSubject:@"Pozv´ anka na akci"]; NSString *emailBody = [NSString stringWithFormat: @"Ahoj, co takhle j´ ıt na %@, %@ v %@?", eventTitle, eventDate, eventTime]; [mailer setMessageBody:emailBody isHTML:NO]; [self presentModalViewController:mailer animated:YES];
Pˇ rid´ an´ı ud´ alosti do kalend´ aˇ re Pˇr´ıstup ke kalend´aˇri v telefonu prob´ıh´a pomoc´ı tˇr´ıdy EKEventStore. Pomoc´ı n´ı se do kalend´aˇre pˇrid´a ud´alost reprezentovan´a objektem tˇr´ıdy EKEvent, u kter´e se mus´ı urˇcit ˇcas zaˇc´atku, konce (oba u ´daje v unixov´em form´atu), jej´ı n´azev a kalend´aˇr, kter´ y pro pˇrid´an´ı chceme pouˇz´ıt. V uk´azkov´em k´odu 12 je pouˇzit v´ ychoz´ı kalend´aˇr syst´emu. K´ od 12 Pˇrid´an´ı ud´alosti do kalend´aˇre EKEventStore *eventStore = [[EKEventStore alloc] init]; EKEvent *newEvent = [EKEvent eventWithEventStore:eventStore]; newEvent.title = eventTitle; newEvent.startDate = [NSDate dateWithTimeIntervalSince1970:eventTimeUnix]; newEvent.endDate = [newEvent.startDate dateByAddingTimeInterval:eventLength]; [newEvent setCalendar:[eventStore defaultCalendarForNewEvents]]; [eventStore saveEvent:newEvent span:EKSpanThisEvent error:nil];
39
Testov´an´ı
8 Testov´an´ı 8.1
Funkˇ cnost parser˚ u
Server byl v r´amci testov´an´ı bakal´aˇrsk´e pr´ace v provozu na dom´enˇe http://george.php5.cz. Nem´a ˇza´dn´e uˇzivatelsk´e prostˇred´ı a tak test spoˇc´ıval v kontrole uloˇzen´ ych dat pro vybran´e informaˇcn´ı zdroje. Postupnˇe jsem spustil parsery pro Cinestar a Cinemacity (viz kapitola 6.6) zad´an´ım n´asleduj´ıc´ıch adres ve webov´em prohl´ıˇzeˇci: http://george.php5.cz/www/parser/cinemacity/1 http://george.php5.cz/www/parser/cinemacity/2 http://george.php5.cz/www/parser/cinemacity/3 http://george.php5.cz/www/parser/cinemacity/4 http://george.php5.cz/www/parser/cinestar/1 http://george.php5.cz/www/parser/cinestar/2 http://george.php5.cz/www/parser/cinestar/3 N´aslednˇe jsem se pomoc´ı n´astroje phpMyAdmin pˇripojil k datab´azi. V´ ysledkem je 2528 ud´alost´ı, coˇz odpov´ıd´a oˇcek´avan´emu pr˚ umˇern´emu poˇctu 100 pˇredstaven´ı pro kaˇzd´e z 24 kin (13 kin Cinemacity, 11 kin Cinestar). Toto ˇc´ıslo je z´avisl´e na aktu´aln´ım programu, kter´ y je k dispozici. Kontrola jednotliv´ ych ud´alost´ı prob´ıhala z d˚ uvodu jejich velk´eho mnoˇzstv´ı n´ahodn´ ym v´ ybˇerem. Vˇsechna zkouman´a data byla uloˇzena v poˇr´adku.
8.2
Bˇ eh aplikace
Na testov´an´ı aplikace jsem bˇehem v´ yvoje pouˇz´ıval iPhone Simulator, kter´ y je souˇc´ast´ı prostˇred´ı Xcode. Testy prob´ıhaly na poˇc´ıtaˇci Apple Mac mini a MacBook Pro. Funkˇcnost fin´aln´ı verze jsem ovˇeˇroval i v re´aln´em zaˇr´ızen´ı, mobiln´ım telefonu iPhone 3GS, coˇz umoˇznilo v praxi vyzkouˇset napˇr´ıklad geolokaˇcn´ı funkce. Z nˇej jsou tak´e poˇr´ızeny vˇsechny sn´ımky aplikace v t´eto kapitole.
40
Testov´an´ı
Bˇeh aplikace
Byly otestov´any n´asleduj´ıc´ı situace: • zobrazen´ı informac´ı v katalogu (viz obr. 8.1) • zobrazen´ı m´ıst na mapˇe (viz obr. 8.2) • interakce s ud´alostmi(viz obr. 8.3) • chov´an´ı aplikace pˇri nedostupn´em internetov´em pˇripojen´ı (viz obr. 8.5) • chov´an´ı aplikace bez naˇcten´ ych dat (viz obr. 8.4)
(a) Kategorie
(b) Podkategorie
(d) Ud´ alosti
(c) M´ısta
(e) Detail ud´alosti
Obr´azek 8.1: Zobrazen´ı informac´ı v katalogu 41
Testov´an´ı
Bˇeh aplikace
ˇ (a) Cel´ a CR
(b) Detail na m´ısto
Obr´azek 8.2: Zobrazen´ı m´ıst na mapˇe
(a) Katalog
(b) Mapa
Obr´azek 8.3: Chov´an´ı aplikace bez naˇcten´ych dat
42
Testov´an´ı
Validita zobrazovan´ych informac´ı
(a) Odesl´ an´ı SMS
(b) Odesl´an´ı emailu
(c) Pˇrid´an´ı ud´alosti do kalend´aˇre
Obr´azek 8.4: Interakce s ud´alostmi
(a) Zobrazen´ı uloˇzen´ ych dat
(b) Pokus o aktualizaci
Obr´azek 8.5: Chov´an´ı aplikace pˇri nedostupn´em internetov´em pˇripojen´ı
8.3
Validita zobrazovan´ ych informac´ı
Pro kontrolu validity zobrazovan´ ych informac´ı jsem porovnal v´ ystup aplikace s prim´arn´ım zdrojem informac´ı, j´ımˇz jsou v pˇr´ıpadˇe program˚ u filmov´ ych pˇredstaven´ı webov´e str´anky dan´eho kina (viz obr. 8.6 a 8.7, str. 44). 43
Testov´an´ı
Validita zobrazovan´ych informac´ı
Obr´azek 8.6: Program kin dostupn´y na www.cinemacity.cz
Obr´azek 8.7: Program kin zobrazen´y v aplikaci
44
Uˇzivatelsk´a pˇr´ıruˇcka
9 Uˇzivatelsk´a pˇr´ıruˇcka 9.1
Spuˇ stˇ en´ı
Aplikace se spouˇst´ı stisknut´ım pˇr´ısluˇsn´e ikonky na obrazovce telefonu. Po naˇcten´ı se objev´ı u ´vodn´ı obrazovka s katalogem.
9.2
Ovl´ ad´ an´ı aplikace
Aplikace je rozdˇelena do tˇrech hlavn´ıch ˇca´st´ı zobrazen´ ych ve spodn´ı navigaˇcn´ı liˇstˇe (viz obr. 9.1: A). • Katalog - zde je k dispozici tabulkov´ y v´ ypis dostupn´ ych informac´ı zobrazen´ y v nˇekolika u ´rovn´ıch. V´ ybˇerem poloˇzky se vˇzdy pˇresuneme do pˇr´ısluˇsn´e podkategorie. Tlaˇc´ıtkem zpˇet (viz obr. 9.1: B) se vrac´ıme ou ´roveˇ n v´ yˇs. Nejniˇzˇs´ı u ´rovn´ı katalogu je detail ud´alosti, u kter´eho lze vybran´ y ˇcas kon´an´ı pˇridat do kalend´aˇre, pˇr´ıpadnˇe ho odeslat pomoc´ı SMS nebo emailu. • Mapa - zobrazuje m´ısta na mapˇe zn´azornˇen´a pomoc´ı ˇspendl´ıku. Zm´aˇcknut´ım ˇspendl´ıku se zobraz´ı n´azev m´ısta s tlaˇc´ıtkem pro pˇrechod na pˇr´ısluˇsn´e ud´alosti (viz obr. 9.1: E). Mapu lze posouvat a pomoc´ı gest dvou prst˚ u i pˇribliˇzovat a oddalovat. Stisknut´ım tlaˇc´ıtka Moje poloha (viz obr. 9.1: D) se n´ahled pˇresune na aktu´aln´ı pozici uˇzivatele. Lze tak prozkoum´avat m´ısta v okol´ı. • Nastaven´ı - umoˇzn ˇuje naˇc´ıt´an´ı a maz´an´ı vˇsech dostupn´ ych dat (viz n´ıˇze).
9.3
ˇ asteˇ C´ cn´ a aktualizace dat
ˇ asteˇcn´a aktualizace dat se inicializuje tlaˇc´ıtkem pro obnovu C´ (viz obr. 9.1: C). Naˇc´ıtaj´ı se vˇzdy pouze data potˇrebn´a k obnovˇe informac´ı na aktu´aln´ı obrazovce. To je v´ yhodn´e napˇr. pˇri omezen´em pˇripojen´ı k internetu. Data z˚ ust´avaj´ı uloˇzena v telefonu pro dalˇs´ı zobrazen´ı. 45
Uˇzivatelsk´a pˇr´ıruˇcka
9.4
Kompletn´ı aktualizace dat
Kompletn´ı aktualizace dat
Kompletn´ı aktualizace dat se provede v nastaven´ı aplikace stisknut´ım tlaˇc´ıtka Naˇc´ıst vˇsechna data. T´ım se naˇctou ze serveru vˇsechny aktu´alnˇe dostupn´e informace. Pˇri jejich velk´em mnoˇzstv´ı m˚ uˇze ale naˇc´ıt´an´ı trvat delˇs´ı dobu a st´ahne se pˇri tom vˇetˇs´ı mnoˇzstv´ı dat. Je tedy vhodn´e tento proces prov´adˇet napˇr. pˇri pˇripojen´ı pˇres s´ıt’ wi-fi. V´ yhodou je, ˇze naˇcten´a data z˚ ustanou uloˇzena v telefonu a vˇsechny kategorie lze potom proch´azet bez nutnosti internetov´eho pˇripojen´ı.
9.5
Maz´ an´ı dat
Maz´an´ı dat se prov´ad´ı v nastaven´ı, tlaˇc´ıtkem Smazat vˇsechna data. Aplikace se tak uvede do p˚ uvodn´ıho stavu. Tento proces je nevratn´ y a pro opˇetovn´e zobrazen´ı informac´ı je nutn´e je znovu naˇc´ıst ze serveru.
Obr´azek 9.1: Navigaˇcn´ı prvky aplikace
46
Z´avˇer
10 Z´avˇer Aplikace pro mobiln´ı telefony se staly d´ıky sv´e okamˇzit´e dostupnosti velice obl´ıben´ ym n´astrojem pro z´ısk´av´an´ı informac´ı. Pˇrispˇel k tomu jistˇe i rychl´ y v´ yvoj tˇechto zaˇr´ızen´ı, kter´a dnes jiˇz dok´aˇzou poskytnout dostateˇcnˇe pohodln´e a pˇrehledn´e uˇzivatelsk´e rozhran´ı. V r´amci bakal´aˇrsk´e pr´ace jsem se zab´ yval v´ yvojem aplikace pro platformu iOS, kter´a ˇcerp´a informace ze vzd´alen´ ych zdroj˚ u a vhodn´ ym zp˚ usobem je zprostˇredkov´av´a uˇzivateli. Bˇehem anal´ yzy probl´emu jsem urˇcil tˇr´ıdˇen´ı informac´ı do kategori´ı takov´ ym zp˚ usobem, aby ˇclenˇen´ı bylo pˇrehledn´e a z´aroveˇ n byl syst´em pouˇziteln´ y pro ˇsirok´e mnoˇzstv´ı informaˇcn´ıch zdroj˚ u. Pˇr´ıstup k prim´arn´ımu zdroji informac´ı neprob´ıh´a pˇr´ımo z aplikace. Nam´ısto toho je pouˇzit meziˇcl´anek ve formˇe serveru, kter´ y pˇristupuje ke zdroj˚ um, zpracov´av´a dostupn´a data a z´ıskan´e informace ukl´ad´a do sv´e datab´aze. Aplikace se potom pˇripojuje pouze k nˇemu. D˚ uleˇzit´ y byl n´avrh komunikace mezi serverem a aplikac´ı. D´ıky zvolen´emu form´atu XML je syst´em nez´avisl´ y na platformˇe a aplikace by se tak dala portovat i na jin´e syst´emy. V´ ysledkem je funkˇcn´ı aplikace otestovan´a v re´aln´em zaˇr´ızen´ı. Umoˇzn ˇuje uˇzivateli zobrazen´ı informac´ı z vybran´ ych informaˇcn´ıch zdroj˚ u, jimiˇz jsou aktu´aln´ı programy filmov´ ych pˇredstaven´ı ve vˇsech multikinech Cinestar a Ciˇ nemacity v CR. D´ıky vhodn´emu n´avrhu by se pr´ace dala v budoucnu snadno rozˇsiˇrovat. Na stranˇe serveru by to bylo urˇcitˇe pˇrid´an´ı dalˇs´ıch informaˇcn´ıch zdroj˚ u, coˇz znamen´a pˇredevˇs´ım vytvoˇren´ı nov´ ych parser˚ u. V pˇr´ıpadˇe aplikace se otev´ır´a moˇznost jiˇz zmiˇ novan´e portace na jin´e platformy neˇz iOS, napˇr. Android nebo Windows Phone. V u ´vahu by pˇripadal i webov´ y port´al, ˇcerpaj´ıc´ı ze stejn´eho zdroje informac´ı.
47
Pouˇ zit´ e v´ yrazy • framework - softwarov´a struktura a knihovna potˇrebn´ ych utilit slouˇz´ıc´ı k podpoˇre programov´an´ı a v´ yvoje softwarov´ ych projekt˚ u • HTTP, Hypertext Transfer Protocol - internetov´ y protokol urˇcen´ y pro v´ ymˇenu hypertextov´ ych dokument˚ u ve form´atu HTML • PHP - skriptovac´ı programovac´ı jazyk urˇcen´ y pˇredevˇs´ım pro programov´an´ı dynamick´ ych internetov´ ych str´anek • phpMyAdmin - n´astroj napsan´ y v jazyce PHP umoˇzn ˇuj´ıc´ı jednoduchou spr´avu obsahu datab´aze MySQL • SDK, Software Developement Kit - software umoˇzn ˇuj´ıc´ı v´ yvoj pro urˇcitou platformu • SMS, Short Message Service - sluˇzba pro zas´ıl´an´ı kr´atk´ ych textov´ ych zpr´av mezi mobiln´ımi telefony • unixov´ yˇ cas - ˇcas vyj´adˇren´ y poˇctem vteˇrin uplynul´ ych od 1.1.1970 • webhosting - pron´ajem prostoru pro webov´e str´anky na ciz´ım serveru • XML, Extensible Markup Language - obecn´ y znaˇckovac´ı jazyk vyvinut´ y a standardizovan´ y konsorciem W3C (http://www.w3c.org)
Literatura [1] LAMARCHE, Jeff - MARK, Dave, iPhone SDK, Computer Press, 2010. ISBN 9788025128206. ˇ [2] CADA Ondˇrej, Programov´an´ı pro iOS, 2011 [cit. 12.2.2012]. Dostupn´e z http://www.mujmac.cz/rubriky/software/ nastal-cas-na-kakao--59269cz. [3] HOLLEMANS, Matthijs, Beginning Storyboards in iOS 5, 14.11.2011 [cit. 7.2.2012]. Dostupn´e z http://www.raywenderlich.com/5138/ beginning-storyboards-in-ios-5-part-1. [4] WENDERLICH, Ray, Introduction to MapKit on iOS, 22.3.2011 [cit. 16.3.2012]. Dostupn´e z http://www.raywenderlich.com/2847/ introduction-to-mapkit-on-ios-tutorial. [5] AOL Inc., Apple: 250 million iOS devices sold, 4.10.2011 [cit. 2.2.2012]. Dostupn´e z http://www.engadget.com/2011/10/04/ apple-250-million-ios-devices-sold/. [6] Apple inc., SOFTWARE LICENSE AGREEMENT FOR MAC OS X, 2011 [cit. 6.5.2012]. Dostupn´e z http://images.apple.com/legal/sla/ docs/macosx107.pdf. [7] Apple inc., Xcode, 2012 [cit. 6.2.2012]. Dostupn´e z http://developer. apple.com/xcode/. [8] Apple inc., iOS UI Element Usage Guidelines, 2012 [cit. 16.2.2012]. Dostupn´e z http://developer.apple.com/library/ios/ \#documentation/UserExperience/Conceptual/MobileHIG/ UIElementGuidelines/UIElementGuidelines.html\#//apple\_ref/ doc/uid/TP40006556-CH13-SW1.
49
[9] Apple inc., iOS Human Interface Guidelines, 2012 [cit. 29.4.2012]. Dostupn´e z http://developer.apple.com/library/ios/ \#documentation/UserExperience/Conceptual/MobileHIG/ Introduction/Introduction.html\#//apple\_ref/doc/uid/ TP40006556-CH1-SW1. [10] Nette Foundation, Licenˇcn´ı politika Nette Framework, [cit. 1.5.2012]. Dostupn´e z http://nette.org/cs/license.
2012
[11] ZONER software, a.s., Podm´ınky hostingu PHP5.cz, 2012 [cit. 3.5.2012]. Dostupn´e z http://www.php5.cz/index/conditions/. [12] Nette Foundation, Poˇzadavky Nette Framework, 2012 [cit. 3.5.2012]. Dostupn´e z http://doc.nette.org/cs/requirements. [13] CHEN, S.C., PHP Simple HTML DOM Parser, 2012 [cit. 9.4.2012]. Dostupn´e z http://simplehtmldom.sourceforge.net/. [14] Apple inc., View Controller Basics, 2012 [cit. 2.3.2012]. Dostupn´e z http://developer.apple.com/library/ios/\#featuredarticles/ ViewControllerPGforiPhoneOS/AboutViewControllers/ AboutViewControllers.html. [15] Google Inc., Google Data APIs 2012 [cit. 4.3.2012]. Dostupn´e z gdata-objectivec-client/.
Objective-C Client Library, http://code.google.com/p/
A Pˇ r´ılohy A.1 CD K pr´aci je pˇriloˇzeno CD s n´asleduj´ıc´ı strukturou: • /dokument/ - tento dokument v elektronick´e podobˇe • /aplikace/source/ - zdrojov´e k´ody klientsk´e aplikace • /aplikace/readme.txt - instrukce pro spuˇstˇen´ı aplikace v Xcode • /server/source/ - zdrojov´e k´ody serverov´e aplikace • /server/readme.txt - instrukce pro instalaci serveru
A.2 Instalace serverov´ e aplikace Pouˇzit´ y server mus´ı splˇ novat poˇzadavky uveden´e v kapitole 6.1. Je potˇreba zkop´ırovat cel´ y osbsah sloˇzky /server/source/ z pˇriloˇzen´eho CD do koˇrenov´eho adres´aˇre. Pot´e je nutn´e nastavit datab´azi. Parametry pro pˇripojen´ı se vyplˇ nuj´ı v konfiguraˇcn´ım souboru config.latte um´ıstˇen´em ve sloˇzce /app/config/. Podrobnˇejˇs´ı popis je k dispozici v souboru readme.txt.
Pˇr´ıloha A.3: Storyboard aplikace v prostˇred´ı Xcode