ios alkalmazásfejlesztés alapjai Nagy Aszter András BME MIK anagy@mik.bme.hu 1
ios platform Apple mobil operációs rendszere iphone, ipod Touch, ipad OS X-en alapul De nem kompatibilis azzal Homogén rendszer 3 féle kijelzőméret Hamarosan változik... Gyors frissítés-terítés ARMv7, ARMv7s, Arm64 (ARMv8) 2
ios jellemzők Zárt Alkalmazásterjesztés csak AppStore-ban Be kell tartani a játékszabályokat Android után második...eladások tekintetében nagyon lemaradva 3
Miért érdemes? Mert kifizetődő! 4
Fejlesztőkörnyezet Mac OS X Legalább Mountain Lion Xcode IDE AppStore-ból ingyenesen letölthető Instruments iphone Simulator Fejlesztői licensz Teszteléshez hardver Nagy felbontású kijelzőj 5
OS X UNIX(-like) rendszer XNU kernel Terminál vanj, X (alapesetben) nincs Van AppStore, de nem kötelező Külön fejlesztői licensz kell fejlesztéshez... Megszokott alkalmazások jó része elérhető Egyedi billentyűzet kiosztás Természetesen cserélhető. 6
Sandbox modell I. Minden alkalmazás elkülönítve fut Nem kommunikálhatnak egymással A már említett URL-eken kívül... Minden app csak a saját fájljait éri el Nevezetes alkönyvtárak: Documents Felhasználó számára fontos fájlok Backup készül róla Felhasználó elérheti PC-n Library Backup készül róla Felhasználó elől rejtve Pl tartalomnak 7
Sandbox modell II. Nevezetes alkönyvtárak (folytatás): tmp Ideiglenes állományoknak Illik törölni, de a rendszer is megteszi időnként Nem kerül mentésre 8
Engedélyek Nem olyan, mint más rendszereken Futás közben, dinamikusan Ha a felhasználó elutasíthatja Az alkalmazás mehet tovább Csökkentett funkcionalitással Rendszer kérdezi, és csak egyszer 9
Esettanulmány - Cluster Cluster egy social media app 1. Első indításkor mindent Nem volt túl sikeres, felhasználók 40%-a fogadta el 2. Magyarázva 3. Amikor kell, előkérdést tettek fel A felhasználók 2%-a utasította csak el a rendszer kérdését 4. A legutolsó pillanatra hagyták a kérdést A felhasználó triggerelte Csak rendszer 10
Multitasking modell Nincs általános multitasking Nem futhat akármilyen app a háttérben De audio, navigáció, VoIP igen... Háttérbe küldött Appokat kilőheti az OS Érdemes állapotot menteni Appok igényelhetnek plusz időt De nem biztos, hogy kapnak 11
ios7 multitasking Background fetch Max 30 másodperc nem CPU-intenzív feladatokhoz Remote notifications Notification-ök érkezése esetén Pl frissítések letöltéséhez Itt is 30 másodpercen belül kell lenni 12
Notifications Local notification App helyileg küldheti Időzítés váltja ki Push notification Távoli szerver kezdeményezi 13
Fejlesztési lehetőségek WebApp Safari jeleníti meg HTML+JS TouchEvents API De facto szabvány Cross-platform megoldások Natív Objective-C Swift 14
Objective-C 15
Objective-C Objektum orientált nyelv ANSI C bővítése, azzal 100% kompatibilis Szintaktika SmallTalk-ból ered Lényegében csak Apple rendszereken használják Cocoa-val (OS X) és Cocoa Touch-csal (ios) párban 16
Objective-C típusok I. Primitív C-s típusok int, usigned int, float, double... typedef-elve is: NSInteger, NSUInteger, CGFloat... Boolean BOOL YES/NO értékkelj!bool isthisstrange = YES; 17
Objective-C típusok II. FoundationFramework NSString NSString *firststring = @"Hello World!"; NSNumber Számok, boolean NSArray id típus Pointer, amely csak objektumra mutahat!id tmp = @"Hello World!"; // NSString"!tmp = @5; // NSNumber 18
Objektum orientáltság Öröklés Minden osztály NSObject-ből származik Nincs többszörös öröklés De több interfészt lehet implementálni Egy osztálynak lehet: Tagváltozója Metódusa Property-je Nincsenek névterek Helyette 2-3 betűs prefixek 19
Üzenetküldés I. Metódushívást üzenetküldésnek hívják Futásidőben kerül feloldásra Példák Paraméter nélkül:!bool status = [pizzaprinter readytomake];" Paraméterrel: [pizzaprinter makepepperonipizzawiththickness: EAThicknessThin extrapepperoni:yes]; Speciális esetek Saját metódus: [self dosomething];" Ősosztály: [super dosomething]; Címze1 Metódus 20
Üzenetküldés II. Selector Metódusok szignatúrája kettőspontokkal Pl: readytomake, makepepperonipizzawiththickness:extrapepperoni: Nincs metódus overloading Üzenetküldés nil-nek: nil = null!id pizzaprinter = nil;"![pizzaprinter dosomething];" Definíció szerint semmi.!int n = [pizzaprinter pizzasinqueue];"!semmi, n értéke 0 lesz. 21
Osztály definíció I. Osztály interfészének definíciója Osztálynév.h-ba: @interface EAValidator: NSObject" - (BOOL)isValid:(NSString *)stringtovalidate;" @end Osztály implementációja Osztálynév.m-be: @implementation EAValidator {" }" int _tmp; // Instance variable" - (BOOL)isValid:(NSString *)stringtovalidate" {" }" @end" // Implementáció" Headert include-olni később #import-tal kell 22
Osztály definíció II. +/-: osztály- és példány metódusok jelölése Metódusok, property-k láthatósága Nincs private/protected/public Public : headerben definiálva Adattagok láthatósága Headerben @protected, @private @public jelölésekkel Érdemes implementációba rakni, így implicit private 23
Property-k Syntax sugar metódusok generálására @property NSString *name; Szintaxis: self.name = @"John Doe"; @property NSString *name; generálja: _name; - (NSString *)name; - (void)setname:(nsstring *)name; 24
Osztály példányosítás Kétlépcsős példányosítás Memóriafoglalás Inicializálás Mindig egyszerre hívjuk!!nsnumber *number = [[NSNumber alloc] initwithfloat:5.0f]; // Helyes"!NSNumber *number = [NSNumber alloc];"![number initwithfloat:5.0f]; // ROSSZ! 25
Inicializálás Konvenció szerint init-tel kezdődik a neve Visszatérési értéke instancetype, vagy régebben id - (instancetype)init" {" } if (self = [super init]) {" // Inicializálás" }" return self;" Összevont konstruktor Class method, amely egy lépésben elintézi a fentieket Pl: NSString stringbyappendingstring: 26
Protocol Más nyelvek interfészének felel meg Csak metódusokat, property-ket definiálhat Definíció: @protocol EAPizzaPrinterDelegate" - (void)pizzaprinterstatuschanged;" @end Protocol implementálás: @interface MyClass: NSObject<EAPizzaPrinterDelegate>" 27
Hibakezelés NSException Van @try-@catch-@throw-@finally Nem használják Csak végzetes hibák számára NSAssert Fejlesztés közben NSError Ezt használják hibakezelésre 28
Memóriakezelés I. ARC: Automatikus referencia számlálás Fordítási időben zajlik Három referenciatípus Strong referenciaszámlálót növeli strong jelölés (implicit ez érvényes) Weak referenciaszámlálót nem növeli ha objektum megszűnik, nil lesz weak jelölés Unsafe_unretained Már nem használatos (ios4-nél volt szükséges) 29
Memóriakezelés II. Ügyeljünk arra, hogy ne alakuljon ki irányított kör az (erős) referencia gráfban! Child Child Strong Strong Strong Weak Parent Parent 30
Demó! Demó 31
Ajánlott források http://www.raywenderlich.com/ Tutorialok, ios8 és Swift témakörökben is http://iossupportmatrix.com/ StackoverflowJ ios Dev Center Programming Guide-ok WWDC session videók (nem keynotej ) Az előadás fóliái a http://mik.bme.hu/~anagy/1app/ oldalon fognak elérhetővé válni. 32
Köszönöm a figyelmet!? 33