126 84 41MB
Hungarian Pages 513 [521] Year 2011
Az iPhone SOK programozása Objective-C nyelven Wei -Me ng Lee
2011
Az. iPhone SDK programozása Objective-C nyelven Eeginning iPhone SDK Programming with Objective-C Wei-Meng Lee
Copyright 2010 by Wiley Publishing, Inc., Indianapolis, Indiana Origirral English language edition published by John Wiley & Sons International Rights, Inc. Ali rights reserved. Ths translation published under license. Magyar fordítás (Hungarian translation) © SZAK Kiadó 2011. A2 eredeti angol nyelvű kiadás jogainak tulajdonosa a Wiley Publishing, Inc. A magyar fordítás a Wiley Publishing, Inc. engedélyével jelenik meg. Fordította a SZAK Kiadó fordítócsoportja: Balaskó Attila, Domoszlai László, Dzurdzik Ádám, Herczeg Géza, Juhász Gergely, Losonczy Gergő, Neuhauser Márk, Sárosi Ádám, Ti ber Melinda, Varga Péter A fordítást szakmailag ellenőrizte: Forstner Bertalan
ISB
978-963-9863-19-4
A könyv fordítása a Kilgray Kft. MemoQ (http:/ /www.memoqtm.com) program segítségével készült.
Minden jog fenntartva. Jelen könyvet, illetve annak részeit a kiadó engedélye nélkül tilos reprodukálni, adatrögzítő rendszerben tárolni, bármilyen formában vagy eszközzel elektronikus úton vagy más módon közölni.
SZAK Kiadó Kft. • Az 1795-ben alapított Magyar Könyvkiadók és Könyvterjesztők
Egyesülésének a tagja • 2060 Bicske, Diófa u. 3. •
Tel.: 36-22-350-209 • Fax: 36-22-565-311 •
www.szak.hu • e-mail:
[email protected] • Kiadóvezető: Kis Ádám, e-mail: [email protected] Főszerkesztő:
Kis Balázs, e-mail: [email protected]
Családomnak: Kiiszonöm a megértést és a támogatást, ame!Jet a köf!JV késiftése során tő/etek kaptam. 5 zeretfek benneteket/
Tartalomjegyzék A szerzőről ........................................................... xvii
, 't,as ............................................... . xix .. .. t ny1•t van1 Koszone Bevezetés ........................................................... . xxi Kinek sz ól ez a könyv? ................................................................................ xxü Mivel foglalkozik ez a könyv? .................................................................... xxü Hogyan épül fel ez a könyv? ........................................................................ xxv Mi szükséges a könyv használatához? ........................................................ xxv
Jelölések ....................................................................................................... xxv Forráskód .................................................................................................... xxvi Hibajegyzék ............................................................................................... xxvii
p2p.wrox.com ........................................................................................... xxviii
l. rész: Bevezetés 1.
Bevezetés az i Phone programozásába ....................... 3 A:z iPhone SDK beszerzése .............................................................................. 4 A:z iPhone SDK részei ...................................................................................... S
Xcode .................................. ......................................................................................... 6 iPh one Simulator ........................................................................................................ 8 Mire képes az iPhone Simulato r? ....................................................................... 9 Alkalmazások eltávolítása az iPhone Sirnulatorból... ..................................... 11 Interface Builder ....................................................................................................... 12 Instrurnents ............................................................................................................... 12 A:z iPhone OS felépítése ................................................................................ 14
Néhány további hasznos tudnívaló ............................................................... 17 Az iPhone OS verziói .............................................................................................. 18 Tesztelés tényleges eszközökön ............................. ................................................. 19 Képernyőfelbontás ................................................................................................... 19 Egyablakos alkalmazások ......................................................................................... 20 Háttérben futó alkalmazások nélkül ....................................................................... 20 Külső felek alkalmazásaira vonatkozó korlátozások ............................................ 21
Tartalomjegyzék
2.
Az
első
Hello World! alkalmazás megirása ................ 23
Ismerkedés az Xcode-dal .............................................................................. 24 Az Interface Builder használata .............................................................................. 28 A képernyőtájolás megváltoztatása......................................................................... 31 Az elemek átrendezése ........................................................................................... .. 33 Programkód írása ...................................................................................................... 35
Az alkalmazás ikonjának testre szabása ....................................................... 37
3.
Kivezetések, müveletek és nézetvezérlök ............... 41 A kód és a felhasználói felület
együttműködésének
az alapjai.. .................. .42
XIB-fájlok szerkesztése ............................................................................................ 45 Delegációk .......... ................................................................................................. 46 ézetvezérlők ..................................................................................................... 47 A View ablak megtervezése .............................................................................. 48 Kivezetések és múveletek létrehozása ............................................................. 50 A nézetvezérlő kapcsolata a múvelethez és a kivezetéshez .......................... 57 Kivezetések exponálása tulajdonságokként .................................................... 60 A múvelet leprogramozása ............................................................... ................. 61 Egy összetettebb példa ............................................................................................. 62 A múveletek és kivezetések meghatározása .................................................... 62 A múveletek és kivezetések összekötése ......................................................... 64 A múveletek megvalósítása ............................................................................... 64 Nézetvezérlők
................................................................................................ 66
ézetvezérlő hozzáadása ......................................................................................... 67 A nézet személyre szabása ............................................................. ....................... ... 70
4.
Az elemek megismerése ...................................... 75 Az elemek használata .................................................................................... 76 Az Alert elem használata ......................................................................................... 77 Az Action tábla használata ...................................................................................... 81 A Page vezérlőelem és az Image elem ................................................................... 84 Elemek csoportosítása szegmentált vezérlőelemrnel ........................................... 91 A Web View használata ........................................................................................... 95
Elemek dinamikus hozzáadása programkód használatával.. ....................... 98
Az elemek hierarchiája ................................................................................ 102 Váltás a nézetek között ................................................................................ 103 A váltás animálása ................................................................................................... 111 Adatok átadása nézetek között ............................................................................. 113
viii
Tartalomjegyzék
5.
Bevitel a A
billentyűzetről. ...................................
billentyűzet
119
használata ............................................................................. 120
A beviteli lehető ségek személyre szabása ......................................... .......... 122 A A A
billentyűzet
eltüntetése ................................................. ...................................... 124 átállítása szárnbillentyűzette .......... ............................................... 127 billentyűzet automatikus megjelenítése az elem betöltésekor. ...................... 132 billentyűzet
Billentyűzet
6.
A
jelenlétének érzékelése ............................................................ 133
képernyő
forgatása ........................................ 145
Reagálás az eszköz forgatására ................................. .................................. 145 Különböző képernyőtájolások .............................................................................. 149 A forgatás kezelése .............................................. ................................................... 150 willAnímateFirstHalfOfRotationTolnterfaceOrientation: ......................... 150 willAnímateSecondHalfO fRotationFromlnterfaceOrientation: ........ ........ 151 willRotateTolnterfaceOrientation: ................................................................. 151 willAnímateRotationTolnterfaceOrientation: .............................................. 152
A
képernyő
programozott forgatása ............................................................ 157
Forgatás programfutás közben ....................... ................................ ...................... 157 A nézet adott tájolású megjelenítése a betöltéskor.. ........................................... 158
ll. rész: iPhone-alkalmazások készitése 7.
Elemvezérlök .................................................. 163 Ablakalapú alkalmazás létrehozása ............................................................. 164 Elemvezérlő
programozott hozzáadása ............................................................... 171 Műveletek létrehozása és összekapcsolása ................... ....................................... 175 V ál tás másik nézetre .................................................................................... 178 A nézetváltások animálása ............................................................................ 181
8.
Eszközsáv- és navigációs alkalmazások .................. 187 Eszközsáv-alkalmazások ............................................................................. 189 Elemek elhelyezése az eszközsávon ..................................................................... 193 Hogyan jelenítsük meg az eszközsáv-alkalmazásokat a különböző tájolásoknál? ............................................................................... 199 Navigációalapú alkalmazások ..................................................................... 202 avigálás másik elemre .......................................................................................... 207
ix
Tartalomjegyzék
9. Segédprogramok.............................................. 215 Segédprogramok készítése .......................................................................... 216 Átmenetstílusok ........................................................................................... 221 Új elem hozzáadása a segédprogramhoz .................................................... 222
lll. rész: Adatok megjelenitése és tárolása 10. A Tablenézet használata ................................... 233 Egyszerű
Tab le nézet .................................................................................. 234
Fejléc és lábléc hozzáadása .............................. ...................................................... 240 Kép hozzáadása ...................................................................................................... 241 Kijelölt elem megjelenítése .................................................................................... 242 Behúzás .................................................................................................................... 245
Szakaszok megjelenitése ............................................................................. 245 Indexelés ...................................................................................................... ............ 254 Keresési lehetőség .................................................................................................. 254 Részletek és pipák.. ....................... ............... ........................................................... 265
11. Alkalmazásbeállitások ....................................... 269 Alkalmazáspreferenciák létrehozása ........................................................... 271 A beállítások értékeinek programozott elérése ........................................... 279 A beállitások értékeinek betöltése ........................................................................ 286 A beállitások értékeinek alaphelyzetbe állitása .................................................... 288 A beállitások értékeinek az elmentése ................................. ................................. 289
12. Fájlkezelés .................................................... 293 Az alkalmazásmappák megismerése .......................................................... 294 A Documents és a Library mappák használata ................................................... 295 Fájlok tárolása az ideiglenes mappában .......................................... ......... ............ 299
Tulajdonságlisták használata ...................................................................... 300
13. Adatbázis-tárolás az SQLite3 használatával ............ 311 Az SQLite3 használata ................................................................................. 312
Adatbázis létrehozása és megnyitása .......................................................... 314 A létrehozott adatbázis vizsgálata ......................................................................... 316 Tábla létrehozása .................................................................................................... 316
x
Tartalomjegyzék
Rekordok beszúrása ......................................... ...................................................... 318 Változók összekapcsolása ...................................................................................... 320 Rekordok beolvasása .............................................................................................. 322
IV. rész: Fej lett i Phone-programozási módszerek 14. Többérintéses alkalmazások programozása ............ 329 Érintések érzékelése .................................................................................... 330 Többes érintés érzékelése ........................................................................... 336
A csíptetésgesztus megvalósítása .......................................................................... 340 A húzásgesztus megvalósítása .......................... ..................................................... 346
15.
Egyszerű
animációk .......................................... 349
Az N STirner osztály használata .................................................................. 349
A vizuális változtatás animálása ............................................................................ 356 Nézetek transzformálása ............................................................................. 356
Eltolás ...................................................................................................................... 358 Forgatás .................................................................................................................... 359 Átméretezés ............................................................................................................. 361 Képsorozat animálása .................................................................................. 361
16. Abeépitett alkalmazások elérése ........................ 365 E-mailek küldése ......................................................................................... 366
A Sa fari meghívása ................................................................................................. 369 A Phone alkalmazás meghívása ............................................................................ 369 Az SMS alkalmazás meghívása .............................................................................. 370 A Carnera és a Photo Library elérése .......................................................... 371
A Photo Library alkalmazás elérése ..................................................................... 371 A Carnera alkalmazás elérése ................................................................................. 377 A Contacts alkalmazás elérése .................................................................... 381
évjegy hozzáadása ................................................... ............................................. 386 évjegy törlése ........................................................................................................ 388
xi
Tartalomjegyzék
17. Hozzáférés a hardverhez................................... 391 A
gyorsulásmérő
használata ........................................................................ 391
A rázás észlelése az iPhone OS2 és a korábbi verziókban .......................... 396 A Shake API használata a rázás észleléséhez az OS 3.0 alatt ..................... 396 Művelet
végrehajtása az eszköz rázása közben .......................................... 403
Helyalapú szolgáltatások ............................................................................. 404 Térképek megjelenítése ..................... ..................................................................... 409
V. rész: Függelékek A függelék: A gyakorlatok megoldásai ........................ 417 A 2. fejezet feladatainak a megoldása ......................................................... 417 Válasz az 1. kérdésre .............................................................................................. 41 7 Válasz a 2. kérdésre ................................................................................................ 41 7 A 3. fejezet feladatainak a megoldása ......................................................... 418 Válasz az 1. kérdésre ..................................................................... ......................... 418 Válasz a 2. kérdésre ................................................................................................ 418 A 4. fejezet feladatainak a megoldása ......................................................... 418 Válasz az 1. kérdésre .............................................................................................. 418 Válasz a 2. kérdésre .... ............................................................................................ 419 Válasz a 3. kérdésre ...................................................... .......................................... 41 9 Az 5. fejezet feladatainak a megoldása ....................................................... 419 Válasz az 1. kérdésre .................................................. ...................................... ...... 41 9 Válasz a 2. kérdésre ................................................................................................ 420 Válasz a 3. kérdésre ................................................................................................ 420 A 6. fejezet feladatainak a megoldása ......................................................... 420 Válasz az 1. kérdésre ......................... ..................................................................... 420 Válasz a 2. kérdésre ............ .................................................................................... 420 A 7. fejezet feladatainak a megoldása ......................................................... 421 Válasz az 1. kérdésre .............................................................................................. 421 Válasz a 2. kérdésre ................................................................................................ 421 Válasz a 3. kérdésre ................................................................................................ 421 A 8. fejezet feladatainak a megoldása ......................................................... 422 Válasz az 1. kérdésre .............................................................................................. 422 A 9. fejezet feladatainak a megoldása ......................................................... 427 Válasz az 1. kérdésre ......................................................................................... ..... 427 Válasz a 2. kérdésre .................................. ................................ ,............................. 428 xii
Tartalomjegyzék
A 10. fejezet feladatainak a megoldása ... ........ ..... ..... ............. ......... ............. 429 Válasz az 1. kérdésre .............................................................................................. 429 Válasz a 2. kérdésre ................................................................................................ 429 Válasz a 3. kérdésre ................................................................................................ 429
A 11. fejezet feladatainak a megoldása ........ .. ............................ .......... .... .... 430 Válasz az 1. kérdésre ...... ........................................................................................ 430 Válasz a 2. kérdésre .......... ...................................................................................... 430 Válasz a 3. kérdésre ................................................................................................ 430
A 12. fejezet feladatainak a megoldása .. ... .. ...... ........ .................... .. ...... ....... 430 Válasz az 1. kérdésre .............................................................................................. 430 Válasz a 2. kérdésre ................................................................................................ 431 Válasz a 3. kérdésre .............................................................................................. .. 431
A 13. fejezet feladatainak a megoldása ......... ... ..... .................... ................... 431 V ál asz az 1. kérdésre .............................................................................................. 431 Válasz a 2. kérdésre ............................ ........ ,........................................................... 432 Válasz a 3. kérdésre ................................................................................................ 432
A 14. fejezet feladatainak a megoldása .... .. ............................................. .. ... 432 Válasz az 1. kérdésre .............................................................................................. 432 Válasz a 2. kérdésre .........., ..................................................................................... 432 Válasz a 3. kérdésre .................................................... ............................................ 433
A 15. fejezet feladatainak a megoldása .............................................. .. ... ..... 433 Válasz az 1. kérdésre ., ............... ............................................................................. 433 Válasz a 2. kérdésre .............................................. .................................................. 433 Válasz a 3. kérdésre ................................................................................................ 433
A 16. fejezet feladatainak a m egoldása ............................................... ......... 433 Válasz az 1. kérdésre .................................................... ., ...... .................................. 433 Válasz a 2. kérdésre ............................................................................ ., .................. 434 Válasz a 3. kérdésre ................................................................................................ 434
A 17. fejezet feladatainak a megoldása ...... .... .. ...... ... .. ..... ...... ..... ........ ...... .. .434 Válasz az 1. kérdésre ....................... ......................................... ., ........................ .... 434 Válasz a 2. kérdésre ................................................................................................ 434 Válasz a 3. kérdésre ........................................ ............................................ ., .......... 434
B függelék: Az Xcode használata ............................... 43 5 Az Xcode elindítása ................... ... ......... ... .. ... ..... ... .. .. ...... ... .. .. .. .... ... ... .. ...... . 435
Támogatott projekttípusok .................................................................................... 436 A Toolbar személyre szabása ............ .................................................................... 439 Code Sense .............................................................................................................. 439 Az alkalmazás futtatása .......................................................................................... 441
xiii
Tartalomjegyzék
H ibakeresés az alkalmazásokban ............................................................... 442 Hiba ......................... ................................................................................................. 442 Figyelmeztetések ..................................... ................................................................ 444 Töréspontok beállitása .................................................................. ............ ...... ....... 446 Az NSLog használata ............................................................................................. 448 D okumentációk ...................................................................................................... 449 Research Assistant (kutatási segéd) ...................................................................... 449
C függelék: Az Interface Builder használata ................. 451 A:z xib ablak ................................................................................................. 451 A nézet m egtervezése .................................................................................. 452 A:z Inspector ablak ....................................................................................... 454 Az Attributes lnspector ablaktábla ....................................................................... 455 A Connections Inspector ablak .............................................. .............................. 456 A Size lnspector ablak ................................ ........................................ .................. . 456 Az Iden ti ty Inspector ablak ................................................................................... 457
Library (könyvtár) ........................................................................................ 457 Kivezetések és
művele tek ............................. ...............................................
458
Kivezetések és műveletek létrehozása ................................................................. 458 Kivezetések és műveletek csatlakoztatása ........................................................... 461 1. módszer .................................................... .............................. ....................... 461 2. módszer ............................................. ................... .......................... ............... 462
D függelék: Objective-C gyorstalpaló ......................... 465 Direktívák ................................................................................ .................... 465 Osztályok ..................................................................................................... 466 @interface .......................... ................................................................. .................... 466 @implementation ............................................ ....................................................... 467 @class .............................................................................................. ....................... ,467 Osztály példányosítása ........................................................................................... 469 Mezők ....................................................................................................................... 470 Hozzáférési jogosultságok ..................................................................................... 470 Metódusok ............................................................................................................... 471 Üzenetküldés (metódusok hívása) ................... ..................................................... 473 Tulajdonságok ......................................... ..................................... ........................... 475 lnicializátorok. ............................... .......................................................................... 478
xiv
Tartalomjegyzék
Memóriakezelés ........................................................................................... 481 Referenciaszámlálás ................................................................................................ 481 alloc .................... .. .............................................................................................. 481 new ..................................................................................................................... 482 retain ................................................................................ ,................................. 482 release ................................................................................................................. 483 Kényelmi függvények és az a utorelease ........................................................ 485 A utorelease Po ol .............................................................................................. 487 dealloc ................................................................................................................ 487 Memóriakezelési tippek .................... ............................................................... 488 Protokollok ................................................................................................... 489 Delegált .............................................................. ...................................................... 490 Szelektorok ................................................................................................... 492 Kategóriák .................................................. .................................................. 493
E függelék: Tesztelés konkrét iPhone-on vagy i Pod Touchen .. ...................................... 495 Regisztrálás az iPhone
fejlesztői
programra ............................................... 495
Az Xcode ellnditása ..................................................................................... 496 Tanúsítvány-aláírási kérelem létrehozása ................................................... 497 Bejelentkezés az iPhone
fejlesztői
program portáljára ............................... 499
Tárgymutató ........................................................ 511
XV
A szerzőről Wei-Meng Lee a Developer Learning Solutions (www.learn2develop.net) technológusa és alapítója. A technológiai cég szakterülete a Microsoft és Mac OS X technológiák gyakorlati képzéseinek fejlesztése. Wei-Meng a Wrox és O'Reilly kiadók hírneves szerzője . Wei-Meng az iPhone programozási kurzust először Szingapúrban indította el, és azóta rengeteg pozitív visszajelzést kapott. Az iPhone programozási képzés gyakorlati megközelítésével a téma sokkal könnyebben elsajátítható, mint elméleti könyvek, oktatási anyagok vagy az Apple-dokumentáció böngészésével. A szerzővel a [email protected] e-mail címen lehet felvenni a kapcsolatot.
Köszönetnyi Ivánitás Egy könyv megírása núndig nagy elkötelezettséget jelent. Különösen igaz ez az iPhoneprogtamozásról szóló munka megírására. A könyv végül elkészült, és szeretném megköszönni mindazok segítségét, aki ezt lehetővé tették. Először is szeretnék köszönetet mondani Scott Meyersnek, aki hitt bennem, arnikor leszerződtetett. Remélem, nem okoztam neki csalódást. Köszönet jár Ami Sullivannek, a szerkesztőmnek, az ő segítsége nélkül a könyvet nem fejezhettem volna be. Írás közben lefoglaltak az iPhone-kurzusok, ám a képzések szüneteiben Ami folyamatosan írásra buzdított. Ragaszkodott hozzá, hogy betartsam a szigorú határidőket, de nagyon megértő volt, ha kicsit megcsúsztak a dolgok. Nagyra értékelem irántam tanúsított türelmét, nélküle az olvasók most nem tarthatnák kezükben ezt a könyvet. Ószinte köszönettel tartozom ezért. Végül, de nem utolsósorban szeretnék köszönetet mondani szüleirnnek és feleségemnek, Sze W ának a nekem nyújtott támogatásért. Önzetlenül alakították életüket az én beosztásomnak megfelelően, arnikor a kéziraton dolgoztam. Feleségem hosszú éjszakákon át virrasztott mellettem, miközben mindent félretéve dolgoztam, hogy betartsam a határidóket. Ezért neki és aszüleimnek azt kell mondanom: szeretlek benneteket. Utolsóként köszönet illeti szeretette méltó kutyánkat, Ookiit, mert mindvégig mellettem maradt, noha fogalma sem volt, hogy miért ütöm állandóan a billentyűzetet.
Bevezetés Az iPhone SDK-t hivatalosan 2008. március 6-án az Apple Town Hallban egy megbeszélésen jelentették be. Kezdetben az iPhone-fejlesztést a legnagyobb titokban tartották, ugyanis az Apple titoktartási szerződést (Non-Disclosure Agreement, NDA) kötött azokkal a fejlesztőkkel, akik letöltötték az SDK-t. Tilos volt bárkinek nyilvánosan beszélnie az SDK-ról és a hozzá tartozó programozói interfészekről (API-król). Az Apple feltehetően az SDK stabilitása érdekében kérte mindezt. A fejleszték részéről azonban érthető felháborodást váltott ki, hiszen így nem tehették fel kérdéseiket nyilvános fórumokon, és szükség esetén nem kaphattak gyors segítséget. Emellett könyvek sem születhettek, és tanfolyamokat sem szervezhettek a témáról. Az iPhone SDK esetén az Objective-C programozási nyelv bevezetése sem segített, ugyanis a nyelv elsajátítására időt kell szánni azoknak a fejlesztőknek, akik korábban javarészt a fősodorba tartozó nyelvekkel dolgoztak, mint a Java, a C++, a C# vagy a VB.NET. A külvilág nyomásának engedve az Apple végül 2008 végén feloldotta a titoktartási kötelezettséget. A fejleszték örömmel fogadták a változás hírét, noha ez kissé késlekedett. A témáról szóló vitafórumok még aznap éjjel létrejöttek, az iPhone-ról szóló weboldalak pedig gombamód szaporodni kezdtek. Bár az iPhone-fejlesztéssel kapcsolatban számos oldal és fórum létezik, egy akadályt nem sikerült teljesen elhárítani: az elinduláshoz befektetendő tanulás még mindig jelentős kihívásnak számít. Sok fejlesztő küzd kezdetekben az Xcode és az Interface Builder használatával. Egyszerre kell megbirkózni az Objective-C összetett szintaktikájával, és folyamatosan fejben kell tartani, hogy melyik objektumot szabadítsuk fel, és melyiket nem szabad. Ez a könyv ennek az űrnek a kitöltésére született. Amikor az iPhone-fejlesztésről kezdtem tanulni, ugyanazon az úton mentem végig, amint a legtöbb iPhone-fejlesztő: írjunk egy "Helló, világ" alkalmazást, küzdjünk az Interface Builderrel, próbáljuk meg megérteni, rnit is csinál a kód, majd ismételjük meg az egész folyamatot. Túl sokat bajlódtam az elemvezérlő koncepciójával is, és nehezen értettem meg, rniért is kell ezt használnom, ha egyszerűen meg akarok jeleníteni egy elemet. A Windows Mobile és az Android kapcsán szerzett fejlesztői hátterem nem sokat ért, így a munkát nulláról kellett elkezdenem. Ez a könyv azért jött létre, hogy a kezdő iPhone-fejlesztők munkáját minél könynyebbé tegye. A különböző témákat úgy tárgyalja, hogy progresszíverr lehessen belőle tanulni anélkül, hogy elvesznénk a részletekben. Azt vallom, hogy a legjobban úgy tanulunk meg valamit, ha közben csináljuk, ezért van minden fejezetben számos gyakorlat, amelyek először megmutatják, hogy hogyan építsünk fel valamit, majd bemutatják, hogyan is működik a dolog.
Bevezetés Bár az iPhone-programozás hatalmas témakört ölel fel, ezzel a könyvvel az a fő célom, hogy az olvasó az alapoktól indulva megértse az SDK mögött rejlő architektúrát, és tisztán lássa, hogy a dolgok miért úgy múködnek, ahogy. Nem szeretnék azonban az iPhone-programozásról mindent bemutatni. Ám biztos vagyok benne, hogy a fejezetek elolvasása (és a gyakorlatok elvégzése) kellő tudással vértezi fel az olvasót az iPhoneprogamozás kilúvásainak a megoldásához.
Kinek szól ez a könyv? A könyv elsősorban a kezdő iPhone-fejlesztőkenk szál, akik szeremének elkezdeni az Apple iPhone SDK segítségével iPhone-alkalmazásokat fejleszteni. A legjobban akkor hasznosí~uk a tudnivalókat, ha van némi programozási gyakorlatunk, és legalább az objektumorientált programozási koncepciókat ismerjük. Ha teljesen ismeretlen számunkra az Objective-C nyelv, lehet, hogy érdemes először a D függelékhez lapozni, amely áttekintést ad erről a nyelvrőL A D függeléket emellett gyorsreferenciaként is használha~uk az egyes fejezetek olvasásakor: a gyakorlatok végrehajtásakor bármikor fellapozhatjuk a szintaxisokat. A fenti módszerekből minden bizonnyal mindenki ki tudja választani a számára legjobbat.
Mivel foglalkozik ez a könyv? A könyv alapvetően az iPhone-programozás alapjait írja le az iPhone SDK használatával, mindezt 17 fejezetben és öt függelékben.
1. fejezet. Bevezetés az iPhone programozásába Az iPhone SDK fejlesztésben.
2. fejezet. Az
különböző
első
eszközeit ismerteti, és bemutatja használatukat az iPhone-
Hello World! alkalmazás megírása
A Hello World! alkalmazás megírásához megismerkedünk az Xcode-dal és az Interface Builderrel. A fő cél az, hogy belekóstoljunk a témába, a további részleteket a különböző részekkel és komponensekkel kapcsolatban a következő fejezetekben tárgyaljuk 3. fejezet. Kivezetések,
műveletek
és
nézetvezérlők
Az iPhone-programozás alapjairól, azaz a kivezetésekről (outlet) és a múveletekről (action) szál. Megismerkedünk azzal, hogy programkód az Interface Builderben hogyan múködik együtt a kivezetések és a múveletek révén a vizuális elemekkel, és mindezek miért szerves részei minden iPhone-alkalmazásnak.
xxii
Mivel foglalkozik ez a könyv?
4. fejezet. Az elemek megismerése Megtudha~uk,
hogy a különböző elemek (View) használatával hogyan épül fel iPhonealkalmazásunk felhasználói felülete (user interface, UI). Megnézzük, hogyan manipuláljuk alkalmazásunk felhasználó felületét, illetve hogy mi az elemek belső tárolásának a módja.
5. fejezet. Bevitel a
billentyűzetről
Megtudjuk, hogyan bánjunk a virtuális billentyűzettel az iPhone-unkon, és szükség esetén hogyan rejtsük el a billentyűzetet, illetve hogyan biztosítha~uk azt, hogy az elemeket ne blokkolja a megjelenő billentyűzet. 6. fejezet. A
képernyő
forgatása
Megtudha~uk,
hogy hogyan rendezzük újra alkalmazásunk felhasználói felületét az eszköz elforgatásakor. Megismerhe~ük a különféle eseményeket, amelyek ilyenkor bekövetkeznek. Azt is megtudhatjuk, hogyan szorítható rá az alkalmazásunk egy bizonyos képernyőtájolás használatára.
7. fejezet.
Elemvezérlők
Választ kapunk arra, hogy hogyan hozhatunk létre többféle elemet használó alkalmazást. Megvizsgáljuk, hogyan építsünk iPhone-alkalmazást ablakalapú alkalmazássablonnal. 8. fejezet. Eszközsáv- és navigációs alkalmazások Ez a rész azt mutatja be, hogyan hozzunk létre eszközsáv- és a navigációs alkalmazásokat az SDK-ban található sablonokkal. Ezekkel fejlett többnézetes alkalmazásokat valósíthatunk meg. 9. fejezet. Segédprogramok Kiderül, hogyan hozhatunk létre egy újabb típusú alkalmazást az iPhone-ban: a segédprogramokat. 10. fejezet. A Tablenézet használata Felfedezhe~ük
a leghatékonyabb elemet az iPhone SDK-ban, amelyet leggyakrabban adatsorok megjelenítésére használunk. Ebben a fejezetben azt is megvizsgáljuk, hogyan alkalmazzunk keresési lehetőségeket a Table nézethez.
11. fejezet. Alkalmazásbeállítások Használatukkal megőrizhetők az alkalmazások beállításai, így az iPhone-ban és az iPhone Touchban található Settings alkalmazással hozzáférhetünk az alkalmazásunkhoz kapcsolódó beállításokhoz.
xxiii
Bevezetés 12. fejezet. Fájlkezelés Kiderül, hogyan őrizhetők meg alkalmazásunk adatai az adatok fájlokba mentésével a sandbox könyvtárában. Azt is megismerhe~ük, hogyan férhetünk hozzá a különböző mappákhoz alkalmazásunk sandboxában.
13. fejezet. Adatbázis-tárolás az SQLite3 használatával A beágyazott SQLite3-adatbáziskönyvtár használatát ismerjük meg adataink tárolására.
14. fejezet. Többérintéses alkalmazások programozása Választ kapunk arra, hogyan használhatjuk iPhone-alkalmazásunkban a többérintéses lehetőségeket, továbbá hogyan használjuk a különböző gesztusokat, például a híres "csippentés" -t (pinching).
15. fejezet. Egyszerű animációk Ez a fejezet áttekinti azokat az egyszerű technikákat, amelyekkel egyszerű animációkat használhatunk az iPhone-ban. Azt is elsajátíthatjuk, hogy mely affintranszformációkat támogaqa az iPhone SD K.
16. fejezet. A beépített alkalmazások elérése Megnézzük, milyen különb öző módokon férhetünk hozzá iPhone-unk beépített alkalmazásaihoz, például a Photo Libraryhez, a Contactshoz stb. Azt is megismerhe~ük, hogy alkalmazásainkon belül hogyan hívhatunk meg beépített alkalmazásokat, például a Mailt vagy a Safarit.
17. fejezet. Hozzáférés a hardverhez Megvizsgáljuk, hogyan férhetünk hozzá iP hone-unk hardvereihez, például a gyorsulásmérőhöz, valamint hogyan határozzuk meg földrajzi adatainkat a Core Location segitségével.
A függelék. A gyakorlatok megoldásai Az 1. fejezet kivételével a fejezetek végén található feladatok megoldását tartalmazza.
B függelék. Az Xcode használata Gyors áttekintést nyújt az XCode számos szolgáltatásáról.
C függelék. Az Interface Bullder használata Áttekinti az Interface Builder számos szolgáltatását.
D függelék. Objective-C gyorstalpaló Villámtanfolyam az O bj ective-C használatáról. A programnyelvvel most is m e rked ő k ször ezt a fejezete t olvassák el.
E függelék. Tesztelés konkrét iPhone-on vagyiPod Touchon Választ kapunk arra, hogy hogyan tesztelhetünk egy alkalmazást egy valódi eszközön.
xxiv
elő
Hogyan épül fel ez a könyv?
Hogyan épül fel ez a könyv? A könyv az iPhone-programozás elsajáútásának feladatát számos kisebb részre bon~a, így minden témakört nyugodtan végiggondolhatunk, núelőtt elmélyednénk a következő ben. Emellett van néhány fejezet, amely a korábbi fejezetekben már érintett témákat is tárgyal. Ennek az az oka, hogy az Xcode-ban és az Interface Builderben nem csak egyféleképpen hajthatjuk végre ugyanazt a technikát, így többfélét is elsajáúthatunk az iPhone-alkalmazások fejlesztéséhez. Ha teljesen kezdők vagyunk az iPhone-programozásban, ajánlatos a tanulást az 1. és 2. fejezettel kezdeni. Ha ráéreztünk a dolgok ízére, az éppen használt eszközök és nyelv alaposabb megismeréséhez lapozzunk a függelékekhez, majd továbbléphetünk a 3. fejezetre, és fokozatosan elmélyedhetünk a haladóknak szóló részekben. A könyv jellemzője az, hogy a mintaprogramkódok minden fejezetben függetlenek az előzőekben szereplőktől. Így szabadon olvashatjuk a rninket érdeklő fejezeteket, és nekiláthatunk az aktuális gyakorlatnak.
Mi szükséges a könyv használatához? A könyvben található legtöbb példa jól fut az iPhone Simulatoron (amely az iPhone SDK része). A hardverekhez (például a karnerához és a gyorsulásmérőhöz) is hozzáférő alkalmazások egy valóeli iPhone-t vagy iPhone Touchot igényelnek. Az E függelék bemuta~a, hogyan tesztelhe~ük alkalmazásunkat egy valóeli eszközön. A telefonfunkcióhoz is hozzáférő alkalmazásokhoz egy iPhone-ra lesz szükség (az iPod Touchban nincs beépített telefon). Általánosságban ahhoz, hogy a legtöbbet hozzuk ki ebből a könyvből, nem szükséges egy valóeli iPhone vagy iPod Touch (bár ezek határozottan fontosak a teszteléshez, ha azt tervezzük, hogy telepíteni szeretnénk alkalmazásunkat az AppStore-ra is).
Jelölések A könyvben való eligazodás megkönnyítésére számos jelölést alkalmazunk. Ezek végrehajtandó gyakorlatok vagy példák.
XXV
Bevezetés
Fejezetenként egy vagy több gyakorlatot találunk, amelyeket a szövegben érdemes végrehajtani.
előre
haladva
1. Általában néhány számozott lépésból állnak. 2. Kövessük végig a lépéseket saját projektfájljainkkal.
Hogyan
működik?
A begépelt programkódot minden gyakorlat után részletesen megmagyarázzuk
Figyelmeztetés Az ehhez hasonló szövegdobozok a környező szöveghez kapcsolódó, fontos, megjegyzendő információt tartalmaznak.
Megjegyzés A megjegyzések, tippek, javaslatok, trükkök és az aktuális témától kicsit eltérő információk így néznek ki.
A szövegben található egyéb jelölések első előfordulásukkor dőlt betűvel
•
Az új kifejezések és fontos szavak emelve.
•
A
•
A fájlnevek, az URL-ek és a programkód a szövegben a pelnek: persistence.properties.
•
A programkód kétféleképpen szerepelhet:
billentyűkombinációk
a
következőképpen
vannak ki-
néznek ki: Control-R. következőképpen
szere-
Kiemelés nélküli monofont betűtípust használunk a legtöbb példakódban. Félkövérrel emeljük ki azokat a kódrészleteket, amelyek a tárgyalt témához szerosan kapcsolódnak.
Forráskód Ahogy a könyvben haladva sorra végrehajtjuk a gyakorlatokat, megválasztha~uk, hogy minden programkódot manuálisan begépelünk, vagy a könyvhöz kapott forráskódfájlokat használjuk. A könyvben használt valamennyi forráskód letölthető a WN-N. wrox. com címróL A forráskódok között egyszerűen keressük meg a könyv címét (a Keresés [Search] doboz
xxvi
Hibajegyzék
vagy az egyik címlista használatával), majd a könyvhöz tartozó valamennyi forráskód eléréséhez a könyv részletei oldalon kattintsunk a Download Code (forráskód letöltése) hivatkozásra. A weboldalon is megtalálható forráskódokat a következő ikon jelzi: A listák a fájlnevet a címben tartalma~ák. Ha csak egy kódrisifetrríl van szó, a fájlnevet egy o!Jan fomískódmegjegyzésben találjuk meg, mint például ez
Megjegyzés Mivel számos könyvnek van hasonló címe, talán egyszerűbb a keresést az ISBN szám alapján végrehajtani : a könyv ISBN száma 978-0-47050097-2.
Letöltés után tömörítsük ki a programkódot. Azt is megtehetjük, hogy ehhez a könyvhöz és más könyvekhez letölthető programkódokért a fő Wrox programkód-letöltési oldalra megyünk a www.wrox.com/dynamic/books/download.aspx címen.
Hibajegyzék Mindent megtettünk, hogy a szöveg és a programkóclak hibátlanak legyenek. Ugyanakkor senki sem tökéletes. Ha bármelyik könyvünkben hibát talál az olvasó (például helyesírási hibát vagy egy hibás programkóddarabot), hálásak volnánk a visszajelzésért. A hibajegyzék beküldésével a többi olvasót akár többórányi frusztrációtól is megmenthetjük, illetve hozzájárulhatunk a még magasabb színvonalú ínformációk közléséhez. A könyv hibajegyzékéhez a www.wrox.com oldalon a Search dobozzal jutunk, vagy az egyik címlistában keressük meg a könyv címét. Majd a könyv részleteit tartalmazó oldalon kattintsunk a Book Errata hivatkozásra. Itt megnézhetjük a könyvhöz beérkezett és a Wrox szerkesztői által beküldött összes hibát. Az összes könyv hibalistájához tartozó hivatkozásokat is tartalmazó teljes könyvlista ugyancsak elérhető a www. wrox. com/mi scpages/bookl i st. shtml címen. Ha egy hibát nem találunk a könyv hibajegyzékében, ezt www .wrox .com/contact/techsupport. shtml oldalon található fulap kitöltésével jelezhetjük. Ezután a jelzést ellenőriz ve, ha a hiba valósnak bizonyul, egy bejegyzés kerül a könyv hibajegyzék oldalára, és egyúttal a hibát a könyv további kiadásaiban is javítjuk.
xxvii
Bevezetés
p 2 p. wrox.com A szerzőkkel és a többi olvasóval a p 2 p. wro x. com címen elérhető P2P fórumokon lehet kapcsolatba lépni. Ezek a fórumok egy webalapú rendszer részei, amellyel a Wrox könyveivel és technológiáival kapcsolatos üzeneteket tehetünk közzé, illetve értekezhetünk más olvasókkal vagy a technológia többi használójával. A fórumokon e-mail címünkkel fel is iratkozhatunk a minket érdeklő témákra. Így értesítést kapunk, ha új hozzászólás érkezik az adott témához. A Wrox szerzői, szerkesztői, a téma egyéb szakértői és az olvasók egyaránt jelen vannak ezek a fórumokon. A http: 1/p 2 p. wrox . com címen számos különböző fórum található, amelyek segítenek az olvasónak nemcsak ennek a könyvnek a feldolgozásában, hanem saját alkalmazásai fejlesztésében is. A csatlakozáshoz az alábbiakat kell tenni: 1. A
p2p. wrox. com
címen kattintsunk a Register (regisztráció) hivatkozásra.
2. A felhasználási feltételek elolvasása utána kattintsunk az Agree (elfogadás) feliratra. 3. Ha kitöltöttük a csatlakozáshoz a kötelező, illetve az opcionálisan megadható információkat, kattintsunk a Submit (beküldés) feliratra. 4. Fiókunk megerősítéséhez és a csatlakozás folyamatának befejezéséhez e-mailben kapjuk meg a tudnivalókat.
Megjegyzés A fórumokra küldött üzeneteket a P2P-hez csatlakozás nélkül is elolvashatjuk, ám saját üzenetet küldeni csak csatlakozás után tudunk.
A fórumhoz csatlakozva tehát üzeneteket tehetünk közzé, és a másokéira is reagálhatunk. Az üzeneteket az interneten bármikor elolvashatjuk. Ha egy adott fórumról szetetnénk az üzeneteket e-mailen is megkapni, kattintsunk a fórumlistában a fórum címe mellett a Subscribe to this Forum ikonra. A Wrox P2P használatával kapcsolatos bővebb információért, a fórum szaftverének működéséről szóló kérdésekért és válaszokért, valamint kifejezetten a P2P-ről és a Wrox könyveiről szóló számos egyéb gyakori kérdésért olvassuk el a P2P gyakran idézett kérdéseit (FAQ). A gyakran idézett kérdések bármelyik P2P oldal FAQ-hivatkozására kattintva elérhetők.
xxviii
~~~:~:. ,-~~ ......
·...;:
·
RÉSZ
Bevezetés 1. Bevezetés az iPhone programozásába ................... 3 2. Az
első
Hello World! alkalmazás megírása .......... 23
3. Kivezetések,
műveletek
és
nézetvezérlők
............ 41
4. Az elemek megismerése ....................................... 75 5. Bevitel a 6. A
billentyűzetről.. ..................................... 119
képernyő
forgatása .......................................... 145
Bevezetés az iPhone programozásába A FEJEZET FŐBB RÉSZEl A KÖVETKEZŐK: •
Hogyan szerezhetjük be az iPhone SDK-t?
•
Milyen komponenseket tartalmaz az iPhone SDK?
•
Milyen funkciókkal rendelkeznek a Builder, az iPhone Simulator?
•
Mire képes az iPhone Simulator?
•
Hogyan épül fel az iPhone OS?
•
Milyen keretrendszerei vannak az iPhone SDK-nak?
•
Mik az iPhone jellegzetességei és korlátai?
fejlesztőeszközök:
az Xcode, az Interface
Ismerkedjünk meg az iPhone-programozás világával. Az, hogy kézbe vettük ezt a könyvet, egyben azt jelenti, hogy érdekel bennünket az iPhone-alkalmazások fejlesztése, és csadakozni szeretnénk ahhoz a több tízezer fejlesztőhöz, akiknek az alkalmazásai már megtalálhatók az AppStore-ban. A régi kínai mondás úgy tar~a : "a feladatod elvégzéséhez először fend meg a szerszámaidat". A sikeres programozáshoz először is a felhasznált eszközöket kell megismernünk. Ez az iPhone-alkalmazások programozására különösen igaz - jó pár eszközt meg kell tapasztalnunk ahhoz, hogy egyáltalán elkezdhessük. Így ennek a fejezetnek az a célja, hogy bemutassa azokat a különböző eszközöket, amelyekre a fejlesztéshez szükségünk van.
1. fejezet: Bevezetés az iPhone programozásába
Az iPhone SOK beszerzése Ahhoz, hogy iPhone-ra vagy iPod Touchra fejleszthessünk, először regisztrált iPhone-fejlesztónek kell jelentkezünk a ht tp: l l de ve l ope r. ap pl e. com/i phone/ program/start/ reg i st e r 1 webhelyen. A regisztráció ingyenes, és hozzáférést biztosít az iPhone SDK-hoz, valamint a kezdéshez szükséges más hasznos eszközökhöz. A regisztráció után letölthetjük az iPhone SDK-t (lásd az 1.1. ábrát).
- Libraryra [eszközök )>- könyvtár]). A 3.9. ábra a Library ablak különbözó, a View ablakban használható elemeit mutatja.
48
A kód és a felhasználói felület
együttműködésének
az alapjai
3.8. ábra
View Controller U1Vte....Contr(... fer Ubro~~
PrOYldu view - ma~gemer.t funct,onllitty for too rbars. naveg.n 011 bars, and ~pl,catson v.ews. The UIVinvC:ornroller cl Attributes Inspector [eszközök )i;> attribútum-ellenőr]). Az 5.3. ábrán az Attribates Inspector ablakot láthatjuk a TextField nézetben. Elsősorban a Text Input Traits (szöveges bevitel jellemzői) nevú szakaszra figyelünk. A Text Input Traits szakasz néhány olyan elemet tartalmaz, amellyel beállithatjuk, hogy a billentyúzet hogyan kezdje a begépelt szöveget.
Cle.ar Button N~ver appears ==~---.:..:.J r"' Cle;or When Ed otong B~•ns font
Helvetocól. 12.0
Font Size Text Input
Adjust To Fit
17
T~lts
Cap . t.tli~e
•
•
•
A Capitalize elem nagybetűsre változtatja a szavakat, a mondatokat vagy a billentyűzettel bevitt összes karaktert. A Correction elemmel beállithatjuk, hogy a billentyűzetünk javaslatokat tegyen-e azokra a szavakra, amelyeket nem írunk helyesen. Választhatjuk még a Default opciót, amely alapértelmezetté teszi a felhasználónak a teljes szövegkorrekciós beállítást.
COfrectoon Keymrd
De =='a::u::lt=====~IT)~
AppeMance
'-'
RNurn Key
,..,.?e;;.;...'a:.:u:.:lt....;._ _ _ _;:..0J
lJ Auto · e"ab'e Rnurn Key G ~cure Co
troC
Content
5.3. ábra
A Keyboard elemnél a különböző típusú lönböző típusú adatbevitelekhez.
billentyűzetek
közül választhatunk a kü-
Az 5.4. ábra (balról jobbra) a Keyboard elemhez konfigurált billentyűzettípusokat mutatja: Email Address (e-mail cím), Phone Pad (tárcsázógombok) és Number Pad (számbillentyűk).
122
A beviteli
lehetősége k
személyre szabása
5.4. ábra
•
Az Appearance elemmel kiválaszthatjuk, hogyan jelenjen meg a billentyűzet.
Az. 5.5. ábra a D efault (felül) és az Alert (alul)
billentyűzetet muta~a.
Te_xt Inp-ut
Tr~its
Cap;tahze
__
Col"ftcltOn
- Oif®lt
Ke~rd
.... 1
l;
Def.ault
!
A,p.pearat1ce
fte:turn Key l
Default ·
•
~
~
Co
COO Add Files (fájl )> fájl hozzáadása) menüpontot. Válasszuk az urviewcontroller alosztályelemet, majd kattintsunk a Next gombra. A fájl neve legyen: oe ta i l svi ewcontro ll er. m (ne jelöljük be a "Wi th Xib for user interface" lehetőséget, mert a következő lépésben manuálisan adjuk hozzá). 2. Kattintsunk jobb gombbal a Resources mappára, és válasszuk az Add )> New File menüpontot. Válasszuk a View XIB elemet, és kattintsunk a Next gombra. A XIB fájlt nevezzük el a következőképpen: oetai l svi ew. xi b. 3. Kattintsunk kétszer a oetail svi ew. xi b fájira ahhoz, hogy az Interface Builderrel szerkesszük. Adjuk hozzá a View ablakhoz a Label nézetet Qásd a 8.23. ábrát).
207
8. fejezet: Eszközsáv- és navigációs alkalmazások
Oetatl.sV1ew,xib
Label File's Ov.-ner
F1rn Rtsponder
I!IZJ
8.23. ábra
4. Adjuk hozzá az alábbi félkövérrel szedett sorokat a oetailsviewcontroller.h fájlhoz az Xcode-ban: #import @interface Detailsviewcontroller IBOutlet Ullabel *label; NSString *textselected;
UIViewcontroller {
@property (nonatomic, retain) Ullabel *label; @property (nonatomic, retain) NSString *textselected; -(id) initWithTextselected:(NSString *) text; @end
5. Az Interface Buliderben a Detai l svi ew. xi b ablakban Class tulajdonságát állitsuk a
következőre:
lévő
File's Owner elem
De ta i l svi ewcont ro ll e r.
6. A Control billentyű nyomva tartásával húzzuk a File's Owner elemet a Label nézetre, majd válasszuk a l abe l. lehetőséget. Ezzel összekötjük a Label nézetet a l abe l kivezetés se!.
208
Navigációalapú alkalmazások 7. A Control billentyű n yomva tartásával húzzuk a File's Owner elemet a View nézetre, majd válasszuk a view lehetőséget. Ezzel összekapcsoljuk a nézetet a nézetvezérlővel:
8. Adjuk hozzá az alábbi félkövérrel szedett kódot a oe ta i l sviewcontroll er .m fáj !hoz: #import "Detailsvi ewcontroller.h " @implementation Detailsviewcontroller @synthesize label; @synthesize textselected; -(id) initWithTextselected:(NSString *) text { self.textselected = text; [label setText:[self textselected]]; return self;
- (voi d)viewoidLoad { [label setText:[self textselected]]; self.title = @"Movie Details"; [super viewoidLoad];
- (void)dealloc { [label release]; [textselected release]; [super dealloc];
9. Adjuk hozzá az alábbi félkövérrel szedett kódot a Rootviewcontroller.h fájlhoz: #impo rt "DetailsviewController.h" @interface RootViewcontroller : UITableviewcontroller { oetailsviewcontroller *detailsviewcontroller;
@property (nonatomic, retain) Detailsviewcontroller *detailsviewcontroller; @end 10. Adjuk hozzá az alábbi félkövérrel szedett kódot a Rootviewcontroller. m fájlhoz: #import "RootViewcontroller.h" @implementation Rootviewcontroller NSMutableArray *listOfMovies; @synthesize detailsviewcontroller;
209
8. fejezet: Eszközsáv· és navigációs alkalmazások
11. Módosítsuk a t ablevi ew: di dse l ectRowAtrndexPath: metódust a félkövérrel szedett programkód alapján:
ll override to support row selection in the tabl e vi ew . - (void)tableview :(UITableview *)tablevi ew didselectRowAtindexPath: (NSindexPat h *) indexPath { NSUinteger row = [indexPath row]; NSStri ng *rowvalue = [listOfMovies objectAtindex :row]; NSStri ng *message = [[NSStri ng alloc] initwithFormat: @"You have selected \ "%@\ "", rowvalue] ; //---create an instance of the oetailsviewcontroller--if (self.detailsviewcontroller == nil) oetailsviewcontroller *d
[[Detailsviewcontroller alloc] initWithNibName:@"DetailsView" bundle:[NSBundle mainBundle]]; self.detailsviewcontroller = d; [d release]; =
}
//---set the movies selected in the method of the ll oetailsviewcontroller---// [self.detailsviewcontroller initwithTextselected:message]; //---Navigate to the details view--[self . navigationcontroller pushviewcontroller : self.detailsviewcontroller animated:YES];
12. Nyom juk meg a Command-R gombokat, hogy az alkalmazást az iPhone Simulatoron teszteljük. Nézzük m eg, mi történik, ha m egérintünk egy elem et (lásd a 8.24. ábrát).
Hogyan
működik?
Az előző példában hozzáadtunk egy új XIB fáj lt és egy megfelelő View Contro ller osztályt a projekthez. Ezt az új View ablakot használjuk arra, hogy megjelenítsük a Table nézetet tartalmazó nézetben megérintett ftlm címét. Ahhoz, hogy ez az ablak át tudja adni a kiválasztott film címét a részleteket tartalmazó View ablaknak, létre kell hoznunk ezen egy tulajdonságot, méghozzá a textselected-et:
@property (nonatomic , retain) NSString *textSelected; Egyúttal létre kell hoznunk egy i ni twi thTextse l e ct ed: nevű metódust is, hogy a kezdeményező nézet beállíthassa a textselect ed tulaj donság értékét:
210
Navigációalapú alkalmazások
-(id) initWithTextselected:(NSString *) text { self.textselected = text; [label setText:[self textselected]]; return self;
Tralning Day Remember the Titans
Vou have seiccted "The Bone Collector"'
John Q.
Ricoehet The Siege Malcolm X Antwone Fisher Courage Under Fire
8.24. ábra
Arra, hogy a Table nézetet tartalmazó nézetból eljussunk a részletesbe, a tableview: did se l ectRowAtrndexPath: metóduson belülj UINavi gat i oneont ro ll er objektum pushviewcont ro ll e r: metódusát használjuk: //---create an instance of the Detailsviewcontroller--if (self.detailsviewcontroller == nil) { Detailsviewcontroller *d = [[Detailsviewcontroller alloc] initWithNibName:@"Detailsview" bundle:[NSBundle mainBundleJ J; self.detailsviewcontroller = d; [d re l eas e] ;
//---set the movies selected in the method of the ll Detailsviewcontroller---// [self.detailsviewcontroller initWithTextselected:message];
211
8. fejezet: Eszközsáv- és navigációs alkalmazások
//---Navigate to the details view--[self.navigationcontroller pushviewcontroller:self.detailsviewcontroller animated:YES];
Hiányzó vissza gomb Korábban a Rootviewcontroller.m fájlban állitottuk be a navigációs elemcíméta következőképpen:
- (void)viewoidLoad { //---initialize the array--listofMovies; [[NSMutableArray alloc] init]; //---add items--[listofMovies addobject:@"Training oay"]; ll ... //---set the title of the navigation bar--self.navigationitem.title; @"Movies"; [super viewDidLoad]; }
agyon gyakori hiba, hogy a fejleszték elfelejcik beállitani ezt a címet. Mi történik ekkor? A:z. eredmény a 8.25. ábrán látható. A gyökérnézetnek nincs címe, a részletes nézeten pedig nincs olyan gomb, amely visszavinne az előző nézetre. Ha azonban megérintjük azt a területet, ahol a vissza gombnak kellene lennie, még így is visszakerülünk az előző nézetre.
Training Day Remember the Titan
You have setectcd "The Bone CollectOf"'
8.25. ábra
ÖSSZEFOGLALÁS Ebben a fejezetben megismertünk két olyan fő iPhone-alkalmazástípust, amelyet az SDK támogat: az eszközsáv-alkalmazásokat és a navigációalapú alkalmazásokat. Megvizsgáltuk, hogy ez a két alkalmazástípus hogyan múködik, így képesek leszünk olyan többnézetes alkalmazásokat fejleszteni, amelyek ugyanúgy néznek ki, mint az iPhoneunkon megszakottak
212
Navigációalapú alkalmazások
1. Készítsünk egy eszközsáv-alkalmazást két eszközsávelemmel. Ha a felhasználó meg-
érinti a másoclik eszközsávelemet, meg kell jelennie a filmek listájának
A FEJEZET TUDNIVALÓI Téma
Alapelvek
Eszközsáv-alkalmazások létrehozása
UITabBarcontro ll er használata a megszakott urvi ewcont ro ll e r helyett.
Annak meghatározása, mely nézet töltődik be először egy eszközsáv-alkalmazásban
A:z. UITabBarcontro ll er példányban felsorolt rendjének módosítása.
Eszközsávelemek hozzáadása egy eszközsáv-alkalmazáshoz
Miután az elem hozzáadódott az eszközsávhoz, ne felejtsük el átállítani a NIB Name tulajdonságát a projekt egyik XIB fáj lj ára. A Class tulajdonságát is át kell álliranunk egy View Controller osztályra.
A tájolásváltoztatás támogatása az esz közsáv-alkalmazásokban
Biztosítani kell, hogy az összes nézetvezérlő megvalósítsa a shoul dAutorotateTointerfaceori entati on: metódust.
avigálás másik nézetvezérlőre egy navigációalapú alkalmazásban
[self.navigationcontroller pushviewcontroller:self.detailsviewcontroller animated:YES];
nézetvezérlők
sor-
213
Segédprogramok A FEJEZET FŐBB RÉSZEl A KÖVETKEZŐK: •
Hogyan fejlesszünk segédprogramot (Utility Application) az SDK által kínált sablonnal?
•
Hogyan váltsunk nézetet a segédprogramokban?
•
Hogyan alkalmazzunk
•
Hogyan adjunk további nézeteket a segédprogramhoz?
különböző
átmeneteket a nézetek váltásakor?
Az előző két fejezet jó néhány olyan alkalmazásúpust bemutatott, amelyeket iPhone SDK segítségévellétre tudunk hozni: nézetalapú alkalmazások, navigációalapú alkalmazások és eszközsáv-alkalmazások. Az iPhone-nal összefüggésben igen elterjed alkalmazásúpusok még a segédprogramok (Utility Applications), amelyek egyszerű feladatokat hajtanak végre minimális felhasználói adatbevitelleL Az iPhone eszközön megtalálható Weather és Stocks alkalmazás például két ilyen segédprogram. A 9.1 ábra a Weather alkalmazást muta~a egy adott város időjárásának megjelenítésekor. Amikor megérin~ük a jobb alsó sarokban levő kis i ikont, a képernyő megváltozik A nézetek váltása az egyik gyakori jellemzője a segédprogramoknak Az Apple felhasználói felület iPhone-alkalmazásokra vonatkozó irányelvei szerint a segédprogramok "egyszerű feladatokat hajtanak végre minimális felhasználói adatbevitellel". Ezért egy olyan alkalmazás fejlesztésekor, amelynek információjához a felhasználó gyorsan hozzáfér, a segédprogram lenne az ideális keretrendszer. Ilyenek például: •
valutaegység-váltó,
•
ménékegység-átváltó,
•
RSS-olvasó.
9. fejezet: Segédprogramok .diSGP
4 23 A !o~
"'
+
Weather
~ Singapore
00 Done
["'
= = = = =
" --
Beljlng Vietnam, San Juan
-
Shanghal Callfomla City
-
Talpel City
~ ~
:Klwttt1tlv
YAB001 ....atl\o•(-
9.1. ábra
A következőkben megismerjük, hogyan hozhatunk létre segédprogramot az iPhone SDK sablon segítségéveL
Segédprogramok készitése Az iPhone SDK rendelkezik segédprogramok készítéséhez alkalmas sablonnal. A sablon használatával minden szükséges kód készen áll a nézetváltáshoz. Amikor egy egyszerű segédprogramot hozunk létre, csak az alkalmazásunk logikájára kell koncentrálnunk. Ha egy összetettebb segédprogramot készítünk, az előre megírt kód jó alap lehet az alkalmazás kiterjesztéséhez. Először készítsünk SD K sablonnal segédprogramot, és nézzük meg a következő gyakorlati részben, hogyan működik. Segédprogram létrehozása
A programkód [UtilityApplication.ifp] a Wrox.com oldalról toltheló le.
1. Hozzunk létre egy új segédprogram- (Utility Application) projektet az Xcode se-
gítségéve!, és nevezzük el uti l i t yApp l i cati on-nek. 2. Vizsgáljuk meg a projekt tartalmát (lásd a 9.2. ábrát) . Alapvetően két nézettel kell
foglalkoznunk: Mainview. xi b és Fl i ps idevi ew. xi b. A Mainview. xi b a fő nézet, amelyet a felhasználók az alkalmazás betöltésekor látnak. Egy kis i ikont tartalmaz, amely ha rákattintunk, egy másik nézetre, a Fl i ps idevi ew . xi b-re vált. Min216
Segédprogramok készítése
den .xib fájl két fájlt reprezentál: egyik a nézetért, másik a nézetvezérlőért felelős. A Mainview.xib fájl tehát együtt jár a Mainview.h és a Mainview.m, valamint a Mainviewcontroller.h és a Mainviewcontroller.m fájlokkal. r; Matchl~ ~~ch
•
""' Codt ~
A
•""
"'
~~ Mu'IV•-twh ~
~Mltn~.m ~
•
MutV.ewC:ontrol&er.h ~
!"ll M.l.lnVtcwConuol~r-m
~
" ~
rlip~tdeV1~
~
,;1 HlPSKit:Vitw h
~
""
1111 fllpSfdtVI~W.m
~ fltpst.CkV.e9o(;onttotltr.h ~
111l RipSidtVitwControkr.m Applt
Other Sources
Y
Resources
l:j
Courage Under Fire
apple Jpeg
J TableViewExampleVie
.ciJ MamWindow.xib lf) Tabi- Other Sourcu Resources Frameworks
Products
Erron and Warn1ngs T
Q. Find Resulu
~L:!l Bookmvks
e
SCM
ProJect Symbob ~. Implementallon F1les . . . Nil Files
• Pre.fe.re.nce.Spedflers • tum l
Array Dlcttonary
TYJI
Cluses l> Other Sources
15.9. ábra
4.
yomjunk meg a Command-R gombokat, hogy a képsorozatot az iPhone Simulatorban tesztelj ük. A képeket az ImageView egyesével jeleníti meg (lásd a 15.1 0. ábrát).
Hogyan Inűködik? Először
egy NSArray objektumot hozunk létre, majd ezt néhány urrmage objektummal
inicializáljuk: NSArray *images
362
[NSArray arraywithobjects: [U !Image imageNamed :@"MacSE. jpeg"], [UIImage imageNamed:@"imac.jpeg"], [UIImage imageNamed:@"MacPlus.jpg"],
Képsorozat animálása
[UIImage imageNamed:@"imac_old.jpeg"], [UIImage imageNamed:@"Mac8100.jpeg"], ni l] ; Ezután létrehozzuk a UIImagevi ew objektumot: CGRect frame= CGRectMake(0,0,320,460); urimageview *imageview = [[UIImageview alloc] initWithFrame:frame]; Az ImageView a képsorozat megjelenítéséhez an-
nak animationimages tulajdonságát állítja az images objekturnra. Emellett itt az ImageView megjelerutési módját is megszabj uk: imageview.animationrmages = images; imageview.contentMode = urviewcontentModescaleAspectFit; A képek megjelerútésének gyorsaságát az animationouration tulajdonság egy értékhez rendelésével szabhatjuk meg. Ez az érték azt az időtarta mor fejezi ki másodpercekben, amely a sorozat teljes lejátszásához szükséges az ImageView-ban. Az animáció lejátszásának számát az animationRepeatcount tulajdonság határozza meg. Nullára akkor állítsuk, ha a végtelenségig akarjuk játszani:
15.10. ábra
imageview.animationouration = 3;
11---seconds to complete one set ll of animation--imageview.animationRepeatcount = O; 11---continuous--~ Az animáció megkezdéséért a startAnimating metódus felel. Az ImageView-t is a nézethez kell adnunk; ezt az addsubview: metódussal tesszük meg: [imageview startAnimating]; [self.view addsubview:imageview];
ÖSSZEFOGLALÓ Ebben a fejezetben megvizsgáltuk, hogyan lehet az NSTimer osztállyai egyszerű animációkat végezni. Emellett szó volt az iPhone SDK által támogatott különböző affintranszformációkról is. Végül pedig arról, hogy hogyan lehet az ImageView segítségével rendszeres időközű képek sorozatát vetíteni.
363
15. fejezet:
Egyszerű
animációk
@IMI 1. Nevezzük meg az iPhone SDK által támogatott h árom affintranszformációt. 2. Hogyan állitunk meg egy NSTimer o bjektumot, majd indítjuk el újra?
3. Mire használjuk a kódblokknak a urvi ew osztály begi nAni ma ti ons és commi tAní ma ti ons metódusaival való közrezárását? [urview beginAnimations:@"some_text" context:nil]; // ---code to effect visual change--[UIView commitAnimations];
A FEJEZET TUDNIVALÓI Tárgy
Kulcsfogalmak
Az NSTi me r objekrum használata idózítók létrehozására
Az időzíróobjektum minden másodpercben kétszer aktiválja az onTime r metódust:
Timer= [NSTimer scheduledTimerWithTimeinterval :0.5 target:self selector:@selector(onTimer) userinfo:nil repeats:YES]; Az NSTimer objekrummegállítása
[timer invalidate];
Vizuális változtatások animálása
[UIVi ew begi nAni ma ti ons: @"some_text" context: ni l J ; //--- code to effect visual change--[urview commitAnimations];
Affintranszformációk végzése
Használjuk a nézet transform tulajdonságát.
Eltolás
A CGAffi neTransformMakeTransl a ti on O függvénytól visszakapjuk a CGAffi neTransform adatstruktúrát, és abban beállitjuk a transform tulajdonságot.
Forgatás
A CGAffi neTransformMakeTransl a ti on O függvénytól visszakapjuk a CGAffi neTransform adatstruktúrát, és abban beállitjuk a transform tulajdonságot.
Átmérerezés
A CGAffineTransformMakeTranslationO függvénytól visszakapjuk a CGAffi neTransform adatstruktúrát, és abban beállitjuk a transform tulajdonságot.
Képsorozat animálása az ImageView-val
Állitsuk az ani ma ti on Images tulajdonságot egy U!Image objektumokat tartalmazó tömbre. Állitsuk be az animationouration tulajdonságot. Állitsuk be az ani ma ti onRepeatcount tulajdonságot. Hívjuk meg a startAnimating metódust.
364
A beépitett alkalmazások elérése A FEJEZET FŐBB RÉSZEl A KÖVETKEZŐK: •
Hogyan küldhetünk e-mailt az alkalmazásunkon belülről?
•
Hogyan
•
Hogyan hívhatjuk meg a Phone-t az alkalmazásunkon
•
Hogyan küldhetünk SMS-t az alkalmazásunkon
•
Hogyan férhetünk hozzá a karnerához és a Photo Libraryhez?
•
Hogyan férhetünk hozzá a Contacts alkalmazáshoz?
•
Hogyan adhatunk hozzá vagy távolíthatunk el névjegyeket a Contacts alkalmazásból?
hívha~uk
meg a Safarit az alkalmazásunkon
belülről? belülről?
belülről?
Az iPhone számos gyári alkalmazással kerül piacra, többek között ez teszi minden idők egyik legnépszerűbb mobilkészülékévé. Ezek között az alkalmazások között van a Contacts, a Maii, a Phone, a Safari, az SMS és a Calendar. Ezek az alkalmazások elvégzik a legtöbb olyan műveletet, amelyet egy mobiltelefontól elvárunk. iPhone-fejlesztőként persze megtehe~ük, hogy prograrnozottan, az iPhone SDK által tartalmazott API-k (Application Programming lnterfaces - alkalmazásprogramozói felületek) segítségével az általunk készitett alkalmazásokból hívjuk meg ezeket az alkalmazásokat. Ez a fejezet azt mutatja meg, hogyan hívhatjuk meg a gyári alkalmazásokat, és hogyan léphetünk ezekkel interakcióba a saját alkalmazásunkbóL
16. fejezet: A beépített alkalmazások elérése
E-mailek küldése E-mailt rninden iPhone-használó szokott küldeni. Ezt a feladatot látja el a beépített Mail alkalmazás. Ez egy gazdag HTML-kliens, amely támogatja a POP3-at, az IMAP-t, az Exchange email rendszereket és a legtöbb webalapú e-mail programot, például a Yahool-t és a Gmailt. Ugyanakkor előfordul, hogy az alkalmazáson belülről szeretnénk elektronikus levelet küldeni. Erre jó példa az, arnikor visszacsatolás gombot ágyazunk be az alkalmazásainkba, hogy a felhasználók egyenesen visszaküldhessék a véleményüket. Az e-mailek küldésének két programozott lehetősége van: •
Felépíthetjük saját e-mail kliensünket az e-mail szerverekkel való kommunikációhoz szükséges protokollokkal.
•
Meghívha~uk
a gyári Mail alkalmazást, és azzal küldethetjük el a levelet.
Ha nem vagyunk járatosak a hálózati kommunikáció és a protokollok világában, jobb, ha a másoclik lehetőséget választjuk, és a Mail alkalmazással végeztetjük el a munkát. A következő gyakorlati rész ezt a lehetőséget mutatja be. (Ehhez le kell töltenünk a kijelölt programkódfájlokat.) E-mailek küldése a Maii alkalmazással A [VCExamplqjp} programkód a 1Vrox.com oldalról toJtheló le.
1. Hozzunk létre egy új, nézeralapú alkalmazás- (View-based Application) projektet az Xcode segítségéve!, és nevezzük elEmai ls-nak. 2. Ahhoz, hogy az Interface Builderrel szerkesszük, kattintsunk kétszer a Emai 1viewcontroll er . xi b fájlra. 3. A
következő
•
Label
•
TextField
•
Button
4. Szúrjuk be a fájlba:
366
elemekkel töltsük fel a View ablakot (lásd a 16.1. ábrát):
következő
félkövéren szedett utasítást az Email svi ewcontro ll er. h
E-mailek küldése
#import @i nterface Emailsviewcontroller : UIViewcontroller { IBOutlet UITextField *to; IBOutlet UITextField *subject; IBOutlet UITextField *body; }
@property (nonatomic, retain) UITextField *to; @property (nonatomic, retain) UITextField *subject; @property (nonatomic, retain) UITextField *body; -(IBAction) btnsend: (id) sender; @end
5. Visszatérve az Interface Builderbe, Control-kattintással húzzuk a File's Owner elemet a három TextField elem rnindegyikéhez, majd egyenként válasszuk a to, a subject és a body elemeket.
6.
Body:
Send
Control-kattintással húzzuk a Button elemet a File's Owner elemre, és válasszuk a btnsend : -et.
7. Szúrjuk be a következő félkövéren szedett utasítást az Email svi ewcontro ll er. m fájlba: #import "Emailsviewcontroller.h" @implementation Emailsviewcontroller @synthesize to, subject, body; 16.1. ábra
- (void) sendEmailTo:(NSString * ) tostr withsubject: (NSString *) subjectstr withBody: (NSString *) bodystr { NSString *emailstring = [[NSString alloc] initWithFormat:@"mailto:?to=%@&subject=%@&body=%@", [toStr stringByAddingPercentEscapesusingEncoding:NSASCIIStringEncoding], [subjectstr stringByAddingPercentEscapesusingEncoding:NSASCIIStringEncoding], [bodyStr stringByAddingPercentEscapesusingEncoding:NSASCIIStringEncoding]];
367
16. fejezet: A beépített alkalmazások elérése
[[UIAppl i cati on s haredApplication] openURL : [NSURL URLWithString:emailString]]; [emai lst ri ng release]; }
-(IBAction) btnsend: (id) sender{ [self sendEmai lTo:to .text withsubject:subject.text withBody:body.text]; }
- (voi d) deal l oc { [to release]; [subj ect release]; [body release]; [s upe r deall oc];
8. Nyomjuk meg a Command-R gombokat, hogy teszteljük az alkalmazást. A 16.2. ábra működés közben muta* be az alkalmazásunkat. Miután a szükséges információkkal feltöltöttük a TextField elemeket, a Mail alkalmazás meghívásához nyomjuk meg a Send (küldés) gombot, és az alkalmazásunkba is begépelt információkkal töltsük föl. Ha a Mailen belül nyomjuk meg a Send gombot, elküldjük a levelet.
Megjegyzés Ez a példa csak valódi készüléken működik, az iPhone Simulatorban nem tudjuk tesztelni. Az E függelék bemutatja, hogyan készítsük fel i Phone telefonunkat a tesztelésre.
Cc/Bec F· Subjec
n
'"' ~..,.. Existing Frameworks leheLoad Contacis
tőséget.
3. Válasszuk a Frameworks/ AddressBook. framewerk-öt és a Frameworks/AddressBookur. framewor k-öt. Ha megjelenik az a kérdés, hogy hozzá akarjuk-e adni a projekthez, nyomjuk meg az Add (hozzáadás) gombot. 4. Ahhoz, hogy az Interface Builderben szerkesszük, kattintsunk duplán az AddressBookvi ewcontro ll er. xi b fáj lra. 5. A View ablakot töltsük fel a Button elemmel (lásd a 16.8. ábrát) .
6. A
köverkező,
félkövérrel szedett uta-
sításokat szúrjuk be az AddressBook-
16.8. ábra
vi ewcontroller. h fájlba: #import #import #import @i nterface AddressBookviewcontroller : urviewcontroller {
-(IBAction) btnclicked: (id) sender; @e nd 7. Visszatérve az Interface Builderbe, Control-kattintással húzzuk a Button elemet a File's Owner elemre, és válasszuk a btn cl i cked:-et
8. A
következő,
félkövérrel szedett utasításokat szúrj uk be az AddressBookvi ewcont-
ro ll e r . m fájlba: #import "AddressBookvi ewcontroll er. h" @i mplementation AddressBookviewcontroller -(IBAction) btnclicked: (id) sender{ ABPeoplePickerNavigationcontroller *picker = [[ABPeoplePickerNavigationcontroller alloc] init] ; picker . peoplePickerDelegate = self; //---display the People Picker---
382
A Contacts alkalmazás elérése [self presentModalviewcontroller:picker animated:YES]; [picker release]; }
- (void)peoplePickerNavigationcontrolleroidcancel: (ABPeoplePickerNavigationController *)peoplePicker { //---hide the People Picker--[self dismissModalviewcontrollerAnimated:YES]; }
- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationcontroller *)peoplePicker shouldcontinueAfterselectingPerson:(ABRecordRef)person { //---get the First Name--NSString *str = (NSString *)ABRecordcopyvalue(person, kABPersonFirstNameProperty); str = [str stringByAppendingString:@"\n"]; //---get the Last Name--str = [str stringByAppendingstring:(NSString *)ABRecordcopyvalue( person, kABPersonLastNameProperty)]; str = [str stringByAppendingstring:@"\n"]; //---get the Emails--ABMultivalueRef emailinfo ABRecordCopyvalue(person, kABPersonEmailProperty); //---iterate through the emails--for (NSUinteger i=O; i< ABMultivalueGetcount(emailrnfo); i++) { str = [str stringByAppendingstring: (NSString *)ABMultivalueCopyvalueAtindex(emailrnfo, i)]; str = [str stringByAppendingstring:@"\n"]; }
//---display the details--UIAlertview *alert = [[UIAlertview alloc] initWithTitle:@"Selected Contact" message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; //---hide the People Picker--[self dismissModalviewcontrollerAnimated:YES]; return NO; }
- (BOOL)peoplePickerNavigationcontroller: (ABPeoplePickerNavigationcontroller *)peoplePicker shouldcontinueAfterselectingPerson:(ABRecordRef)person property:(ABPropertyiD)property
383
16. fejezet: A beépített alkalmazások elérése identifier:(ABMultivaluerdentifier)identifier { [self dismissModalviewcontrollerAnimated :YES]; return NO;
9. Ha az alkalmazást az iPhone Simulatorban szetetnénk tesztelni, akkor legalább egy, a következő adatokkal ellátott kapcsolat legyen a Contacts alkalmazásban Oásd a 16.9. ábrát): •
keresztnév,
•
vezetéknév,
•
e-mail.
10. Nyomjuk meg a Command-R gombokat, hogy az alkalmazásunkat az iPhone Simulatoron teszteljük A Contacts alkalmazás megnyitásához koppintsunk a Load Contacts gombra. Ha kiválasztunk egy névjegyet, a részletek figyelmeztetőelemként jelennek meg Oá sd a 16.1 O. ábrát). 16.9. ábra
Hogyan
mű.ködik?
Az előző szakaszhoz hasonlóan, ahol a urrmagePi ckercontro ll er osztály segítségével tudtunk fotót kiválasztani a Photo Libraryből, az ABPeoplePickerNavigationcontroller osztály segítségével ezúttal névjegyeket választhatunk ki a Contacts alkalmazásbóL Mielőtt az ABPeoplePickerNavigationcontroller osztályt használnánk, az AddressBook és az Addresssookur keretrendszereket hozzá kell adnunk a projektünkhöz. Csakúgy, mint a urrmagePickercontroller osztálynál, itt is meg kell felelnünk egy speciális protokollnak, a ABPeoplePickerNavigationControl lerDelegate-nek. Miután a Contacts alkalmazásból kiválasztortuk a névjegyet, a következő metódusokat hivhatjuk meg:
384
•
peoplePickerNavigationcontroller :shouldcontinueAfterselectingPerson:
•
peoplePickerNavigationController:shouldContinueAfterSelectingPerson :property: i denti fi er:
•
peoplePickerNavigationcontrollerDidcancel:
A Contacts alkalmazás elérése
Weo -Meng Lee
.' G
.. . J
L
G
o
.•
16.10. ábra
A peoplePickerNavigationcontrolleroidcancel : metódus akkor lúvódik meg, arnikor a névjegy kiválasztásakor rákoppintunk a Cancel (mégse) gombra. Ha egy kapcsolatra koppintunk rá, akkor a peoplePickerNavigationcontroller:shouldcontinueAfterSelectingPerson : metódus lúvódik meg. A kiválasztott névjegy adatai az ABRecordRef típus shoul dconti nueAfterse l ecti ngPerson: paraméterébe vannak beágyazva. Ebben a példában a névjegy különféle tulajdonságait bontottuk ki, és jelenítettük meg az Al ertview osztály segítségéveL //--- get the First Name--NSString *str = (NSString *) ABRecordcopyValue ( person , kABPersonFirstNameProperty) ; str = [str stringByAppendingstring :@"\ n"]; //- --get the Last Name--str = [str stringByAppendingString: ( NSString *) ABRecordcopyvalue ( person, kABPersonLastNameProperty)]; str = [str stringByAppendingString: @"\ n"]; //---get the Emails--ABMultiValueRef emailinfo ABRecordcopyvalue(person, kABPersonEmailProperty) ;
385
16. fejezet: A beépített alkalmazások elérése
//---iterate through the emails--for (NSUinteger i=O; i< ABMultivalueGetcount(emailinfo); i++) { str = [str stringByAppendingString: (NSString *)ABMultivalueCopyvalueAtindex(email info, i)]; str = [str stringByAppendingString:@"\n"];
//---display the details--UIAlertview *alert = [[UIAlertview alloc] initWithTitle:@"Selected contact" message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [al ert show]; [al ert release]; Ha készen vagyunk, kapcsoljuk ki a People Pickert, és jelerútsük meg a NO-t (amely semmit sem csinál): //---hide the People Picker--[self dismissModalviewcontrollerAnimated:YES]; return NO;
J\ peoplePickerNavigationcontroller:shouldcontinueAfterselectingPerson:property: i denti fi er: esemény akkor következik be, amikor rákoppintunk egy kapcsolatta, hogy a tulajdonságait megnézhessük. Ez csak akkor következik be, amikor a peoplePickerNavigati oneont ro ll e r: shou l dconti nueA fterse l e c ti ngPerson: metódus YES-t ad vissza. Ha YES-t ad vissza, akkor a Contacts alkalmazás továbbhalad, és megmutatja a kiválasztott névjegy adatait. J\mikor egy tulajdonságot kiválasztunk, a people PickerNaviga ti oncontroller:shouldcontinueAfterselectingPerson:property:identifier: esemény következik be. Ebben az esetben egy YES-t fogunk visszaadni, hogy a kiválasztott tulajdonságra megvalósuljon a cselekvés, és bezárjuk a választó elemet. Ha a személyt a választó elemben szeretnénk megjelerúteni, akkor NO-t kell visszaadnunk.
Névjegy hozzáadása J\rnellett, hogy a névjegyeink mentett adatait megjelerúthetjük, új névjegyeket is elmenthetünk közvetlenül a Contacts alkalrnazásba. Ezt a következő kódrészletekkel tehetjük meg: -(void) addcontact{ ABAddressBookRef addressBook = ABAddressBookcreate(); ABRecordRef person= ABPersoncreate(); //---add the first name and last name--ABRecordsetvalue(person, kABPersonFirstNameProperty, @"Wei-Meng" , nil); ABRecordsetvalue(person, kABPersonLastNameProperty, @"Lee", nil); 386
A Contacts alkalmazás elérése //---add the address--ABMutableMultivalueRef address ABMultivaluecreateMutable(kABMultiDictionaryPropertyType); NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init]; [addressoictionary setobject:@"Some Street Name" forKey:(NSString *) kABPersonAddressstreetKey]; [addressDictionary setObject:@"New York" forKey:(NSString *) kABPersonAddresscityKey]; [addressDictionary setObject:@"NY" forKey:(NSString *) kABPersonAddressstateKey] ; [addressDictionary setobject:@"l2345" forKey:(NSString *) kABPersonAddressZIPKey] ; [addressoictionary setobject:@"United States" forKey:(NSString *) kABPersonAddresscountryKey] ; [addressoictionary setobject:@"us" forKey:(NSString *) kABPersonAddresscountrycodeKey]; ABMultivalueAddvalueAndLabel(address, addressoictionary, kABHomeLabel, NULL); ABRecordsetvalue(person, kABPersonAddressProperty, address, nil); //---add the address book for the contact and save the addressbook--ABAddressBookAddRecord(addressBook, person, nil); ABAddressBooksave(addressBook, nil); CFRelease(person);
A fenti metódus, az addcontact, új névjegyet ad a Contacts alkalmazáshoz. A következő információkkal tölti fel a kapcsolatot:
• • •
keresztnév, vezetéknév, otthoni cím:
•
utca,
• • • • •
város, megye, irányítószám, ország, ország hívókódja.
A 16.11. ábra bemutatja az új névjegy részleteit. 16.11. ábra
387
16. fejezet: A beépített alkalmazások elérése
Megjegyzés Ha többet szeretnénk a névjegyek hozzáadásának különböző metódusairól megtudni, akkor nézzünk bele az Apple iPhone Reference Libraryjében lévő ABAddressBookba. Ezt a ht tp:/ /developer. apple. com/ iphone/library/documentation/AddressBook/Reference/ABAddressBookRef _i PhoneOS/ ABAddressBookRef_i Ph on eos. pdfhelyről tölthetjük le.
Névjegy törtése A névjegy eltávolításához a
következő
-(void) removecontact: (NSString
*)
kódrészletet használjuk: firstName andLastName:(NSString *) lastName {
ABAddressBookRef addressBook; ABAddressBookcreate(); CFArrayRef allcontacts; ABAddressBookCopyArrayofAllPeople(addressBook); CFindex contactscount; ABAddressBookGetPersoncount(addressBook); for (int i ; O; i < contactscount; Í++) ABRecordRef ref; CFArrayGetValueAtindex(allcontacts, i); NSString *contactFirstName ; (NSString *) ABRecordcopyValue( ref, kABPersonFirstNameProperty); NSString *contactLastName ; (NSString *) ABRecordcopyvalue( ref, kABPersonLastNameProperty); if
[firstName isEqualToString:contactFirstName] && [lastName isEqualToString:contactLastName]) ABAddressBookRemoveRecord(addressBook, ref , nil); ABAddressBooksave(addressBook, nil);
}
A remavecontact metódus két paramétert, a firstName-et és a l astName-et veszi alapul, és ezek alapján keresi meg a Contacts alkalmazásban az egyező kereszt- és vezetéknevet Ha megtalálja a névjegyet, akkor törli a Contacts alkalmazásbóL
Megjegyzés Ha többet szeretnénk a névjegyek törlésének különböző metódusairól megtudni, akkor nézzünk bele az Apple iPhone Reference Libraryjében lévő ABAddressBookba. Ezt a http://developer.apple.com/iphone/library/documentation/AddressBook/Reference/ABAddressBookRef_iPhoneOS/ ABAddressBookReLi Phoneos. pdfhelyről tölthetjük le.
388
A Contacts alkalmazás elérése
ÖSSZEGZÉS Ebb ől a fej ezetből megismerhettük, hogy mennyire egyszerű a gyári alkalmazásokat saját iPhone-alkalmazásainkba integrálni: SMS, Mail, Safari és tárcsázó megillvása egy egyszerű URL-karakterlánccaL Megnéztük továbbá, hogyan férhetünk hozzá a Contactshoz és a Pho to Libraryhez az iPhone SD K-ban található osztályok segítségéveL
•ntH3i.li 1. Mik a Safari, a Mail, az SMS és a tárcsázóalkalmazások megillvásához használt URLkarakterlánco k? 2. Mi a neve annak az osztálynak, amelyet az Image Picker felhasználói felületének megillvására használunk az iPhone-oknál? 3. Mi a neve annak az osztálynak, amelyet a People Picker felhasználói felületének m egillvására használunk az iPhone-oknál?
A FEJEZET TUDNIVALÓI Téma
Alapelvek
E-mail küldése az alkalmazáson
NSString *emailstring @"mailto : ?to=USER@EMAIL . COM&subj ect=SUBJECT&body= BODY OF EMAIL " ; [[UIApplication sharedApplication] openURL: [NSURL URLWithString:emailString]];
belülről
A Safari meghívása
[ [UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http:// www.apple.com"]];
A Phone alkalmazás meghívása
[[UIApplication sharedApplication] openURL:[NSURL URLWithstring:@"tel:1234567890"]];
Az SMS alkalmazás meghívása
[[UIApplication sharedApplication] openURL : [NSURL URLWi thStri ng : @"sms: 96924065"]];
A Photo Library alkalmazás
Használj uk a UIImagePi eke rcontro ll e r osztályt, és győződj ünk meg róla, hogy a View Controller megvalósítja a UINavi gat i onContra ll erDe l e gate protokollt.
elérése A Contacts alkalmazás elérése
Használjuk a ABPeopl e Pi ckerNavi gat i oneontroll er osztályt, a AddressBookUI keretren dszerbőL
389
Hozzáférés a hardverhez A FEJEZET FŐBB RÉSZEl A KÖVETKEZŐK: gyorsulásmérő
•
Hogyan érjük el az !Phone vagy az iPod Touch
•
Hogyan
•
Hogyan érhetünk el az !Phone és az iPod Touch Core Loeaciorr szolgáltatásával földrajzi adatokat?
•
Hogyan jelerútsünk meg térképet az alkalmazásunkban?
érzékelhe~ük
adatait?
az eszköz rázását?
előző fejezetben láthattuk, hogyan férünk hozzá az !Phone és az iPod Touch beépített alkalmazásaihoz különböző eszközök, URL-szttingek, valamint az !Phone SDK által kínált specializált osztályok segitségével. Ebben a fejezetben megismerhe~ük, hogyan férhetünk hozzá az eszközünk hardveréhez, például a gyorsulásmérőhöz, és hogyan szerezhetünk helyzeti információt GPS, mobiltorony és vezeték nélküli hotspot segitségével.
Az
A gyorsulásmérö használata Az iPhone és az iPod Touch egyik leginnovaúvabb funkciója a beépített gyorsulásmérő, amely lehetővé teszi, hogy az eszköz megállapítsa a tájolását, és tartalmát az új tájoláshoz igazítsa. Ha például oldalra fordítjuk az eszközt, a Safari webböngésző automatikusan fekvő módba kapcsol, így nagyobb nézetet biztosít. Ehhez hasonlóan a fényképezőgép a gyorsulásmérővel állí~a be, hogy a kép álló vagy fekvő módban készüljön.
17. fejezet: Hozzáférés a hardverhez
Az iPhone és az iPod Touch gyorsulásmérője az eszköz szabadeséshez képesti gyorsulását méri. Az 1 érték jelenti, hogy az eszközre 1 g erő hat (1 g a Föld gravitációs vonzása, amely az eszközt nyugvó állapotában éri). A gyorsulásmérő az eszköz gyorsulását három különböző tengelyen méri: X, Y és Z. A 17.1 ábra a gyorsulásmérő által mért különböző tengelyeket mutatja. +Y
-X
+X
-Z
+Z
-Y 17.1 ábra
A 17.1 táblázat a három tengely
különböző
értékeit muta~a az eszköz
különböző
pozícióiban.
17.1 táblázat. Az X, Y és Z tengelJek kiilönbozó értékei
Pozíció Függőleges
x
y
z
0,0
-1,0
0,0
Bal oldali tájkép
1,0
0,0
0,0
Jobb oldali tájkép
-1,0
0,0
Fejjellefelé
0,0
álló helyzet
Kijelzővel
felfelé
Kijelzővel
lefelé
fekvő fekvő
helyzetben
helyzetben
0,0 0,0
0,0
0,0
-1,0
0,0
0,0
1,0
Ha az eszközt függőlegesen tartjuk, és gyorsan jobbra mozgatjuk, az X tengely értéke nulláról poziúv értékre változik. Ha gyorsan balra mozgatjuk, akkor az X tengely értéke nulláról negaúv értékre változik. Ha az eszközt gyorsan felfelé mozgatjuk, az Y tengely értéke -1 ,O helyett nagyobb értéket vesz fel. Ha az eszközt gyorsan lefelé mozgatjuk, az Y tengely értéke -1 ,O-ről kisebb értékre csökken.
392
A gyorsulásmérö használata
Ha az eszköz kijelzővel felfelé fekszik az asztalon, és felemeljük, a Z tengely értéke -1,0-ról kisebb számra csökken. Ha felfelé mozgatjuk, a Z tengely értéke -1,0-ról nagyobb értékre változik.
IrMegjegyzés Az iPhone és az iPod Touch
gyorsulásmérője
+/-
2,3 g közötti ér-
téket tud mérni, 0,018 g felbontással.
gyakorlati rész megmutatja, hogyan érhető el programozottan a gyorsulásáltal adott adat. A gyo rsulásmérő adataihoz hozzáférve érdekes alkalmazások hozhatók létre - ilyen például a vízszintező vagy egy mozgásérzékelős játék.
A
következő
mérő
A gyorsulásmérő adatainak az elérése
A programkód [Accelerometer.'(jp} a Wrox.com
oldalróltölthető le.
1. Hozzunk létre egy új View-based
Application projektet az Xcode segítségéve!, és nevezzük el Ac ce l e remete r-nek. 2. Kattintsunk kétszer az Ac cel eromete rvi ewcontrol l er . xib fájlra, hogy az Interface Builderrel szerkesszük.
X-axis
Label
Y -axis
Label
Z-axis
Label
3. Töltsük fel az elemablakot hat Label (címke) elemmel (lásd a 17.2. ábrát) .
4. Adjuk hozzá az Accel e rometervi ewcont rol ler. h fájlhoz a következő félkövérerr szedett utasításokat: #import @inte rfa ce Accele romete rviewcont roller UlViewcontroller {
17.2. ábra
lBOutlet UlLabel *labelx ; lBOutlet UlLabel *labelv; lBOutlet UlLabel *labelz;
393
17. fejezet: Hozzáférés a hardverhez
@property (nonatomic, retain) Ullabel *labelx; @property (nonatomic , retain) Ullabel *labelv; @property (nonatomic, retain) Ullabel *labelz; @e nd 5. Visszatérve az Interface Builderbe, a Control billentyű nyomva tartásával kattintsunk, és húzzuk a File's Owner elemet a három Label elem mindegyikéhez, majd sorban válasszuk a l abe l x, a label v és a label z elemeket.
6. Adjuk hozzá az Accele romet erviewcontrol ler.m fáj lhoz a
következő
félkövéren
szedett utasításokat: #i mpo rt "Accelerometerviewcont rol l er .h" @i mpl ementati on Accelerometervi ewcont rolle r @synthesize labelx, labelY, labelz; - (void)viewoidload { UlAccelerometer *ace= [UlAccelerometer sharedAccelerometer]; acc.delegate = self; acc.updatelnterval = l.Of/ 60.0f; [super viewoidload]; }
- (void)accelerometer:(UIAccelerometer *) ace didAccelerate:(UlAccelerati on *)acceleration { NSString *str = [[NSString alloc] initWithFormat:@"%g", acceleration . x] ; labelx.text = str; str = [[NSString alloc] ini twithFormat:@"%g", acceleration .y]; labelY.text = str; str = [[NSString alloc] initwithFormat:@"%g", acceleration.z] ; labelz.text = str; [str release]; }
- (void) deal l oc { [labelx release]; [labelY release]; [labelz release]; [super dea ll oc] ;
7.
394
yomjuk meg a Command-R gombokat, hogy az alkalmazást iPhone eszközön teszteljüle A 17.3. ábra az alkalrnazáson megjelemtett adatot m utatja arra az esetre, arnikor az iPhone egy iPhone-tartón pihen.
A gyorsulásmérö használata
Megjegyzés A gyorsulásmérő adataihoz egy valós eszközre van szükség, pél-
l
dául egy i Phone-ra vagy egy i Pod Touchra.
ll Hogyan
működik?
~SGP- ..•
9
5:31PM
gyorsulásmérőjé
X-axis
-0.0545058
nek használatához implementáljuk a UIAcce l ero-
Y-axis
-0.999273
meteroelegate protokollt a delegáltunkban (ahogy
z-axis
-0.25436
Az iPhone vagy az iPod Touch
o ~
az elemvezérlőnkben): @interface Accelerometerviewcontroller urviewcontroller { Ahogy a nézet betöltődik, először a urAeeel erameter osztály egy egyszerű példányát kapjuk a sharedAccelerometer metódussal. Ezután megadjuk a példány delegáltját, valarnint azt az intervallumot, amelyben a gyorsulásmérő adatait megkapjuk - (void)viewoidLoad { UIAccelerometer *ace [UIAccelerometer sharedAccelerometer]; acc.delegate = self; acc.updateinterval = l.Of/60.0f; [super viewDidLoad];
17.3. ábra
}
Az updateinterval tulajdonság az intervallumot másodpercben határozza meg, a frissítések között eltelt másodpercek számával. Az előző esetben azt jeleztük, hogy a gyorsulásmérő
másodpercenként 60-szor frissítsen.
A UIAccelerometeroelegate protokoll adja meg azt az egyszerű metódust, amelyet implementálnunk kell, hogy a gyorsulásmérő adatait visszakapjuk: acce l erometer: di dAccel e rate:. Esetünkben a három tengely értékeit nyerjük ki, és jelenítjük meg a három Label elemen: - (void)accelerometer:(UIAccelerometer *) ace didAccelerate:(UIAcceleration *)acceleration { NSStri ng *st: r = [[NSSt:ri ng a ll oc] i ni twi th Forrnat: @"%g", ace e l eration. x] ; labelx.text = str; str = [[NSString alloc] initWithFormat:@"%g", acceleration.y]; labelY.text = str; str = [[NSString al loe] initWithFormat:@"%g", acceleration.z]; labelz.text = str; [str release]; }
395
17. fejezet: Hozzáférés a hardverhez
A rázás észlelése az i Phone 052 és a korábbi verziókban Az iPhone OS 3.0 esetében rendelkezésünkre áll a Shake API (lásd alább), azaz az eszköz rázását észlelő metóduskészlet. De hogyan észleljük a rázást az iPhone OS 2.0 és a korábbi verziókban? A válasz egyszerű. Az accelerometer:didAccelerate: eseményben megadhatjuk az ehhez szükséges kódot, az alábbiak szerint: #import "Accelerometerviewcontroller.h" #define kAccelerationThreshold 2.2 // . .. // ... - (void)accelerometer:(UIAccelerometer *) ace didAccelerate:(UIAcceleration *) acceleration { if (fabsf(acceleration.x) > kAccelerationThreshold) {
NSLog(@"Shake detected"); }
A fabsf() függvény egy lebegőpontos szám abszolút értékét adja. Ha az X tengely értéke abszolút értékben nagyobb, rnint 2,2, akkor ez azt jelenti, hogy a felhasználó rázza az eszközt.
A Shake API használata a rázás észleléséhez az OS 3. O alatt Az iPhone OS 3.0-s verzióval az Apple bejelentette, hogy elérhető az új Shake API, amely észleli az eszköz rázását. Az új Shake API valójában három esemény formájában jelenik meg, amelyeket a kódban kezelhetünk
396
•
moti onBegan :
•
moti onEnded:
•
motioncancelled:
A Shake API használata a rázás észleléséhez az OS 3.0 alatt
Ez a három esemény a UIResponder osztályban határozódik meg, ez pedig a UIApplicati on, a urvi ew és alosztályainak (beleértve a urwi ndow-t) főosztálya. A következő gyakorlati rész bemuta~a, hogyan észleljük az eszköz rázását a három eseménnyel. A Shake API használata
A programkód [Shake.zfp] a IIYrr.>x.com oldalról toltheló le.
---
1.
Hozzunk létre egy új nézetalapú Application projektet az Xcode segítségével, és nevezzük el shake-nek.
2. Kattintsunk kétszer a shakevi ewcontro ll er. xi b fájlra, hogy az Interface Builderrel szerkesszük. 3. Töltsük fel az nézetablakot a következő elemekkel Oásd a 17.4. ábrát): •
TextField,
•
DatePicker.
4. Szúrjuk be a
Sun Oct 26 l 8 l 59 VC l LJ
a
~
• IJU
1A
Tue Oct 28 l 10 l 01 l PM
következő
félkövérerr szedett utasításokat a shakevi ewcontro ll e r. h fájlba:
#import @interface Shakeviewcontroller urviewcontroller { IBOutlet UITextField *textField; IBOutlet uroatePicker *datePicker;
17.4. ábra
@property (nonatomic, retain) UITextField *textField; @property (nonatomic, retain) UIDatePicker *datePicker; -(IBAction) doneEditing: (id) sender; @end 5. Az Interface Builderben Control-kattintással húzzuk rá a File's Owner elemet a TextField elemre, majd válasszuk a text Fi e l d-et. 6. Control-kattintással húzzuk rá a File's Owner elemet a DatePicker elemre, majd válasszuk a datePi eke r-t.
397
17. fejezet: Hozzáférés a hardverhez
7. Kattintsunk jobb egérgombbal a TextField elemre, és a Did End on Exit eseményét kapcsoljuk a File's Owner elemhez (lásd a 17.5. ábrát). Válasszuk ki a doneEditing: elemet.
17.5. ábra
8. Szúrjuk be a fájlba:
következő
félkövéren szedett utasításokat a shakevi ewcontroller .m
#import "shakeviewcontroller.h" @implementation shakeviewcontroller @synthesize textField, datePicker; - (void) viewoidAppear:(BOOL)animated {
[self.view becomeFirstResponder]; [super viewoidAppear:animated]; }
- (IBAction) doneEditing: (id) sender { 11---when keyboard is hidden, make the view the first responder ll or else the shake API will not work--[self.view becomeFirstResponder]; }
398
A Shake API használata a rázás észleléséhez az OS 3.0 alatt - (void)motionBegan:(UIEventsubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) { NSLog(@"motionBegan : "); } }
- (void)motioncancelled:(UIEventsubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) { NSLog(@"motioncancelled: "); } }
- (void)motionEnded:(UIEventSubtype)motion withEvent : (UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) { NSLog(@"motionEnded:"); } }
- (void) dealloc { [textField release]; [datePicker release]; [super dealloc]; }
9. Kattintsunk jobb gombbal az Xcode Classes csoportjára, és válasszuk az Add );> New File (hozzáadás );> új fájl) lehetőséget. Válasszuk ki a UIView alosztálysablont (lásd 17.6. ábrát).
Choose a te.mplate: for your ne.w file: ,---nolrt'l.aDíeV•e:wCe~.:itiü:V•e'l'iCönl ~
subcb.ss
.m
'--
roller subdass
.m
.m
urYiewC.ontroller subcb.ss
Unit THt Ú.SI! d.i!SS
AppleScript C M\ rázásgesztus) lehetőséget, hogy az eszköz rázását szimuláljuk. Figyeljük meg a Debugger Console ablakban kiírt információt Oásd a 17.8. ábrát). 16. Érintsük meg a TextField elemet, ekkor megjelenik a billentyűzet. Válasszuk ismét a Hardware );> Shake Gesture lehetőséget, hogy az eszköz rázását szimuláljuk. Figyeljük meg a Debugger Console ablakban kiírt értékeket.
a return billentyű megérintéséveL Szimuláljuk ismét a rázás t, majd figyeljük meg az eredményt a D ebugger Console ablakban.
17. Zárjuk be a
400
billentyűzetet
A Shake API használata a rázás észleléséhez az OS 3.0 alatt
.... J Type:
luikk,ldenti
17.7. ábra
_ Shake ... O@buggt'r Console
pD
''E.
(sea•lon nu-t.ed u lOOt-01-11 llt57:5l +0100.) 200t-Ol-ll 21 158:l6.t55 BUe(22ll9 1207) a&D41.1JUJ . .uoa be9U t.O ~kaVl-1 Oztl04d0> 200t-Ot- ll 21:51 s l6.t56 $11.alr.e(ZllU r Z07J -tloaa.gu : 2009-01-11 Zl l SI I l6 . t57 5ll.a.lte(Zl2Jt r 20l) aaD4.1q -tlo-. -.uSed t.0 200t-Ol-ll ll 15l ! l6 . t51 SlLalta(ZUlt : ZOl) -t.lOilDded :
~====~ -17.8. ábra
401
17. fejezet: Hozzáférés a hardverhez
Hogyan
működik?
Tisztában kell lennünk azzal, hogy a három, a rázás észleléséhez használható esemény kiválasztása csak akkor történik meg, ha létezik zet megjelenésekor
először
első
reagáló a nézetünkben. Ezért a né-
be kell ezt állitanunk mint
első
reagáló (a shakevi ewcontrol -
ler.m fájlban): - (void) viewoidAppear:(BOOL)animated [self.view becomeFirstResponder]; [super viewoidAppear:animated];
Alapértelmezettként azonban a nézet nem lehet az
első
reagáló, ezért létre kell hoznunk
egy urvi ew alosztályt (shakevi ew. m), így felülírhatjuk az alapértelmezett canBecomeFi rstResponder metódust, hogy YES értékkel térjen vissza: - (BOOL)canBecomeFirstResponder { return YES;
Ekkor a nézet
első
reagálóként
működik.
Alapértelmezés szerint az Interface Builder
összekapcsolja a nézetet a urvi ew alaposztállyai (amellyel az esetek többségében semmi teendőnk
nincs). Utasítanunk kell az Interface Buildert, hogy az újonnan létrehozott
shakevi ew alosztályt használja. Ezután a három eseményt a Shakeviewcontroller.m fájlban kezeljük: - (void)motionBegan:(UIEventsubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) {
NSLog(@"motionsegan:"); }
}
- (void)motioncancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventSubtypeMotionshake ) {
NSLog(@"motioncancelled:"); }
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) NSLog(@"motionEnded:"); }
402
Müvelet végrehajtása az eszköz rázása közben Minden egyes eseménynél először megvizsgáljuk, hogy a mozgás valóban rázás-e; majd a Debugger Console-ban megadunk egy hibakereső kiíró utasítást. A doneEdi ti ng: metódusban (amelynek kiváltásához a felhasználó a return billentyű érintésével eltünteti a billentyűzetet) a nézetet első reagálóvá tesszük: -(IBAction) doneEditing: (id) sender { 11-- -when keyboard is hidden, make the view the first responder ll or else the shake API will not work--[self.view becomeFirstResponder]; }
Ha ezt nem tesszük meg, akkor a három mozgásérzékelő esemény nem váltódik ki, hiszen szükség van valamire, ami betölti az első reagáló szerepét. A moti onBegan: esemény akkor hivódik meg, ha az operációs rendszer észleli, hogy az eszközt rázni kezdték. Ha végül az OS úgy érzékeli, hogy a múvelet nem rázás, akkor a moti oncance ll ed: esemény váltódik ki. Ha az OS úgy érzékeli, hogy a múvelet rázás, akkor a moti onEnded: esemény váltódik ki.
Művelet
végrehajtása az eszköz rázása közben
A már ismert projekt módosításával azt szeretnénk elérni, hogy az eszköz rázásakor a DatePicker elem a mai dátum értékét kapja. A DatePicker alapértelmezett értékének beállitása rázáskor
1. Adjuk hozzá a shakeviewcontroller.m fájlhoz a utasításokat:
következő
félkövéren szedett
- (void)ResetoatePicker { [datePicker setoate : [NSDate date]] ; }
- (void)motionEnded : (UIEventsubtype)motion withEvent:(UIEvent *) event { if (event .subtype == UIEventsubtypeMotionshake ) { NSLog(@"'motionEnded:"'); [self ResetoatePicker]; }
403
17. fejezet: Hozzáférés a hardverhez
2. Nyomjuk meg a Command-R gombokat, hogy az alkalmazást az iPhone Simulatoron teszteljüle A DatePicker elemet állitsuk valamilyen dátumra. Válasszuk a Hardware );> Shake Gesture lehetőséget, hogy az eszköz rázását szimuláljuk. A DatePicker elemnél ekkor visszaáll az aktuális dátum (lásd a 17.9. ábrát).
Hogyan
működik?
A példánkban először egy ResetDatePi cker metódust adtunk a kódhoz, amely beállitotta a DatePicker értékét az aktuális dátumra: - (void)ResetDatePicker { [datePicker setDate:[NSDate date]]; }
Az eszköz rázásakor meghivjuk a ResetDatePi eke r metódust, amely a DatePicker elem értékét az aktuális dátumra álli*:
17.9. ábra
- (void)motionEnded:(UIEventsubtype)motion withEvent : (UIEvent *)eve nt { if (event.subtype == UIEventsubtypeMotionshake ) {
NSLog(@"motionEnded:"); [self ResetDatePicker]; }
Helyalapú szolgáltatások Manapság a mobileszközöket gyakran ellátják GPS-vevőveL A GPS-vevő segítségével könnyen hozzáférhetünk helyzetünk adataihoz a Föld körül keringő számos múholdnak köszönhetően. A GPS működéséhez azonban tiszta égboltra van szükség, így nem múködik fedett helyiségben. Az első generációs iPhone még nem tartalmazott GPS-vevőt. A GPS mellett pozíciónk bemérésének egy másik hatékony módja a mobiltomyok háromszögelése. Egy bekapcsolt mobiltelefon állandó kapcsolatban van a környező bázisállomásokkal. Ha ismerjük a mobiltomyok azonosítóját, lehetőségünk van meghatározill a fizikai helyzetünket a mobiltomyok azonosítóját és pontos földrajzi helyzetét tartalmazó különböző adatbázisok segítségéveL A mobiltornyok háromszögelésének előnye a GPS-
404
Helyalapú szolgáltatások vevővel
szemben az, hogy fedett helyiségben is működik műholdak nélkül. Pontosságban azonban alulmarad a GPS-vevővel szemben, ez attól függően változik, hogy rnilyen területen vagyunk. A mobiltornyok háromszögelése sűrűn lakott területeken működik legjobban, ahol a mobiltornyok egymáshoz közel helyezkednek el. A mobiltornyok háromszögelése azonban nem alkalmazható iPod Touch eszközzel, ugyanis ebben nem található mobiltelefon-egység. A harmadik módszer a pozíció meghatáVIeW rozására a wifi háromszögelés. Mobiltornyok helyett az eszköz wifi hálózathoz csatlakozik, Latituda és adatbázisok helyett a szolgáltatót ellenőrzi, Longituda meghatározva azt, hogy mely helyen nyújtja Accuracy az adott szolgáltatást. A három bemutatott módszer közül a wifi háromszögelés a legkevésbé pontos. Az Apple létrehozta az iPhone telefonhoz a Core Location keretrendszert, amely segít a fizikai helyzet meghatározásában. A keretrendszer mindhárom említett megközelítést használja, és a fejlesztő számára teljesen transzparens, hogy éppen melyiket. Egyszerűen megadjuk, hogy milyen ponrosságra lesz szükségünk, és a Core Location kiválasz~a az ehhez szükséges legjobb módszert. A következő gyakorlati rész megmutatja, 17.10. ábra hogyan valósítsuk ezt meg a kódunkban. Helyzeti koordináták lekérése A programkód [GPS.ifpj a Wrox.com
oldalrríltiilthető le.
1. Hozzunk létre egy új View-based Application projektet az Xcode segítségéve!, és
nevezzük el GPS-nek. 2. Kattintsunk kétszer a GPSViewcontroller.xib fájlra, hogy az Interface Builderrel szerkesszük. 3. Töltsük fel a nézetablakot a •
Label
•
TextField
következő
elemekkel Qásd a 17.10. ábrát):
405
17. fejezet: Hozzáférés a hardverhez
4. Kattintsunk jobb gombbal az Xcode Frameworks csoportpra, és válasszuk az Add >- Ex.isting Frameworks (hozzáadás >- Ex.isting Frameworks) lehetőséget. Válasszuk ki a Framework/ CoreLocati on. framework elemet. 5. Szúrjuk be a fájlba:
következő
félkövérerr szedett utasításokat a GPSViewcontroller.h
#import #import @interface GPSViewcontroller : UIViewcontroller { IBOutlet UITextField *latitudeTextField; IBOutlet UITextField *longitudeTextField; IBOutlet UITextField *accuracyrextField; CLLocationManager *lm;
@property (retain, nonatomic) UITextField *latitudeTextField; @property (retain, nonatomic) UITextField *longitudeTextField; @property (retain, nonatomic) UITextField *accuracyTextField; @end
6. Visszatérve az Interface Builderbe, Control-kattintással húzzuk a File's Owner elemet a három TextField elem mindegyikéhez, majd válasszuk az accuracyTextFi e l d, a l a ti tudeTextFi e l d és a longi tudeText Fi e l d elemeket egyenként.
7. Szúrjuk be a
következő
félkövérerr szedett utasítást a GPSViewcont ro ll e r. mfájlba:
#import "GPSViewcontroller.h" @i mplementation GPSViewcontroller @synthesize latitudeTextField, longitudeTextField, accuracyTextField; - (void) vieWDidLoad { lm= [[CLLocationManager alloc] init]; if ([lm locationservicesEnabled]) { lm.delegate = self; lm.desiredAccuracy = kCLLocationAccuracysest; lm.distanceFilter = lOOO.Of; [lm startupdatingLocation]; } }
- (void) locationManager: (CLLocationManager * ) manager didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation{
406
Helyalapú szolgáltatások
NSString *lat= [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.latitude]; latitudeTextField.text = lat; NSString *lng = [[NSString al loe] initWithFormat:@"%g", newLocation.coordinate.longitude]; longitudeTextField.text = lng; NSString *ace= [[NSString alloc] initwithFormat:@"%g", newLocation.horizontalAccuracy]; accuracyTextField.text = ace; [ace release]; [l at re l eas e]; [l ng re l eas e] ; }
- (void) locationManager: (CLLocationManager *) manager didFailWithError: (NSError *) error { NSString *msg = [[NSString alloc] initwithstring:@"Error obtaining location "]; urAlertView *alert = [[UIAlertview alloc] initWithTitle:@"Error" message:msg delegate:nil cancelButtonTitle: @"Done" otherButtonTitles:nil]; [alert show]; [msg re l eas e] ; [alert release]; }
- (void) dealloc{ [lm release]; [latitudeTextField release]; [longitudeTextField release]; [accuracyTextField release]; [super dealloc];
8. Nyomjuk meg a Command-R gombokat, hogy az alkalmazást az iPhone Simulatorban teszteljük. A 17.11 ábra a szimulátort muta~a a kapott helyzet földrajzi szélességének és hosszúságának megjelenítésekor. Egyúttal az eredmény pontossága is látható.
Megjegyzés Alkalmazásunkat tesztelhetjük az iPhone Simulatorban. Ám a szimulátor részére az eszköz mindig rögzített pozíciót küld. Nem nehéz megtippelni, hogy melyik pozícióról van szó.
J 407
17. fejezet: Hozzáférés a hardverhez
Hogyan működik? A CLLocati onManage r osztály használatához elő ször implementáljuk a CLLocati onManageroe l e gate protokollt a View Controller osztályba: @interface GPSViewController : urviewcontroller { Ahogy a nézet
betöltődik, először
a CLLocati onMa-
nager osztály egy példányát hozzuk létre. - (void) viewDidLoad { lm = [[CLLocationManager al loe] init]; if ([lm locationServicesEnabled]) { lm.delegate = self; lm.desiredAccuracy = kCLLocationAccuracysest; lm.distanceFilter = lOOO.Of; [lm startUpdatingLocation]; }
17.11. ábra Mielőtt
az objektumot felhasználnánk,
ellenőrizzük,
hogy a felhasználó engedélyezte-e
készülékén a Location Services opciót. Ha igen, akkor megadjuk a kívánt pontosságat a des i redAccuracy tulajdonsággaL A
következő
állandókat
használha~uk
a pontosság meg-
adásához: •
kCLLocationAccuracyBest
•
kCLLocationAccuracyNearestTenMeters
•
kCLLocationAccuracyHundredMeters
•
kCLLocationAccuracyKilometer
•
kCLLocationAccuracyThreeKilometers
Bár megadhatjuk az általunk kívánt legnagyobb pontosságot, ez azonban nem garantált. Emellett a nagyobb pontossággal kért helyzetmeghatározás
jelentős időbe
telik, és az
eszköz akkumulátorát is igencsak igénybe veszi.
A di stanceFi l ter tulajdonsággal megadhatjuk azt a távolságot, amelyet az eszköznek meg kell tennie a frissítéshez. Ennek méter a mértékegysége, és az utolsó pozícióhoz viszonyí~uk.
Ha minden elmozdulásról értesítést szeretnénk kapni, akkor használjuk a
kCLDi stanceFi l terNone állandót. Végül pedig elindítjuk a Loeari on Managert a startupda ti ngLocati on metódussal.
408
Helyalapú szolgáltatások A helyzeti információ megszerzéséhez két eseményt kell kezelnünk: •
locationManager:didupdateToLocation:fromLocation:
•
locationManager:didFailWithError:
Amikor
elérhetővé
válik egy új helyzeti érték, a l o ca ti onManager: di dupdateToLocati on:
fromLocati on: esemény váltódik ki. A Location Manager nem tudja meghatározni a helyzeti értéket, ezért megl:úvja a locati onManager: di d Fai lwithError: eseményt. A helyzeti érték megszerzése után a CLLocati on objektummal tudjuk megj eleniteni annak szélességi és hosszúsági értékér, valamint pontosságát: - (void) locationManager: (CLLocationManager *) manager didupdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation{ NSString *lat= [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.latitude]; latitudeTextField.text =lat; NSString *lng = [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.longitude]; longitudeTextField.text = lng; NSString *ace = [[NSString alloc] initWithFormat:@"%g", newLocation.horizontalAccuracy]; accuracyTextField.text = ace; [ace release]; [l at re l eas e] ; [l ng re l eas e] ;
A CLLocation objektum horizontalAccuracy tulajdonsága adja meg a ponrossági sugarat méterben.
Térképek megjelenitése Adott pozíció helyzeti értékének lekérését célszeru a térképes megjelenitéssei kiegészíte-
ni. Az ideális az lenne, ha felhasználnánk a helyzeti értéket, és megjelenítenénk egy térképen. Szerencsére az iPhone SDK 3.0 esetén elérhető a Map Kit API, amely megjeleníti a Google-térképet az alkalmazásunkban . A következő gyakorlati rész bemutatja, hogyan valósítsuk ezt meg a kódban.
409
17. fejezet : Hozzáférés a hardverhez
Helyzeti információ megjelenitése Map Kit használatával előző részben létrehozott projekt segítségével a GPSVi ewcontrol ler .xi b fájlban ad junk hozzá az nézetablak-
1. Az
hoz egy Button elemet (lásd a 17. 12. ábrát).
2. Kattintsunk jobb gombbal az Xcode Frameworks csoportjára, és adjuk hozzá a már létező MapKit. framewor k keretrendszert.
View Map
következő félkövéren szedett utasításokat a GPSVi ewcontro l l er . h fáj lba:
3. Szúrjuk be a
#impo rt #i mport #i mport @interface GPSViewcontroller 17.12. ábra urviewcontroller { IBOutlet UITextField *accuracyTextField; IBOutlet UITextField *latitudeTextField; IBOutlet UITextField *longitudeTextField; CLLocationManager *lm; MKMapView *mapview;
@property ( retain , nonatomic) UITe xtFi eld *accuracyTextField; @property ( retain , nonatomic) UITextField *latitudeTextField; @property ( retain, nonatomic) UITextField *longitudeTextField ; -(IBAction) btnvieWMap : (id) sender; @e nd
4. Visszatérve az Interface Builderbe, Control-kattintással húzzuk a Button elemet a File's Owner elemre, és válasszu k a btnvi eWMap : -et.
5. Adjuk hozzá a GPSVi ewcont ro ll e r. m fájlhoz a tásokat: -(IBAction) btnviewMap : (i d) sender { [self.view addSubview : mapView] ;
410
következő
félkövéren szedett utasí-
Helyalapú szolgáltatások
- (void) viewDidLoad { lm= [[CLLocationManager alloc] init]; lm.delegate = self; lm.desiredAccuracy = kCLLocationAccuracyBest; lm . distanceFilter = lOOO . Of; [lm startUpdatingLocation]; mapview = [[MKMapview alloc] initwithFrame:self.view.bounds]; mapview.mapType = MKMapTypeHybrid; }
- (void) locationManager: (CLLocationManager *) manager didupdateToLocation: (CLLocation * ) newLocation fromLocation: (CLLocation *) oldLocation{ NSString *lat = [[NSString a ll oc] initwithFormat:@"%g", newLocation.coordinate.latitude]; latitudeTextField.text =lat; NSString *lng = [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.longitude]; longitudeTextField.text = lng; NSString *ace = [[NSString a ll oc] initWithFormat:@"%g", newLocation.horizontalAccuracy]; accuracyTextField . text = ace; [ace release]; [l at re l eas e] ; [l ng re l eas e] ; MKCoordinatespan span; span.latitudeDelta=.OOS; span.longitudeoelta=.OOS; MKCoordinateRegion region; region.center = newLocation.coordinate; region.span=span; [mapview setRegion:region animated:TRUE]; }
- (void) dealloc{ [mapview release]; [lm release]; [latitudeTextField release]; [longitudeTextField release]; [accuracyTextField release]; [super dealloc]; }
411
17. fejezet: Hozzáférés a hardverhez 6. Nyomjuk meg a Command-R gombokat, hogy az alkalmazást az iPhone Simulatoron teszteljük A View Map gomb érintésekor egy térképet kapunk, amely a Location Manager által megadort helyzetet mutatja (lásd a 17.13. ábrát).
Megjegyzés Ha alkalmazásunkat valódi eszközön teszteljük, akkor láthatjuk, hogy helyzetváltoztatásunknak megfelelően a térkép dinamikusan frissül. Bizonyosodjunk meg arról, hogy a distanceFilter tulajdonság értékét egy kisebb számra változtattuk, így ugyanis a távolságban bekövetkező kisebb változásokat is nyomon tudjuk követni.
Hogyan működik? Ahhoz, hogy a Map Kit használható legyen az alkalmazásunkban,
először
a Map Ki t. framework ke-
retrendszert kell hozzáadnunk a projektünkhöz. Ahogy a nézet
betöltődört,
létrehozzuk a
MKMapvi ew osztály egy példányát, és beállitjuk a megjelenítendő
térkép típusát (hibrid - térkép és
műhold):
- (void) viewDidLoad { lm= [[CLLocationManager alloc] init]; lm.delegate = self; lm.desiredAccuracy = kCLLocationAccuracyBest; lm . distanceFilter = lOOO . Of; [lm startUpdatingLocation]; mapview = [[MKMapView alloc] initWithFrame:self.view.bounds]; mapview.mapType = MKMapTypeHybrid; }
A View Map gomb megérintésével hozzáadjuk a mapview objektumot az aktuális nézethez:
17.13. ábra
-(IBAction) btnViewMap: (id) sender { [self.view addsubview:mapview]; }
Amikor a helyzeti információ frissül, ránagyítunk az adott h elyzetpontra a mapview objektum setReg i on: metódusával:
412
Helyalapú szolgáltatások - (void) locationManager: (CLLocationManager *) manager didupdateToLocation: (CLLocation *) newLocation fromlocation: (CLLocation *) oldLocation{ // .. . // .. . MKCoordinatespan span; span.latitudeoelta;.QQS; span.longitudeoelta;.QQS; MKCoordinateRegion region; region.center ; newLocation.coordinate; region.span;span; [mapview setRegion:region animated:TRUE];
Megjegyzés További információt a MKMapvi ew osztállyai kapcsolatban az Apple dokumentációjában találhatunk: ht tp: l /devel ope r. apple. com/i phone/l i brary/navigation/Frameworks/CocoaTouch/MapKit/index.html .
ÖSSZEFOGLALÁS Ez a fejezet bemutatta, hogyan manipulálhaták eszközünk különbözó típusú hardverei: a gyorsulásmérő, a Shake API és a Core Loeaciont használó helyalapú szolgáltatások. Ezek kombinációjával nagyszerű alkalmazásokat hozhatunk létre.
1. Nevezzük meg azt a protokollt, amelyet a delegáltunknak meg kell valósítania, hogy lehetővétegye a gyorsulásmérő használatát az iPhone és az iPod Touch eszközön. 2. Nevezzük meg az iPhone SDK 3.0 Shake API három eseményét. 3. A Core Location három különböző módszert használ az eszköz helyzetének meghatározására. Fejtsük ki ezt a három, iPhone és iPod Touch esetén használt módszert.
413
17. fejezet : Hozzáférés a hardverhez
A FEJEZET TUDNIVALÓI Téma
Alapelvek
A gyorsulásmérő adatainak elérése
Biztosíts uk, hogy a nézetvezérlő megvalósítsa a UI Acce l e rometerDe l egat e protokollt, és hozzuk létre a UIAcce l eromete r osztály egy példányát. A gyorsulásban bekövetkezett változások fogadásához implementáljuk az ace e l e romete r : d i dAc ce l e rate metódust.
A rázás észlelése
Használhatjuk a gyorsulásmérő adatait vagy az iPhone OS 3.0 új Shake API felületét. A Shake API esetén a következő eseményeket kell kezelnünk: moti onBegan: , moti onEnded: és moti onCan ce ll ed: .
Helyzeti információ lekérése
Adjuk hozzá projektünkhöz a CoreLocanon keretrendszert. Biztosítsuk, hogy a nézetvezérlő megvalósítsa a CLLocati onMan ag e roe l egat e protokollt, és hozzuk létre a CLLocation Manage r osztály egy példányát. A helyzeti értékben bekövetkezett változások fogadásához implementáljuk a l ocati onManager: d i dupdateToLocati on : fromLocati on : metódust.
Helyzeti adat pontosságának megadása
Használjuk a
Térképek megjelenítése
Adjuk hozzá projektünkhöz a MapKit keretrendszert. Hozzuk létre a MKMapVi ew osztály egy példányát, és a különböző rulajdonságok segítségével adjuk meg a helyzeti értéket.
414
következő
állandók egyikét:
kCLLocationAccuracyBest kCLLocat i onAccuracyNearestTenMeters kCLLocati onAccuracyHundredMeters kCLLoc at i onAccuracyKilometer kCL Locati onAccuracyThreeKi lometers
..... _"
RÉs·z. • ---
~
_,
__ .:
~~~
Függelékek A függelék: A gyakorlatok megoldásai .................. 417 B függelék: Az Xcode használata .......................... 435 C függelék: Az Interface Builder használata ......... 451 D függelék: Objective-C gyorstalpaló .................... 465 E függelék: T esztelés konkrét iPhone-on vagyiPod Touchon ............................ 495
ELÉ A gyakorlatok megoldásai Ez a függelék a fejezetek végén (az 1. fejezet kivételével) található
ismétlő
feladatok
megoldásait tartalmazza.
A 2. fejezet feladatainak a megoldása Válasz az 1. kérdésre A minimálisan szükséges képméret 57 x 57 pixel nagyságú. Nem baj, ha nagyobb képet tervezünk, mert az iPhone automatikusan átméretezi. Általában próbáljunk nagyobb képet tervezni, mert így az alkalmazásunk megfelelő lesz az újabb készülékek számára is, amelyekkel az Apple előáll.
Válasz a 2. kérdésre Implementálnunk kell a shoul dAutorotateTointerfaceori entation: eljárást és lekódolni az orientáció biztosításához szükséges további utasításokat. Az összes orientáció biztosításához csak meg kell adnunk a YES értéket az eljárásban, a következőképpen: - (BOOL)shouldAutorotateTointerfaceorientation:(UIInterfaceorientation) interfaceorientation { ll Return YES for supported orientations return YES; }
A függelék: A gyakorlatok megoldásai
A 3. fejezet feladatainak a megoldása Válasz az 1. kérdésre A . h fájlban: 11---declare an outlet--IBOutlet UITextField *nameTextFi eld; ll .. . 11---expose the outlet as a property--@property (nonatomic, retain) UITextField *nameTextField;
Az . m fájlban: @implementation Basicurviewcontroller 11---generate the getters and setters for the property--@synthesize nameTextField;
Válasz a 2. kérdésre A . h fájlban: - (IBAction)btnClicked:(id)sender;
Az . m fájlban: @implementation Basicurviewcontroller ll ... - (IBAction)btnClicked:(id)sender { 11---your code for the action here--}
A 4. fejezet feladatainak a megoldása Válasz az 1. kérdésre Hogy egy elemet csatlakoz tassunk a
418
nézetvezérlőhöz, nézetvezérlő
tegyük a
•
Határozzuk meg az osztályt a
•
Kapcsoljuk össze a File's Owner elemet a nézettel.
következőt
a . xi b fájlban:
nevéhez a File's Owner elemben.
Az 5. fejezet feladatainak a megoldása
Válasz a 2. kérdésre Használjunk alert nézetet, arnikor üzenetet jelenítünk meg a felhasználónak. Ha a felhasználó többféle opció közül választhat, alkalmazzunk választható elemeket.
Válasz a 3. kérdésre - (void)loadview { //- --create a urview object--UIView *view = [[urview alloc] initwithFrame:[UIScreen mainscreen].applicationFrame]; view.backgroundcolor = [UIColor lightGraycolor]; //---create a Button view--frame= CGRectMake(lO, 70, 300, 50); UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = frame; [button setTitle:@"click Me, Please!" forstate:urcontrolstateNormal]; button.backgroundcolor = [UIColor clearcolor]; button.tag = 2000; [button addTarget:self action:@selector(buttonclicked:) forcontrolEvents:urcontrolEventTouchuprnside]; [view addsubview:button]; self.view =view; }
Az 5. fejezet feladatainak a megoldása Válasz az 1. kérdésre Először
foglalkozzunk a Did End on Ex i t eseménnyel (vagy implementáljuk a text-
Fi e l dshoul dRetu rn: eljárást a nézetvezérlőben) . Ezután lúvjuk meg a res i gnFi rstResponder objektum UITextField eljárását, hogy felmentsük az első reagáló státusz alól.
419
A függelék: A gyakorlatok megoldásai
Válasz a 2. kérdésre Regisztráljunk két értesítésre: UIKeyboardwi ll showNati fi ca ti on és UIKeyboardwi ll Hi deNati fi ca ti on.
Válasz a 3. kérdésre 11---gets the size of the keyboard--NSDictionary *userrnfo; [notification userrnfo]; NSValue *keyboardvalue; [userrnfo objectForKey:UIKeyboardBoundsuserinfoKey]; [keyboardvalue getvalue:&keyboardBounds];
A 6. fejezet feladatainak a megoldása Válasz az 1. kérdésre -(BOOL)shouldAutorotateTointerfaceorientation: (UIInterfaceorientation)interfaceorientation { return (interfaceorientation interfaceorientation
urrnterfaceorientationLandscapeLeft l l urrnterfaceorientationLandscapeRight);
Válasz a 2. kérdésre A frame tulajdonság meghatározza a téglalapot, amelyet az elem elfoglal, tekintettel annak tartalmazó nézetére (arra az elemre, amely magában foglalja). A frame tulajdonság révén beállíthatjuk az elem pozícióját és méretét. A frame tulajdonság mellett használhatjuk a center tulajdonságot is, amely az elem középpontját adja meg, ugyancsak tekintettel annak tartalmazó nézetére. Amikor valarnilyen animációt hajtunk végre, általában a center tulajdonsággal változtatjuk meg az elem pozícióját.
420
A 7. fejezet feladatainak a megoldása
A 7. fejezet feladatainak a megoldása Válasz az 1. kérdésre mysecondviewcontroller = [[MySecondviewcontroller alloc] initWithNibName:nil bundle:nil];
Válasz a 2. kérdésre - (void)viewoidLoad { //---create a CGRect for the positioning--CGRect frame= CGRectMake(lO, 10, 300, 50); //---create a Label view--label = [[UILabel alloc] initwithFrame:frame]; label .textAlignment = UITextAlignmentCenter; label . font= [UIFont fontwithName:@"Verdana" size:20]; label .text= @"This is a label"; //---create a Button view--frame= CGRectMake(lO, 250, 300, 50); button = [[UIButton buttonwithType:UIButtonTypeRoundedRect] initWithFrame:frame]; [button setTitle:@"OK" forState : urcontrolstateNormal]; button.backgroundcolor = [UIColor clearcolor]; [self.view addsubview:label]; [self.view addsubview:button]; [super viewoidLoad];
Válasz a 3. kérdésre //---add the action handler and set current class as target--[button addTarget:self action:@selector(buttonclicked:) forcontrolEvents:urcontrolEventTouchUpinside];
ll .. . -(IBAction) buttonclicked: (id) sender{ /1---do something here---
421
A függelék: A gyakorlatok megoldásai
A 8. fejezet feladatainak a megoldása Válasz az 1. kérdésre Kódfájl [TabBarAndNav. :n .no Jo}t- f
11
w
."!1.
1;10 ...
•• : .J)delfQOle
B.8. ábra
A paraméterek értékeinek megadásához navigáljunk a gombokkal az egyes paraméterek közt, vagy pedig kattintsunk az egyes helyőrzőkre, és írjuk felül őket.
Az alkalmazás futtatása Egy alkalmazás végrehajtásához először kiválasztjuk a használandó aktív SDK-t, továbbá azt is, hogy valódi eszközön vagy a beépített iPhone Simulatoron kívánjuk-e tesztelni az alkalmazást. Ehhez az Overview listából válasszuk ki a megfelelő elemet Oásd a B.9. ábrát) . Az alkalmazás futtatásához nyom juk meg a Command-R gombokat, és az Xcode felépíti és telepíti az alkalmazást a kiválasztott eszközre vagy a szimulátorra.
441
B függelék: Az Xcode használata
ll_8bit_675.jpg
Device - iPhone OS 2.2
rornoworlt
Device- iPhoneOS 2.2.1 Device - iPhone OS 3.0 (Project Setting) Simulator- iPhone OS 2.0 Simulator- iPhone OS 2.1 Simul ..tor- iPhone OS 2.2 Simulator- iPhone OS 2.2.1
~ t
op
•ftx.pch
•EIIm!ml!1111i1·il!·=t:Em•••••(~'eg•ue.h 1n.m. l :t (_ l Debug
.erApp
Release l
l ~ MyKillerApp llKttiUlKtt.l»;l'
l '+ MyKillerApp - iPhone Simulator (3.0)
.nt aroc, char
l
WeteosePoot 1tYol • Ul.\ppl
*
i386
---~---~~--..-· re lease ); return retVo t ;
8.9. ábra
Hibakeresés az alkalmazásokban A hibakeresés lényeges része a fejlesztésnek. Az Xcode tartalmaz hibakereső segédprogramokat, ezek nyomon követik és megvizsgálják a programkódot, miközben végrehajtjuk az alkalmazást. A következő részekben néhány olyan tippet és trükköt találunk, amelyeket az iPhone-alkalmazások fejlesztésénél használhatunk.
Hiba Arnikor megpróbálunk futtatni egy alkalmazást, az Xcode először megpróbálja fordítani a projektet, mielőtt telepíti az alkalmazást egy valódi eszközre vagy a szimulátorra. Bármilyen szintaktikai hibát észlel, azonnal kiemeli pirossal. A B.10. ábrán látható, hogy az Xcode ezt hogyan teszi. A következő programkód hibája a hiányzó kapcsos zárójel a ([) a [[UIAlertview alloc] utasításhoz.
442
Hibakeresés az alkalmazásokban
..
~
'-'VKIIIerAppViewConuoller.m:36
- vlewDtdload
ll Implement vtewDidload to do oddittonol setup after loodtng the view, typteaily fw - (votd )viewDidlood { U!AlertVtew *olert
= [UIAlertView
ol loe] initWithTitle :@"Hello World'"
o-. ....... ·:·>:--'llllo· message :@"Hello, MY \iorld" de Legete :self concelButtonTt t le :@"OK" otherButton Ti t les :nt l ]; [o lert show ]; [ol ert release ]; [super viewDidlood ];
.
}
-~-
tt
-.
-·-·..
--3 'L
•.
f±O!:tJ
j
8.10. ábra
e
MyKillerAppViewController.m: MyKillerApp- Build Results
~
Iullel Iullel-Go
o
T•s~s
,. e Building tugct '"MyKIIIt:rApp'" of projut •p,tyKtllerApp• wlth conftgun~~tlon • Debug• -
(l t:rt04
Compoling /Users/welmenglee/O.sktop/Object!Yk.~own load cc.mand Ox80000022 unk.nown load coama.nd Ox80000022 unknown load COGIDO.lld Ox80000022 unknow:> load cOIIIIWU\d Ox80000022 unk.."'O\to":l load ccmoa.nd Ox80000022 2009- 07 - 10 12 : 17: J t . 259 Scroonllot:atiou [ 68 H : 207 J In tho willttotatoToi atorf aeOOrlont.ation : cvOAt handlo r u.'\ltnown u.'>k."\own unknoo.-n u.'\ltnow:>
gU!>
GDB Stopped at bre• kpolnt l
8.18. ábra
448
(h:t
count
l)
'
wiii RotateTotnter.
Hibakeresés az alkalmazásokban
Dokumentációk A fejlesztés folyamán gyakran le kell ellenőrizni a különböző metódusokat, osztályokat és objektumokat, amelyeket az iPhone SDK-ban használunk. Ehhez nézzük meg a dokumentációt. Az Xcode ezt gyorsan lehetővé teszi, megnézhetjük osztályok, tulajdonságok és metódusok definícióit az Option gomb használatávaL Egy elem súgódokumentációjának megtekintéséhez egyszerűen nyomjuk meg az Option billentyűt. A kurzor ekkor célkeresztre vált. Kattintsunk duplán az ellenőrizendő elemre, és megjelenik a Developer Documentation (fejlesztői dokumentáció) ablak (lásd a B. 19. ábrát).
lnhtrtu from
UVI-tJJI.nJ)Ondff~
Conform~ to
HSCodl .... (UIVIh~ IÖOb,.C:I
)l;(cde
U hMbe
,_QtQ
IS.."!t Attributes Inspector (eszközök );> attribútumellenőr) rnenüpontot választva hivható meg.
455
C függelék: Az Interface Builder használata
A Connections lnspector ablak Az Interface Builder Connections Inspector ablakában (lásd a C. 7. ábrát) kapcsolhatjuk a kivezetéseket és a műveleteket az elemvezérlókhöz. A Connections Inspector ablak tartalma dinamikus, és a View ablakban kiválasztott elemtól függóen változik. A Connections Inspector ablak a Tools );> Connections Inspector (eszközök );> kapcsolatellenór) menüpontot választva hívható meg.
A Size lnspector ablak Az Interface Builder Size Inspector ablakában (lásd a C.8. ábrát) konfigurálhatjuk az elemek méretét és pozícióját.
o y W
C.8. ábra
!20
H
o •60
C.9. ábra
A Size Inspector ablak a Tools );> Size Inspector (eszközök );> méretellenór) menüpontot választva hívható meg.
456
Library (könyvtár)
Az ldentity lnspector ablak Az Interface Builder Idencity Inspector ablakában (lásd a C.9. ábrát) konfigurálha~uk az elemvezérlő kivezetéseit (outlet) és műveleteit (action). A műveleteket és a kivezetéseket a plusz (+) gombra kattintva adha~uk hozzá, a mínusz (-) gombra kattintva pedig eltávolíthatjuk őket. A függelék utolsó részében részletesen bemutatjuk, hogyan hozhatunk létre kivezetéseket és műveleteket az Interface Builderben. Az Idencity Inspector ablak a Tools )> Idencity Inspector (eszközök )> identitásellenőr) menüpontot választva hívható meg.
Library (könyvtár) A Library (fools )> Library [eszközök )> könyvtár]) egy olyan elemkészletet tartalmaz, amelynek segítségével összeállíthatjuk iPhone-alkalmazásaink felhasználói felületét. A C. tO. ábrán a Librarylátható részleges elemkészletteL
N~viga.tion
Image Prcke
Obj• ct
Provldes view· móln;a.gement funcuonahty for
tooiNrs, ~v.g01bon b.vs. and ;a,pphat1on VJews . The UMPM:onuolltrciHs also
suP__~'J!...~~~~.'--~"~.. ~~~~~ng views
err-
'
o View lcon.s ll View lcons And Labels QY View lcons And Descnptlons
~
View Controll•r
Ul'l•e NC:ontr"' ~r
PrOVId tS Yitw- managtmtnt funCIJO~hty
toolb.us. ~VJg•t1 on bvs, ilnd apphcat•on The UMewCont.roller eius ~so
vteoNS .
~~~~ ~~~.".!~-~n~.. ~~~~ng vtfWS
ó·
C.lO. ábra
ror
./ Show Group Banners
NewGroup New Smart Group
Edit Rc:""'ove From
(:rou"J
~
C.ll. ábra
457
C függelék: Az Interface Builder használata
A Library az elemek alábbi megjelenítéséhez kanfigurálható (lásd még a C.11. ábrát): •
ikonok,
•
ikonok és címkék (a C.10. ábrán látható mód),
•
ikonok és leírások.
A C.12. ábrán a Library látható ikonok és leírások módban.
Kivezetések és müveletek A kivezetések és a múveletek az iPhone-programozás alapvető mechanizmusai, amelyeken keresztül összekapcsolhatjuk a programkódot a felhasználói felület (UI) elemeivel. Kivezetések használatakor a programkód programozottan hivatkozhat a felhasználói felület elemeire, amelyek a különböző elemek által kiváltott eseményeket kezelő ese-
View Controller - A controller tN;t suppons the fundamentil vít~·-m~nageme:nt
controller thu tna~ges NVI~ i on through a hJetouc.hy
ménykezelőkként működnek.
Noha a múveleteket és a kivezetéseket programkód írásával is csatlakoztathatjuk, az Interface Builder leegyszerúsíti ezt a folyamatot azzal, hogy engedélyezi a kivezetések és a múveletek húzással történő csatlakoztatását.
Kivezetések és létrehozása
model in
N.avlg.ation Controller - A
T~b
l.u Controller - A controller
tN t
m~agts
a set of view
controUen ch.lt reprnent t.lb Table View Conu-o lier - A controlter that managts a tab1e
vtew.
View ControUu l c tr-
műveletek
Premdes view- management fun Write Class Files (fájl };> osztályfájlok írása) menüpontot. Ekkor az Interface Builder létrehozza az Idencity Inspector ablakban hozzáadott kivezetésekhez és műveletekhez tartozó programkódot Ha ezt a beállirást használjuk, az Interface Builder először rákérdez, hogy le kívánjuk-e cserélrú az elemvezérlő fájlt (ha már létezik), vagy hozzá szereménk-e fűzni az új adatokat. Ha lecseréljük a meglévő fájlt, akkor a fáj lon végzett C.14. ábra valamennyi módosítás elvész. Ha hozzáfűzzük az adatokat a meglévő fájlhoz, akkor megadha~uk, hogy a programkód mely részei kerüljenek a fájlba. Ez a lehetőség biztonságosabb. Az Interface Builder által generált programkód esetén a kivezetéseket nem használjuk tulajdonságként. A tulajdonságok használatához manuálisan kell megadnunk a programkódot (a @prope rt y és a @synthesi ze kulcsszavakat) a tulajdonságok fogadóinak és indítóinak a generálásához.
Megjegyzés A kivezetéseket és a műveleteket általában mindig könnyebb manuálisan definiálni, mint az Interface Builder használatávaL
460
Kivezetések és műveletek
Kivezetések és müveletek csatlakoztatása A kivezetések és a
műveletek
elemekhez
történő
csatlakoztatásának két módszere van.
1. módszer Kivezetések csatlakoztatásához a Control billentyú nyomva tartásával húzzuk a File's Owner elemet arra az elemre, amelyhez csatlakozni kívánunk Qásd a C.15. ábrát).
"' Please enter you r name
C.lS. ábra
Az egérgomb felengedésekor megjelenik egy lista, amel yből kiválaszthatjuk a megfelelő kivezetést. A kivezetések definiálásakor (akár az Idencity lnspector ablakban, akár programkód használatakor) megadhatjuk, hogy a kivezetés rnilyen típusú elemre vonatkozik. Az egérgomb felengedésekor az Interface Builder csak a megadott elemtípushoz tartozó kivezetéseket jeleníti meg. Ha például az myoutl etl elemet ursutton-ként definiáltuk, majd a File's Owner elemet a Control billentyú nyomva tartásával a View ablak Text field elemére húzzuk, akkor a myoutl etl nem szerepel a kivezetések listájában. Műveletek csatlakoztatásához a Control billentyú nyomva tartásával húzzuk az elemet az . xi b ablakban lévő File's Owner elemre Qásd a C.16. ábrát).
Please enter your name
OK
C.16. ábra
461
C függelék: Az Interface Builder használata
Az egérgomb felengedésekor megjelenik egy lista, amelyból kiválaszthatjuk a megfelelő múveletet. A kivezetések és a múveletek csatlaHelloWorldV•ewController .••b koztatását követően hasznos lehet, ha a File's Owner elemre jobb gombbal kattintva megtekintjük az összes kapcsolatot. A C.17. ábrán látható, hogy a File's Owner elem a myout l etl kivezetésen keresztül a Text Field elemhez, a Button elem Touch up Inside eseménye pedig a myActi on l: múvelethez kapcsolódik. Felmerül a kérdés, hogy hogyan ismeri fel a Button elem azt, hogy a Touch up Insi de elemet (nem pedig más eseC.17. ábra ményt) kell a myActi on l: múvelethez kapcsolni, amikor a Conttol billentyú lenyomásával a Button elemet a File's Owner elemre húzzuk. A Tou ch up In si de eseményt annyira gyakran használjuk, hogy ez az alapértelmezett esemény, amikor az elemeket a Control billentyúvel húzzuk. Előfordul hat azonban, hogy az alapértelmezett esemény helyett egy másik eseményt kívánunk csatlakoztatni. A második módszer ezt mutatja be.
2. módszer A másik módszer a kivezetések csatlakoztatására, ha jobb gombbal kattintunk a File's Owner elemen, majd a kivezerést közvetlenü1 az elemhez kapcsoljuk (lásd a C.18. ábrát). HelloWorldVtewCont•oller •lb
Please enter your name
OK
C.18. ábra
Múveletek csatlakoztatásához összekapcsolhatjuk a releváns múveletet azokkal az elemekkel, amelyekhez kapcsolódni kívánunk (lásd a C.19. ábrát). Az egérgomb felengedésekor megjelenik egy eseménylista, amelyből kiválaszthatjuk a megfelelő eseményt.
462
Kivezetések és műveletek V' ew
He'loWordVi@wController xob
Please enter you r name
Otd [n d On b rt
.
[dlllnf1 (h.lnQotd Ed•t•n~
Old Sc-Q•n
Edtltr.Q Dtd End
Touct'l C•n operátorral közvetlenül hozzáférünk egy osztály mezőihez. Ám ez nem eszményi megoldás, ideális esetben a mezőinket tulajdonságok formájában kellene kiemelnünk. Az Objective-C 2.0-s verziója előtt a programozóknak a következőképpen kellett deklarálniuk a metódusokat, hogy a mezőket a többi osztály számára hozzáférhetővé tegyék: #import @class Anotherclass; @i nterface someclass : NSObject { Anatherclass *anotherclass; float rate; NSString *name; }
//---expose the rate field--- (fl oa t) rate; -(void) setRate:(float) value; //---expose the name field---(NSString *) name; -(void) setName:(NSString *) value;
//---get the value of rate--/1---set the value of rate
//---get the value of name--1/---set the value of name---
@end
Ezek a metódusok getter (lekérdező) és setter (beáffító) néven ismertek (néha accessor és mutator néven is említik őket). Megvalósítás uk a következőképpen történik:
475
D függelék : Objective-C gyorstalpaló
#import "Someclass.h " @implementation someclass -(float) rate { return rate; }
-(void) setRate:(float) value { rate = value;
-(NSString *) name { return name; }
-(void) setName:(NSString *) value { [value retain]; [name release]; name = value; }
@e nd A tulajdonságok értékeinek beállításához a set kulcsszó prefixummal ellátott metódusait kell meglúvni: Someclass *sc= [[someclass alloc] init]; [sc setRate:S.Of]; [sc setName:@"Wei - Meng Lee"]; Illetve használhatjuk az Objective-C 2.0-s újdonságát, a pontjelölést: someclass *sc = [[someclass al l oc] init]; sc. rate = 5; sc.name = @"Wei-Meng Lee"; A tulajdonságok értékeinek beolvasásához vagy közvetlenül a metódusokat kelllúvnunk, vagy az Objective-C 2.0-s verziójában a
pon~elölést
alkalmazhatjuk:
NSLog([sc name]); //--- call the method--NSLog(sc.name); //--- dot notation Ha szeretnénk egy tulajdonságot írásvédetté tenni, csak el kell távolítanunk a set kulcsszó prefixummal ellátott metódusát. A setName: metódusban különbözó utasítások használják a retain és a release kulcsszavakat. Ezek a kulcsszavak az Objective-C memóriakezeléséhez kapcsolódnak (a kulcsszavakról
476
bővebben
lásd alább).
Osztályok
Az Objective-C 2.0-s verziójában a mezők tulajdonságként való kiemeléséhez nem kell getter és setter metódusokat definiálni. Ezt a @property és a @synthesi ze forclitódirektívákkal is elvégezhetjük. Ugyanebben a példában a következőképpen emelhetjük ki tulajdonságként a rate és a name mezőket a @property direktíva használatával: #import @class Anotherclass; @interface someclass : NSObject { Anatherclass *anotherclass; float rate; NSString *name; }
@property float rate; @property (retain, nonatomic) NSString *name; @end
Az első @property utasítás tulajdonságként definiálja a rate mezőt. A második utasítás szintén tulajdonságként definiálja a name mezőt, de meghatározza a tulajdonság viselkedését is. Ebben az esetben a viselkedést retai n és nonatomic tulajdonságok szabályozzák (ezeket lásd a fejezet későbbi, memóriakezeléssel kapcsolatos részében). A non atomi c azt jelenti, hogy a tulajdonsághoz nem lehet szálbiztos módon hozzáférni. Ez teljesen rendben van, ha nem többszálú alkalmazásokat készítünk. Rendszerint a retai n és a nonatomi c lehetőségek kombinációját használjuk a tulajdonságok deklarációja során. A megvalósírási fájlban ahelyett, hogy getter és setter metódusokat definiálnánk, egyszerűen a @synthesi ze kulcsszóval rá vesszük a fordító t, hogy au tomatikusan készítse el a getter és setter metódusokat: #import "someclass.h" @implementation someclass @synthesize rate, name; @end
Egyetlen @synt hesi ze kulcsszóval több tulajdonságot kombinálhatunk Ám önálló utasításokra is elkülöníthe~ük őket: @synthesize rate; @synt hesize name;
477
D függelék: Objective-C gyorstalpaló
Ekkor a megszokott módon
használha~uk
a tulajdonságainkat:
//---setting using setRate--[sc setRate:S.Of]; [sc setName:@"wei-Meng Lee"]; //---setting using dot notation--sc.rate =5; sc.name = @"Wei-Meng Lee"; /1---getting--NSLog([sc name] ); //---using the name method NSLog(sc.name); //---dot notation
Ha szeretnénk egy tulajdonságot írásvédetté tenni, a readonly kulcsszót kell használnunk. A következő utasítás írásvédetté teszi a name tulajdonságot: @property (readonly) NSString *name;
lnicializátorok Amikor egy osztály példányát elkészí~ük, rendszerint ugyanakkor inicializáljuk is. Például az előző példában (az Osztályok példányosítása círnú részben) az alábbi utasítás szerepelt: someclass *sc
=
[[someclass alloc] init];
Az all oc kulcsszó lefoglalja az objektum számára a memóriát, és amikor a program viszszaadja az objektumot, az alkalmazás ennek inicializálásához az objektumorr meghívja az init metódust. A someclass osztályban nem definiáltunk init nevú metódust. Honnan származik ez esetben az init metódus? Valójában az NSObject osztály definiálja, amely az Objective-C nyelvben a legtöbb osztály alaposztálya. Az i ni t metódus inicializátorként ismert. Ha további inicializátorokat szeretnénk létrehozni, olyan metódusokat készíthetünk, amelyek az i ni t szóval kezdődnek. (Az i ni t szó használata inkább mintának számít, nem kőbe vésett szabály.) #import @class Anotherclass; @interface someclass : NSObject { Anatherclass *anotherclass ; float rate ; NSString *name;
478
Osztályok -(void) -(void) - (void) +(void)
dosomething; dosomething:(NSString *) str; dosomething:(NSString *) str withAnotherPara :(float ) value; alsooosomething;
- (id)initWithName:(NSString *) n; - (id)initWithName:(NSString *) n andRate:(float) r; @property float rate; @property ( retain, nonatomic) NSString *name; @end
Az
előző
példa két további inicializátort tartalmaz: ezek az i ni twi th Name: és az i ni tk öve tkezőképpen biztosítha~uk a két inicializátor megvalósításait:
wi th Name: andRate:. A
#import "someclass . h" @implementation someclass @synthesize rate , name; - (id)initwithName:(NSString *) n { return [self initwithName:n andRate:O.Of]; }
- (id)initwithName:(NSString *) n andRate:(float) r { if (self = [super init]) { self.name = n; self.rate = r; }
return self; }
-(void) dosomething { } -(void) dosomething:(NSString * ) str { } -(void) dosomething:(NSString *) str withAnotherPara:(float) value { } +(void) alsooosomething { } @end
479
D függelék: Objective-C gyorstalpaló
Az initwithName:andRate: inicializátor megvalósításban először a super (alap)osztály i ni t inicializátorát hívjuk, hogy az alaposztályának megfelelő inicializálásáról gondoskodjunk, erre az aktuális osztály inicializálása előtt van szükség: - (id)initWithName : (NSString *) n andRate:(float) r if (self ; [super init]) // .. . // .. . return self;
Az inicializátorok definiálásának a szabálya rendkívül egyszerű. Ha az osztályt megfelelő en inicializál tuk, a self hivatkozásár (tehát az i d típus t) kell visszaadnia. Ha az inicializálás sikertelen, a visszaadott érték ni l. Az i ni twi th Name: inicializátor megvalósításakor az i ni twi th Name: andRate: inicializátort hívja: - (id)initWithName :(NSString *) n return [self initWithName:n andRate:O.Of];
Általában, ha több olyan inicializátorral rendelkezünk, amelyek mindegyike különböző paraméterekkel dolgozik, érdemes őket láncolnunk úgy, hogy biztosítsuk egyetlen inicializátort hívjanak, amely végrehajtja a szuperosztály i ni t inicializátorának a hívását. Az Objective-C nyelvben az az inicializátor, amely elvégzi a szuperosztály i ni t inicializátorának a hívását, a kijelölt (designated) inicializátor.
Megjegyzés Általános szabály, hogy az a kijelölt inicializátor, amely a legtöbb paraméterrel rendelkezik.
Ha szeretnénk az inicializátorokat használni, most már a példányosításkor is hívha~uk őket Someclass *scl someclass *sc2
480
[[someclass al loe] initWithName:@"wei-Meng Lee" andRate:35]; [[Someclass alloc] initWithName:@"wei-Meng Lee"];
Memóriakezelés
Memóriakezelés Az Objective-C programozásban (különösen az iPhone esetében) a memóriakezelést minden iPhone-fejlesztőnek ismernie kell. Más népszerű nyelvekhez hasonlóan az Objective-C tárnoga~a a szemétgyűjtést, amely segít eltávolítani a használaton kívüli objektumokat, arnikor azok kikerülnek a program hatóköréből, és így újrahasznosítható memóriát szabadít fel. Mivel azonban a szemétgyűjtés megvalósítása hatalmas többletköltséget jelent, az iPhone nem támogatja. Ezért a fejlesztőre hárul a feladat, hogy manuálisan lefoglalja az objektumok számára a memóriát, majd felszabadítsa, ha már nincs rá szükség. Ebben a részben a memóriakezelés különböző szempontjait vizsgáljuk meg az iPhone-on.
Referenciaszámlálás Az objektumok számára lefoglalt és felszabadított memória kezeléséhez segítségként az iPhone OS a rr:ftrr:nciaszámlálás rendszerével követi nyomon az objektumokat annak meghatározásához, hogy még mindig szükség van-e rájuk, vagy már megszabadulhatunk tőlük. A referenciaszámlálás gyakorlatilag minden objektum számára egy számlálót használ, és az objektumok létrehozásakor a számláló értéke 1-gyel növekszik. Ha a program az objektumot elengedi, a számláló értéke 1-gyel csökken. Amikor a számláló értéke eléri a O-át, az objektumhoz tartozó memóriaterületet az operációs rendszer visszaköveteli magának. Az Objective-C nyelvben a memóriakezeléshez néhány fontos kulcsszó tartozik.
a lloc Az a ll oc kulcsszó foglalja le a memóriát az általunk készített objektum számára. A könyv szinte valamennyi példájában láthattuk ezt a kulcsszót. Például: NSStri ng *str
=
[[NSStri ng al loe] initWithstring:@"Hello"];
Ebben a példában egy NSS tri ng objektumot készítünk, és egy alapértelmezett sztringgel példányosí~uk. Amikor az objektum elkészült, az objektum referenciaszámlálója 1. Mivel mi készítettük, a mi felelősségünk, hogy felszabadítsuk a lefoglalt memóriát, ha már nincs szükségünk az objektumra.
Megjegyzés Az objektumok elengedésével kapcsolatban további részleteket
a re l ease-ről szóló részben találunk.
481
D függelék: Objective-C gyorstalpaló
Hogyan tudjuk megállapítani, hogy egy objektumnak van-e tulajdonosa, és ki az? meg a következő példát:
ézzük
NSString *str ; [[NSString alloc] initWithString:@"Hello"]; NSString *str2 ; str; Itt az all oc kulcsszót használjuk az st r esetén, tehát az st r a rniénk. Ezért nekünk kell az objektumot elengednünk, amikor már nincsen rá szükségünk. Az str2 azonban egyszerűen egy str objektumra mutat, tehát az str2 nem hozzánk tartozik, ez azt jelenti, hogy nem nekünk kell az st r 2 objektumot elengedni, arnikor már nem használjuk.
new Azonkívül, hogy az alloc kulcsszóval foglalunk memóriát egy objektum számára, a new kulcsszót is használhatjuk a következőképpen: NSString *str; [NSString new]; A new kulcsszó funkcionális szempontból
egyenértékű
az alábbi utasítással:
NSString *str ; [[NSString al l oc] init]; Az a ll oc kulcsszóhoz hasonlóan a new kulcsszó használatakor az objektum a mi tulajdonunkba kerül, ezért a mi feladatunk elengedni, ha már nincs rá szükség.
retain A retai n kulcsszó az objektum referenciaszámlálójának az értékét 1-gyel növeli. Vizsgáljuk meg az előző példát: NSString *str ; [[NSString alloc] initWithstring :@" Hello "]; NSString *str2 ; str; Az str2 objektumot nem birtokoljuk, mert az objektumon nem használjuk az alloc kulcsszót. Ha az st r objektumot elenged jük, az str2 érvénytelenné válik.
Megjegyzés Hogyan kell az st r 2 objektumot elengedni? A program automatikusan elengedi. További információkat a Kényelmifüggvényekés az autorelease" című részben találunk.
Haszeretnénk biztosítani, hogy az str2 akkor is a rendelkezésünkre álljon, ha az str objektumot elenged jük, a retai n kulcsszót kell alkalmaznunk
482
Memóriakezelés NSStr i ng *st r = [ [NSStri n g a ll oc] i ni twi t hStr i n g: @"He ll o" ] ; NSString *str2 = str; [str2 retai n]; [str release];
Az előző esetben az str referenciaszámlálójának értéke már 2. H a elengedjük az str objektumot, az str2 érvényes marad. Amikor már nincsen szükségünk az str2 objektumra, manuálisan kell elengednünk
Megjegyzés Általános szabály, hogy {az alloc vagy a retain kulcsszó alkalmazásával) egy objektum tulajdonosaiként a mi feladatunk az elengedése.
release Amikor végeztünk egy objektummal, a re l eas e kulcsszó használatával manuálisan el kell engednünk: NSString *str
=
[[NSString al loe] ini tWithString: @"Hello"];
// ... do what you want with the object . . . [str release];
Amikor egy objektumon a release kulcsszót alkalmazzuk, az objektum referenciaszámlálójának értéke 1-gyel csökken. Ha a számláló értéke eléri a O-át, az objektumhoz tartozó memóriaterületet a program elengedi. A re l eas e kulcsszóval kapcsolatban rendkivül fontos szem pont, hogy nem engedhetünk el olyan objektumot, amely nem a rni tulajdonunk. Nézzük meg például az előző rész példáját: NSString *str = [[NSString alloc] initWithString:@"Hello"]; NSString *str2 = str; [str release]; [str2 release]; //---this is not OK as you do not own str2---
Ha megpróbáljuk elengedni az str2 objektumot, futásidejű hibát kapunk, ugyanis nem engedhetünk el olyan objektumot, amelyet nem rni birtokolunk. Ha a re ta i n kulcsszó alkalmazásával megszerezzük az objektum tulajdonjogát, használnunk kell a re l eas e kulcsszót: NSString *str = [[NSString alloc] initWithstring :@" Hello"]; NSString *str2 = str; [st r 2 re ta i n] ; [st r rel eas e]; [str2 release]; //---this is now OK as you now own str2---
483
D függelék: Objective-C gyorstalpaló
A tulajdonságokat ismertető részben definiáltuk a setName: metódust, ahol beállitottuk a name mező értékét: -(void) setName:(NSString [value retain]; [name release]; name = value;
*)
value {
} Először
megtartottuk a value objektumot, majd elengedtük a name objektumot, és végül a name objektumhoz rendeltük a va l ue objektumot. Kérdés, rniért kell ezt tennünk ahelyett, hogy a következőket használnánk -(void) setName:(NSString name = value;
*)
value {
Ha szemétgyújtést használnánk, az előző utasítás érvényes lenne. Mivel azonban az iPhone OS nem támoga~a a szemétgyújtést, ezért az előző utasítás hatására az eredeti objektum, amelyre a name objektum hivatkozik, elveszne, és ez memóriaszivárgáshoz vezetne. A szivárgás megelőzéséhez először meg kell tartanunk a va l ue objektumot, és jeleznünk kell, hogy igény tartunk a tulajdonjogára; majd el kell engednünk az eredeti objektumot, amelyre a name hivatkozik. Végül a va l ue objektumot a name objektumhoz rendeljük: [value retain]; [name re l ease] ; name = value;
A REFERENCIASZÁMLÁLÁS MEGVILÁGÍTÁSA ANALÓGfÁVAL A referenciaszámlálással működő memóriakezelés vizsgálatakor érdemes a való életből származó analógia segítségével a megfelelő megvilágításba helyezni a témakört. Képzeljünk el a könyvtárban egy szobát, amelyet tanulási célokra lefoglalhatunk Kezdetben a szoba üres, ezért a lámpák nem világítanak. Arnikor lefoglaljuk a szobát, a könyvtáros növeli egy számláló értékét, amely jelzi, hogy a szobát hány ember használja. Ez az annak az analógiája, arnikor az alloc kulcsszóvallétrehozunk egy objektumot. Amikor elhagyjuk a szobát, a könyvtáros csökkenti a számlálót, és ha ennek az értéke O lesz, akkor ez annyit jelent, hogy a szobát nem használja senki, és a lámpákat le lehet kapcsolni. Ez ahhoz hasonlatos, amikor a re l ease kulcsszóval elengedünk egy objektumot. Előfordulnak alkalmak, arnikor lefoglaljuk a szobát, és csak egymagunk üldögélünk benne (tehát a számláló értéke 1), egészen addig, amíg egy barátunk meg nem jelenik. Lehet, hogy csak bennünket látogat meg, ezért nem jelentkezik be a könyvtárosnál, így a számláló értéke nem növekszik. Mivel csak látogatóba jött, és nem foglalta le a szobát, ezért nincs joga eldönteni, hogy a lámpák világítsanak-e, vagy le kell kapcsoini őket. Ez
484
Memóriakezelés
annak az analógiája, amikor egy objektumot az all oc kulcsszó alkalmazása nélkül rendelünk egy másik változóhoz. Ha ekkor elhagyjuk a szobát (elengedjük), a könyvtáros lekapcsolja a villanyt, és a barátunknak is távoznia kell. Gondoljunk végig egy másik helyzetet, amelyben a szobát használjuk, majd valaki más szintén lefoglalja és megosztja velünk. Ekkor a számláló értéke 2. Ha elhagyjuk a szobát, a számláló értéke 1-re csökken, de a lámpák továbbra is világitanak, mert a másik személy a szobában marad. Ez hasonlít ahhoz a helyzethez, amikor létrehozunk egy objektumot, és másik változóhoz rendeljük, amely a retain kulcsszót alkalmazza. Ebben a helyzetben az objektumot a program csak akkor engedi el, ha mindkét objektum elengedi.
Kényelmi függvények és az autorelease Eddig arról volt szó, hogy minden objektum, amelyet az alloc vagy a new kulcsszóval készítünk, a mi birtokunkba kerül. Vizsgáljuk meg a következő esetet: NSString *str
[NSString stringWithFormat:@"%d", 4];
=
Ebben az utasításban az str objektum nincs a birtokunkban, ugyanis az objektumot az egyik kbryelmi fiiggvé'!J (convenience method) alkalmazásával hozzuk létre. Ezek statikus metódusok, amelyekkel közvetlenül allokálhatunk és inicializálhatunk objektumokat. Az előző esetben létrehozunk egy objektumot, de az nincs a tulajdonunkban, ezért kézzel nem tudjuk elengedni. Valójában az ezzel a metódussal elkészített objektumok au/orelease, vagyis önmagukat automatikusan felszabadító objektumok. Minden autore/ease objektum ideiglenes, amelyet egy erre a célra kialakított gyűjtőhely, az autore/ease pool tárol. Amikor az aktuális metódus kilép, minden objektumot, amelyet a metódus magában foglalt, a program elenged. Az autorelease objektumok olyankor hasznosak, ha csupán néhány átmeneti változót szeretnénk használni, és nem szeretnénk a saját dolgunkat foglalásokkal és felszabadításokkal nehezíteni. Az alapvető különbség az a ll oc (vagy a new) kulcsszó segitségével elkészült objektumok és a kényelmi függvényekkellétrehozott objektumok között a tulajdonjog: NSString *strl = [[NSString al loe] initWithFormat:@"%d", 4]; [strl release]; //---this is ok because you own strl--NSString *str2 = [NSString stringwithFormat:@"%d", 4]; [str2 release]; //---this is not ok because you don't own str2--//---str2 will be removed automatically when t he autorelease pool i s activated---
Ha a kényelmi függvény alkalmazásakor szeretnénk egy objektum tulajdonjogát megszerezni, a re ta i n kulcsszót használhatj uk: NSString *str2
=
[[NSString stringWithFormat:@"%d", 4] retain];
485
D függelék: Objective-C gyorstalpaló
Az objektum elengedéséhez az autore l eas e vagy a re l eas e kulcsszót alkalmazha~uk. A release kulcsszó azonnal csökkenti a referenciaszámláló értékét 1-gyel, és a program azonnal felszabadí* az objektum által foglalt memóriát, amikor az referenciaszámláló értéke eléri a O-t. Ezzel ellentétben az autorelease kulcsszó azt ígéri, hogy 1-gyel csökkenti a referenciaszámláló értékét, ám nem azonnal, hanem valamikor később. A következő programkód ezt mutatja be: NSString *str = [[NSString stringWithFormat:@"%d", 4] retain]; [str autorelease]; //you don't own it anymore; still available NSlog(str); //still accessihle for now
Megjegyzés Miután automatikusan elengedtünk egy objektumot, többet már nem kell elenged nünk.
Az NSString *str2 = [NSString stringWithFormat:@"%d", 4];
utasítás hatása ugyanaz, mint a következő utasításé: NSString *str2 =@"4";
Noha az autoreiease objektumok látszólag megkönnyítik a dolgunkat a használaton kívüli objektumok automatikus elengedésével, az objektumok alkalmazásakor nagyon körültekintően kell eljárnunk. Nézzük meg a következő példát: for (int i=O; i •PLAUP,
formauon
•
ll'!
~·DVD fil Image úprure
*
Alrttort Utth ty AUd•O Mlrn Setup
VfYirt
: , .Photo íJ rSync
gouuop ~--~tlgiH
.: ,Tunes
~Appi'(.it.l!(r!J
'3
Drcc!,.".~,.l.i
Web IWorlc '09
~ Kt''f'(".it.'f'!AcaU
......
'l' SEAftC.H fOlt
MICfCISOft Offitt 2004
(l
.:;; Tod.;t.y
OpenOfflce.OI'g
. "'"""'
Photo Boott1
.:) YHtt:rd,l)' 0 ~>UlWHk
\lers•ofl •-0-2
O!JicknmePlliyer
~AJ~n lii.A.I MoviH
!il A:l Oocument'l
Stldu~
Svste:m Prl!ferences
1 TtxtEd:t nme Mach; nt
"---------=-"'lJ1•rtoes
E.2. ábra
A Keychaill Access alkalmazásban válasszuk a Keychaill Access ~ Certificate Assistant menüt, majd a Request a Certificate From a Certificate Authori ty (tanúsítvány kérése egy tanúsítványkibocsátótól) menüpontot (lásd az E.3. ábrát) . File
Edit
About Keychain Access
Preferences . Keychain First Aid Cert1ftcate Assistant Kerberos Ticket Viewer Services
X, \:XA • \:OXK
•
Hide Keychain Access Hide Others
XH \:XH
Qu it Keychain Access
XQ
Open .. Create a Certificate ...
Create a Cert1flcate Authority . Create a Cert•ftcate For Someone Else as a Certiflcate Authonty ... Request a Certiflcate From a Certiftcate Authonty .•. ·~ - ~ - - • Set the default Certlftcate Authority... Evaluate "Apple Worldwide Developer Relations Certiflcation Authority" ...
'
E.3. ábra
497
E függelék: Tesztelés konkrét iPhone-on vagy iPad Tauchon
A Certificate Assistant ablakban (lásd az E.4. ábrát) adjuk meg az e-mail címünket, válasszuk a Saved to Disk (lemezre mentve) rádiógombot, majd jelöljük be a Let Me Specify Key Pair Information (én adom meg a kulcspáradatokat) jelölónégyzetet. Kattintsunk a Continue (folytatás) gombra. Cert•ficate Assistant
Certificate Information Enter informat ion for the certifi cate vou are requesting . Cllck Cont inue to request a cert1ficate from the CA.
CA Email Address Req uest Js.
v
Emillied to the CA ~\led to d sk
Let me specify key pair Informatio n
E.4. ábra
Válasszuk a 2048 bites kulcsméretet és az RSA algoritmust (lásd az E.5. ábrát). Kattintsunk a Continue gombra. Cert•ficate Assistant
Key Pair Information Specify the key size and algori thm used to create your key pa ir.
The key pa1r ls made up of your pn vate and publi c keys . The prívate key is t he .secret part of the key pa1r and shou ld be kep t secret. The publi c key is made publicly available as part of the d tgital certifkate Key Stze Algonthm
204 8 bits
JTI
_RSA -'------:::JTJ -'C.J :
{ Learn More
Continue
E.S. ábra
498
Bejelentkezés az iPhone
fejlesztői
program portáljára
A program arra kér, hogy mentsük el a kérelmet egy fájlba. Használjuk a felajánlott alapértelmezett nevet, és kattintsunk a Save (mentés) gombra (lásd az E.6. ábrát). Certiftcate Ass1stattt Save As: Wh ere: • _
_:j
Ot!Sk[op
( Cancel) ~
...___....,
.~:U
E.6. ábra
Bejelentkezés az iPhone program portáljára
fejlesztői
A tanúsítvány-aláírási kérelem létrehozása után be kell jelentkeznünk az Apple iPhone fejlesztői központjába (lásd az E.l. ábrát). Kattintsunk az iPhone Developer Program Portal hivatkozásra az oldal jobb oldalán. Az oldal eléréséhez 99 dollárt kell fizemünk .
.;~
iPhone Devetoper Progn.m
l~~flrOf'JJ'II'OfU'
Developing for iPhone OS 2.2.1 ~GtkDdiJOl.,
......
.......,,..,., ..... ",-.nfor ~~IOftlfor~ -"IPod~-
~lopme.nt
Resources
Ot~
""-· ~ 7,l00t
o
Suopon CdW'
""'*~lb
..-.. a..cc~......n-..
--.......
T.--.
......_.Deu'-.""
""'1,l009 Oct 10. 1001 . . 7.ZGOt
Gott&~l"'·bt·MoCMI....
of....,.
yOu(Miflo•ttwl'fotr. . IIOtUI.,. lJ ~,~~'~U
CCW~tCt-... ~.,...
~~IW.u.n.Mcnt
Futured Content
• w c.m.. SIMIM
;fvt~H (Ont«.C
._...T_\1chos ..._..~t-........,__.
DIK~t
..... ~.c....
c.w. ~li"fltcMWfU.IIfw""-
E.7. ábra
499
E függelék: Tesztelés konkrét iPhone-on vagy iPod Touchon
Figyelmeztetés Regisztráljunk időben, mert a jóváhagyási folyamat eltart egy darabig- pár órától akár napokig is.
A portálon kattintsunk a Launeh Assistant (segéd elindítása) gombra (lásd az E. 8. ábrát), amely elvezet az iPhone felkészítésétől a fejlesztői tanúsítvány létrehozásáig.
...
Progriom Portil
.... CerttfiaCH
_ .......
Welcome to the iPhone Developer Program Portal The IPhont Dwf:loper PrQ9r1m Pottili tS ~~tgne d tO Uke you thn>uSih the nKess;uy s tt ps to t ts t ~r app{ tc.ttiOos on •Ptione 11nd 'Pod touch a.nd prepue
them for d.unb"'bOn
.u. • Cet you r appliCAtion on an ll"hone .,.,lth 1he Development ".ovtslonll'\iil Assistant
..... ,..,.,.,..Ad-II.VQUUO ~l•""r.t
111' the~"'""""
Ofto"'9
to crta!• rel II'I1.QIII • .....__.,. ""oftlit MloCS "...,..,..
~C..,I>att-~tobulditiiiCI.",ul~~··e
" ........ ""rot~ M'Ó '"" tou(h,
1 .~ Aun.1.1.r11
..."""·'~ ...
. ..
~.
Ah~O.wtorQ
"""'
· ~=
lOs
·~=UO!úft;PndUu Announcemenu "'- 14 2001
•
Get tM: App Store rNdy for your ~PP
E.8. ábra
Megjelenik az üdvözlőképernyő. Ekkor kattintsunk a Continue gombra. A segéd megkér egy alkalmazásazonosító (App ID) létrehozására (lásd az E.9. ábrát). Az alkalmazásazonosító az iPhone-unkon lévő alkalmazás(ok) egyedi azonosítására szolgáló karaktersor. Adjunk neki egy olyan nevet, amely leírja ezt az azonosítót (ezt az Apple generálja). Kattintsunk a Continue gombra. A következő képernyőn egy leírást kell adnunk az iPhone-unkról/iPod Touchunkról. Be kell írnunk az eszközazonosítót (lásd az E.10. ábrát) . Kattintsunk a Continue gombra. Ekkor elküldhetjük a tanúsítvány-aláírási kérelmet az Apple-nek (lásd az E.11. ábrát). A képernyőn látható utasítások az eddig végrehajtott lépések. Kattintsunk a Continue gombra.
500
Bejelentkezés az iPhone fejlesztői program portáljára "'""" .-~·-··- --~- ""'-'"':·i·:r
~ ~veio~e~r Pr~;~T;~;-~g As~[;~~~~
-~
"?...,, ---or-'"' :-~;,
~~·-·
·'"!~'.~~~'"t"-~~-~
Setup
•
Name your Provision ing Profile A rtoo.lbiorung ProfT~ és a COII«ttift of your Agp 10, Apple deVIce UOIO, aM ~'*'ont [)to.totJopment Ct>nofoatt d'M.t .news ~to W1SQJI yout appbc.M1on on your ~e.
-
Enter il common Mme or description for you r Pro11isfonlng ProOle uslng al p ha..numerlc chuacters.. The description you specify will be used throughout the Program Pon.a.J to ldentlty this Provlslonlng Pronl~
Profile Dtscrlpllon: [umZDeveJopProfllt, You c.t'lnot
U )or;
~
Cb.M.ctt.r' s.uc:h U . . &. •, • in VOU'
IOn
App tD
Lurn1Dew:lop
Otvkt
MyiPhone
Cffl•f•ute Niln'lt
Wel- Mf:ng Lee
r- c~c.. E.12. ábra ~....-"·- '..-~lOningAsst$~ .......-.--~~.._~c;-~~
- .·
~
Configur•
•
Generate you r Provisioning Profile
,.ov Prot'e Mme
Lu.m2DtWiopProfile
App ID
Lurn2~w:lop
Dtvtc.:t
Myil'hOf'le
G
Wel-Me.ng U:e
G
CM.!f•ate NolrM
YCH.Ir Provislonmg Proflit hu bet:n
G
gent:ra~.
G
E.13. ábra
503
E függelék: Tesztelés konkrét iPhone-on vagy iPad Tauchon
Downl~d
& tnsQJI
•
Download & Install Your Provisioning Profile
Step 1: Down load
1/J
Lurn2DevelopProfllc
Oownlo6d Now
Step 2:
..
lnst~ll
ConnKt your devie~ to yo:Jr ~c olnd dr~g th~ downloaded Provi.s.a"""~ Pro~Uoe lnto the 'Orgm•zer' 'Window W~th • n Xcode . Th-s Wi ll
;,.utomuluJiy tnstall the .mob'leprovls·on filem lht proper folder
E.14. ábra
Download & Install
•
Download & Install Your Provisioning Profile
Step 3: Verify Provls lon ing Profile lnstallatlon Your Provislerung Profi!e file should appur in the of Xcode's Organizer Window.
Provislon . ng~
sectton wuh.n the Summarytab
-·---
__
~ -
Cancel
E. lS. ábra
504
...
_...__.
Bejelentkezés az iPhone fejlesztői program portáljára
Úgy ellenőrizhetjük a pro@ megfelelő telepítését, hogy az Organizer alkalmazásban megnézzük a Provisioning részt (lásd az E.16. ábrát).
o
Organiur
Summary
iPhone Name: Ca~dty.
7.07 GB
Provisloning
[ J+ifif$J,f55Ridfl
Appllc.tt ions
..
At1 1 ~tion
• ItA Bl.lc.lt ~.Jek • - ••- -,mbfrQ
+ · o- m
•' •.. ..
•
E. lG. ábra
Az iPhone fejlesztői program portáljáról most már letölthetjük és telepíthetjük a fejlesztői tanúsítványt az eszközünkre. Kattintsunk a D ownload Now gombra (lásd az E.17. ábrát) a tanúsítvány letöltéséhez a szárnítógépünkre. Kattintsunk a Continue gombra. A D ownloads mappában kattintsunk duplán a letöltött dev el ope r _i dentity . cer fájlra, hogy telepítsük a jelszókezelőbe. Amikor a rendszer kéri (lásd az E.18. ábrát), kattintsunk az OK gombra. Az iPhone fejlesztői program portálján időközben megjelenik, hogyan ellenőrizhet jük azt, hogy a tanúsítvány megfelelően lett-e telepítve a Keychain Access alkalmazásba (lásd az E.19. ábrát) . Kattintsunk a Continue gombra.
505
E függelék: Tesztelés konkrét iPhone-on vagy i Pad Tauchon
Download & Install
•
Download & Install Your Development Certificate
Step 1: Download Ocrwnlo.ad your IPhonr
Oevelopm~t
CtrtJf•cate
(.cer) file to your Mac.
! If you hi~ already downloaded and in stalied your Deve lopment Crrofin.te sk1p Step 2 and contmut to Ste p 3.
Step 2: Install On your Mac, double-dick the downiNCJed .cer
fl le to launeh Keydla1n Ace eu and Install your certificate..
---··-
0 -----.. - -....
E.17. ábra
Add Cortifiates Do you want to add the cert tficare(s) from the file
"developer_identity.cer" to a keychain?
Keychain. :-.:log =~i:n::_ _ _ _ __::..::JJ ( View Certitkates
E. lS. ábra
A Keychain Access alkalmazásban válasszuk a l ogin elemet, és keressük meg az i Phone oeve l ope r: you r name elnevezés ű tanúsítványt (lásd az E. 20. ábrát). Ha megtalál juk, akkor helyesen telepítettük.
506
Bejelentkezés az iPhone Dl!~topmf!nl
fejlesztői
program portáljára
Provlslorwng Assistant Downl oad & lnstil ll
•
Download & Install Your Development Certificate
Step 3: Veri fy you r pri vate and public keys ln Keychai n Access Venfy the lPhone Oe~loper povue and pub''' kt!ys an pa~re:d tagether in the Ke'f(h.J.•n Access apph~tton to ensore yo;Jr Certtflcate ts property configured on yoor ~ac
---
Team Lr:ader
Klnd .pub' ic key
Team t.uder
private key
~-
Kr,th.Ain Acceu on 'f'OUr
M~
Cancel
E.19. ábra OQO
Keych ain Access
o.
0 « to todc the logon lteyd\Ain
!Phone Develope r. Wel- Meng lee: lssued by Apple Wortdw.de DNe •ooe:r ~I.J.llons Certlfcatlon Authonty ExD•res Saturday, April 24, 2010 2 20 00 ~ GMT -+ 08 00
System
[ j System Roots
TI
s cen.i'K.lte •s v~•d Date: MocM'ied
Eli:Ptres
Ke~n
Internet pauword
Mar 20, 2009 9
log tn
A.r9ort network pass
W.:u lS. 2009 4
loo•n
appliution p.usword
MM 10, 2009 7
login
C.:Ut!90fV
Alllt!"S
;. !..
Passwords Certlflcates
[J Wy Cemfleates Keys
Secure Notes
we .menglee "
we'menglee we. .menglee: ~ we .menglee J we•menglee we .menglee: we'menglee
1'
log tn
public key .M.lc password
Mar 10.2009 8
pnv;,u key
logm log1n
pubnc key
log tn
pnvate key pnv.ne key
login
pub•le key
login
login
u .....
E.20. ábra
Már nem vagyunk messze attól, hogy telepíthessük az alkalmazásunkat az eszközünkre. Kattintsunk a Continue gombra (lásd az E.21 . ábrát).
507
E f üggelék: Tesztelés konkrét i Phone-on vagy iPod Touchon .....
#~
..
--~ ;:-~-:---::..:-
~~
v"C..-n ':"'...~~
Oevelopm!nt ProvtsJonlng Asslsu.nt
.... ~-"':'
~:
~·
·~
:;;,z. .... ·~-~v .... ~-:.::·-~- ...--..fl-
Build & Go
•
Install your iPhone appl ication w ith Xcode
Step 1. Launeh Xcode and open you r project
Step 2. Select a destlnation ln the
Pro~ct
the L>evtce
Window, select Oeb u g~
~vice ~
IPha ne os· from
drop down menu in the upper-
lefl~dcomer
Step 3. Bulld & Go Oick '"lu ild
~Go~
to insu../1 the .J.ppllatton on your
deVIce
If you h~e mu\llp!e PrcrvtSIOn>ng Ptofiles . ....,ew the tPhone De:wlopet Program User Guide fOf' nnruatons on sele(ttng PY"ov1Ston.ng Proftl
Clanes
A
Arumatlon .~p
~ Anlmatlon_Prefhqx:h " : An1matio nApp Oele:oate.h
b:
An1matlonAppDe1~ate.m
l!!] AntmationVIe'NCont roller.h
E.22. ábra
Az alkalmazás futtatásához nyomjuk meg a Command-R gombokat. A program engedélyt kér arra, hogy hozzáférjen a jelszótárotóba elmentett tanúsítványhoz. Az aláírás folytatásához kattintsunk az Allow (engedélyezés), vagy az Always Allow (engedélyezés mindig) gombra Qásd az E. 23. ábrát).
508
Bejelentkezés az iPhone
fejlesztői
program portáljára
( voi.d) onTi.er { t.aQ~i.et.~ . center
•
CGPotntJ1oke( t.:qe'Jt~ . center. x
• posttton . x,
1~\J.~ . center. y + po:
tf ( u:o;~eVtt!\,; .center. X>328 ll t PIOge\! t eo.t .center.>