Curs de programació d’iOS Novembre de 2011
Organitza
Albert Nadal Garriga | Mobile software engineer
http://lafruitera.com
anadalg@gmail.com
twitter.com/anadalg
Sistema Operatiu iOS Terminals iPhone, iPod Touch, iPad - iPhone 4S - iPhone 4 - iPhone 3GS - iPhone 3G - iPhone
- iPad 2 - iPad
Repositori d’aplicacions App Store Available apps 500.000+ Downloads 18.000.000.000+
Use cases of Apps • • • • • • • • •
Location-Based Services (LBS) News and media content Entertainment and games Guides and reference Navigation eBooks Augmented Reality (AR) Healthcare Social Networks
Location-Based Services (LBS)
News and media content
Guides and reference
Interactive eBook
App life cycle
1 Introducció a l’Xcode i iOS • • • • • • • •
Requisits i material necessari iOS Developer Program Certificat de desenvolupador Certificat de distribució Apple App Store Xcode i Interface Builder Estructura d’un projecte Novetats de l’iOS5
1.1 Requisits i material necessari • Mac OS X • v10.7 (Lion) • v10.6 (Snow Leopard)
• Xcode • v4.2 (iOS ≤ 5 SDK) • v3.2 (iOS ≤ 4.3 SDK) • Interface Builder • Integrat amb Xcode v4.0
1.2 iOS Developer Program • http://developer.apple.com/support/ios/ • Certificat de desenvolupador d’Apple
1.3 Certificat de desenvolupador • Developer Certificate: Certificat digital que s’instal·la al keychain del Mac mitjançant l’aplicació “Acceso a llaveros”. Signa digitalment el codi de les nostres Apps. • App ID: Identificador de la nostra aplicació a l’App Store. • El bundle identifier de l’App ha de tenir aquest valor. • El bundle identifier està al fitxer nomApp-Info.plist • Device ID (UDID): Identificador únic de cada dispositiu. • Permet executar les nostres app al terminal en devel. • Permet distribuïr les nostres apps en mode Adhoc.
• Provisioning Profile: Permet executar les Apps al terminal. • Relaciona App ID, Device ID.
1.4 Certificat de distribució • Permet pujar les nostres aplicacions a l’App Store. • Permet enviar les nostres Apps via Adhoc a tercers.
1.5 Apple App Store • • • •
Repositori d’aplicacions. App Store Worldwide. App Store per país. Normes força estrictes • Seguir les guies d’estils d’Apple • No continguts per a adults • Aplicacions estables • Logos de tercers ben visibles (google, etc…) • No estafes • No emprar API’s privades • No emprar icones/logos d’Apple • etc…
1.6 Xcode i Interface Builder • Xcode v4.2 • Interface Builder (integrat dins de l’Xcode 4)
Interface Builder fitxers .NIB i .XIB contenen la definició de la interfície gràfica
1.7 Estructura d’un projecte • Source code • Fitxers .h • Fitxers .m
• Resources/Bundle • • • •
• • • •
Imatges Video Fitxer de base de dades (SQLite, XML, etc…) etc…
Configuració de l’app .plist Interfície Gràfica .NIB i .XIB Llibreries dinàmiques .dylib Localització .strings
2 Crear un projecte amb Xcode
Classe HolaMonAppDelegate.h • Tot projecte te el corresponents fitxers… • NomAplicacioAppDelegate.h • NomAplicacioAppDelegate.m
• NomAplicacioAppDelegate és la classe principal de l’aplicació i fa tasques de “director d’orquestra”. • És subclasse de UIApplication o UIResponder. • Implementa el protocol <UIApplicationDelegate> • Actua com un listener de missatges de l’App: • Quan s’inicia l’aplicació. • Quan l’aplicació passa a segon plà (multitasca). • Quan l’aplicació passa a primer plà. • Quan l’aplicació es tanca. • Etc…
Classe HolaMonAppDelegate.h #import <UIKit/UIKit.h> @class HolaMonViewController; @interface HolaMonAppDelegate : UIResponder <UIApplicationDelegate> { }
@property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) HolaMonViewController *viewController;
@end
Classe HolaMonAppDelegate.m #import "HolaMonAppDelegate.h" #import "HolaMonViewController.h" @implementation HolaMonAppDelegate
@synthesize window = _window; @synthesize viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /* Invocat quan l’aplicació ha arrancat */ }
- (void)applicationWillResignActive:(UIApplication *)application { /* Invocat quan l’aplicació passa a un estat inactiu (es rep una trucada o sms, o es prem el botó del dispositiu */ } - (void)applicationDidEnterBackground:(UIApplication *)application { /* Si l’aplicació suporta multitasca i passa a segon plà s’invoca aquest mètode */ } - (void)applicationWillEnterForeground:(UIApplication *)application { /* Invocat quan l’aplicació recupera el primer plà */ } - (void)applicationDidBecomeActive:(UIApplication *)application { /* */ } - (void)applicationWillTerminate:(UIApplication *)application { /* Invocat quan l’aplicació es tancarà */ } @end
Exemple 1 - UIAlertView • • • •
Mostrar una alerta en una caixa flotant. Tindrà dos botons: Sortir i Continuar. Al prèmer el botó Sortir es tancarà l’App. S’emprarà la classe UIAlertView
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Avís!” message:@“Escull una de les següents opcions.” delegate:self cancelButtonTitle:@“Sortir” otherButtonTitles:@”Continuar”, nil]; [alert show]; [alert release];
Exemple 1 #import "HolaMonAppDelegate.h" #import "HolaMonViewController.h" @implementation HolaMonAppDelegate @synthesize window = _window; @synthesize viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Avís!” message:@“Escull una de les següents opcions.” delegate:self cancelButtonTitle:@“Sortir” otherButtonTitles:@”Continuar”, nil];
[alert show]; [alert release]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window makeKeyAndVisible]; return YES; } @end
Exemple 1
Exemple 1 • Implementarem les actions dels botons Sortir i Continuar. • Primerament declarem el protocol <UIAlertViewDelegate> http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAlert ViewDelegate_Protocol/UIAlertViewDelegate/UIAlertViewDelegate.html
• Només cal implementar els mètodes delegats que ens interessen. • En aquest cas el mètode delegat que ens interessa és...
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { /* Implementar-ho! */ }
Exemple 1 • Declarem el protocol <UIAlertViewDelegate> al fitxer de definició d’interfície de la classe NomAplicacioAppDelegate (NomAplicacioAppDelegate.h) * Podem declarar protocols en qualsevol altra classe. #import <UIKit/UIKit.h> @class HolaMonViewController; @interface HolaMonAppDelegate : UIResponder <UIApplicationDelegate, UIAlertViewDelegate> { } @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) HolaMonViewController *viewController; @end
Exemple 1 • Ara cal implementar el protocol delegat al fitxer d’implementació de la classe NomAplicacioAppDelegate (NomAplicacioAppDelegate.m) #import "HolaMonAppDelegate.h" #import "HolaMonViewController.h" @implementation HolaMonAppDelegate @synthesize window = _window; @synthesize viewController = _viewController; [....]
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
switch (buttonIndex) { case 0: case 1: default: break;
} }
exit(0); break; /* Implementar acció del botó "Continuar" */ break;
#import "HolaMonAppDelegate.h" #import "HolaMonViewController.h" @implementation HolaMonAppDelegate @synthesize window = _window; @synthesize viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Avís!” message:@“Escull una de les següents opcions.” delegate:self cancelButtonTitle:@“Sortir” otherButtonTitles:@”Continuar”, nil]; [alert show]; [alert release]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window makeKeyAndVisible]; return YES; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { switch (buttonIndex) { case 0: exit(0); break; case 1: /* Implementar acció del botó "Continuar" */ break; default: break; } }
@end
Exemple 2 – Model-View-Controller • Definirem un UIViewController (MVC) • Mostrar una pantalla amb un UITextField, UILabel i un UIButton • Definirem els IBOutlets • Definirem un IBAction per al UIButton
• Realitzarem els connectors entre UI i el codi
Exemple 2 • UIViewController (Model-View-Controller) • View: Objectes visibles per a l’usuari. • • • • •
UILabel UIButton UIImageView UITextField Etc...
• Model: Objectes per guardar dades • • • •
NSArray NSDictionary SQLite Etc...
• Controller: Enllaça i controla la vista i el model.
Exemple 2 • Creem una classe de tipus UIViewController principal anomenat HolaMonViewController. S’encarregarà de controlar tots els elements que afegirem en una vista de l’App. • HolaMonViewController.h #import <UIKit/UIKit.h> @interface HolaMonViewController : UIViewController @end
• HolaMonViewController.m #import "HolaMonViewController.h“ @implementation HolaMonViewController [....]
@end
Exemple 2 • Creem una instància de HolaMonViewController i l’associarem a una interfície gràfica on hi afegirem les subvistes.
•
HolaMonViewController.xib
• La instància la crearem i guardarem a la classe HolaMonAppDelegate i s’ha de fer quan arrenca l’aplicació. • HolaMonAppDelegate.m - (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = [[HolaMonViewController alloc] initWithNibName:@”HolaMonViewController” bundle:nil]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; }
Exemple 2 • Afegim un UIButton, UILabel i UITextField a la interfície HolaMonViewController.xib • El File’s Owner ha de sér del tipus HolaMonViewController
Exemple 2 • Per poder accedir i utilitzar les tres subvistes que hem afegit a la interfície hem de definir-les com a atributs IBOutlet de la classe HolaMonViewController • Per capturar l’event al prémer l’UIButton defirem un mètode IBAction • HolaMonViewController.h #import <UIKit/UIKit.h> @interface HolaMonViewController : UIViewController { IBOutlet UILabel *etiqueta; IBOutlet UITextField *input; IBOutlet UIButton *boto; }
- (IBAction)copiarText:(id)sender; @end
Exemple 2 â&#x20AC;˘ Apliquem els connectors entre la interfĂcie i els IBOutlet
Exemple 2 • Apliquem els connectors entre la interfície i els IBAction
Exemple 2 • Implementem el mètode copiarText • Al prémer el UIButton copiarem el text de l’UITextField a l’UILabel
• HolaMonViewController.m #import "HolaMonViewController.h“ @implementation HolaMonViewController - (IBAction)copiarText: (id)sender { [etiqueta setText:[input text]]; } [....] @end
Exemple 2
Exemple 2 • Implementarem l’amagament del teclat al prémer la tecla de retorn • Declararem i implementarem el protocol <UITextFieldDelegate> • HolaMonViewController.h #import <UIKit/UIKit.h> @interface HolaMonViewController : UIViewController <UITextFieldDelegate> { IBOutlet UILabel *etiqueta; IBOutlet UITextField *input; IBOutlet UIButton *boto; } - (IBAction)copiarText:(id)sender; @end
Exemple 2 http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextFi eldDelegate_Protocol/UITextFieldDelegate/UITextFieldDelegate.html
• Implementem el protocol <UITextFieldDelegate> al delegate • HolaMonViewController.m #import "HolaMonViewController.h“ @implementation HolaMonViewController - (BOOL)textFieldShouldReturn: (UITextField *)textField { [textField resignFirstResponder]; [etiqueta setText:[input text]]; return TRUE; } [....] @end
Exemple 2 • Ara cal assignar el delegate al UITextField des de l’Interface Builder • S’assignarà mitjançant un connector
Exemple 2
3 Introducció a l’Objective-C • Les aplicacions per iOS es desenvolupen en llenguatge Objective-C • És una extensió simplificada del C • Programació orientada a objectes
• L’SDK es composa d’un conjunt de Frameworks • Tot el conjunt s’anomena Cocoa • En els dispositius tàctils s’empra Cocoa Touch
• Hi ha més de 3000 mètodes i 200 classes disponibles. • En cada nova actualització de l’iOS Apple afegeix noves classes i mètodes. • Cal emprar constantment els exemples i la documentació de referència d’Apple. • http://developer.apple.com/library/ios/naviga tion/
Frameworks • Un framework és un conjunt de classes relacionades entre si que realitzen tasques similars • Només cal importar al nostre projecte els frameworks necessaris • Per exemple, el framework UIKit s’empra en tots els projectes per iPhone/iPad ja que conté totes les classes relatives a la interfície d’usuari • UIButton, UILabel, UIImageView, UIView, UIScrollView, UISegmentedControl, UISlider, UITextField, UISwitch,... • Etc...
Frameworks
Frameworks
Frameworks
Frameworks • Foundation: Tipus primitius de dades, etc... http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Fou ndation/ObjC_classic/_index.html
• UIKit: Classes de la UI http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKit_Fr amework/_index.html
• CoreGraphics: Motor de renderitzat de la UI http://developer.apple.com/library/ios/#documentation/coregraphics/reference/ coregraphics_framework/_index.html
Frameworks •CoreLocation: GPS/Brúixola/Geolocalització •MapKit: Integració de mapes •SystemConfiguration •CFNetwork: Comunicació/Sockets •AddressBook: Accés agenda de contactes •MediaPlayer: Player de video/audio/streaming? •CoreBluetooth: Ús bluetooth •AudioToolbox: Manipulació d’audio •iAd: Integració publicitat iAd d’Apple •Etc...