iOS alkalmazásfejlesztés alapjai Nagy Aszter András – BME MIK
[email protected]
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
Címze1
Metódus
● 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];
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" {" // Implementáció" }" @end"
● 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
Strong
Child
Strong
Parent
Strong
Weak
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