Az iPhone SDK programozása Objective-C nyelven
 9789639863194, 963986319X [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

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.>