Post on 30-May-2020
Curs de programació d’iOS Novembre de 2011
Organitza
Albert Nadal Garriga | Mobile software engineer
http://lafruitera.com twitter.com/anadalg anadalg@gmail.com
Sistema Operatiu iOS
- iPhone 4S - iPhone 4 - iPhone 3GS - iPhone 3G - iPhone
Terminals iPhone, iPod Touch, iPad
- 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: exit(0); break; case 1: /* Implementar acció del botó "Continuar" */ break; default: 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
• 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/UITextFieldDelegate_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/navigation/
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/Foundation/ObjC_classic/_index.html
• UIKit: Classes de la UI http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKit_Framework/_index.html
• CoreGraphics: Motor de renderitzat de la UI http://developer.apple.com/library/ios/#documentation/coregraphics/reference/coregraphics_framework/_index.html
•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...
Frameworks