développement ios - laas · 2011. 2. 22. · matériels et logiciels nécessaires • xcode + ios...
TRANSCRIPT
-
Développement iOSAlexandre Hamez - LAAS/OLC - 21/02/11
-
Matériels et logiciels nécessaires
• Xcode + iOS SDK‣ developer.apple.com‣ gratuit
•Mac Intel‣ moins gratuit
• iPhone, iPod touch ou iPad‣ un peu moins moins gratuit‣ simulateur avec Xcode
2
-
App Store
3
-
App Store
3
-
Distribution (1)
• Seulement les applications signées‣ droit d’entrée à payer
• App store‣ 30% du prix de vente‣ pas d’autres frais
• Ad-hoc (100 maximum)
• In-House
4
-
Distribution (2)
5
-
Programmes
6
Standard Entreprise Université Enregistré
Dev.
Test
Ad-hoc
App store
In-House
Coût
✓ ✓ ✓ ✓
✓ ✓ ✓
✓ ✓
✓
✓
99$ / an 299$ / an gratuit gratuit
-
Programmes
6
Standard Entreprise Université Enregistré
Dev.
Test
Ad-hoc
App store
In-House
Coût
✓ ✓ ✓ ✓
✓ ✓ ✓
✓ ✓
✓
✓
99$ / an 299$ / an gratuit gratuit
200 étudiants
-
GPL / Licences libres
• GPL incompatible avec la licence de l’App Store‣ GNU Go, VLC
•Open Source et App Store‣ clause 3.3.20
•Distribution des sources?‣ il faut toutefois payer pour déployer
7
-
Interdictions
• Télécharger du code
• Piloter automatiquement, gérer des flottes de véhicule ou autres
• Son et vidéo: limitations sur la consommation de bande-passante
• Roulette russe!
•∞
8
-
Pré-requis
9
-
Pré-requis
9
intmain(){ return 42;}
-
Pré-requis
9
intmain(){ return 42;}
-
Flux de travail
10
-
Flux de travail
10
Xcode
-
Flux de travail
10
Xcode
Interface Builder
-
Flux de travail
10
Xcode
iPhone SimulatorInterface Builder
-
Flux de travail
10
Xcode
iPhone SimulatorInterface Builder Instruments
-
Flux de travail
10
Xcode
iPhone SimulatorInterface Builder Instruments
iPhone
-
Flux de travail
10
Xcode
iPhone SimulatorInterface Builder Instruments
x86
iPhone
ARM
-
Matériel & capteurs
CPU RAM Gyro. Accel. GPS Boussole
iPhone 3GS
iPhone 4
iPad WIFI/3G
iPod touch
ARM Cortex A8 @600MHz
256 Mo ✕ ✓ ✓ ✓
ARM Cortex A8 @?
512 Mo ✓ ✓ ✓ ✓
ARM Cortex A8 @1GHz
256 Mo ✕ ✓ ✕ / ✓ ✓
ARM Cortex A8 @800MHz
256 Mo ✓ ✓ ✕ ✕
11
-
Frameworks
12
Cocoa Touch
Media
Core Services
Core OS
-
Frameworks
12
UIKit
MessageUI
AddresBookUI
EventKitUI
GameKit
iAd
MapKit
Cocoa Touch
Media
Core Services
Core OS
-
Frameworks
12
Assets
OpenGL ES
OpenAL
QuartzCore
Core Graphics
Core MIDI
Core Text
Media Player
Cocoa Touch
Media
Core Services
Core OS
-
Address Book
CFNetwork
Core Data
Core Telephony
Core Foundation
StoreKit
System Configuration
Core Location
Frameworks
12
Cocoa Touch
Media
Core Services
Core OS
-
Frameworks
12
Accelerate
External Accessory
Security
System
Cocoa Touch
Media
Core Services
Core OS
-
Achats “In App”
• Vendre du contenu digital
•Ne pas vendre des biens réels
•Débloquer des fonctionnalités
•Ne gère que les paiements
• Et toujours les 30%
• Attention au moment de l’enregistrement de l’identifiant de l’application!
13
-
“Multi-tâches”
• Vrai multi-tâches‣ Audio‣ Géo-localisation‣ VoIP
•Demander une grâce de temps raisonnable‣ finir une tâche en cours‣ sauvegarder
•Notifications
14
-
Notifications “Push”
15
-
Notifications “Push”
15
-
Notifications “Push”
15
-
Notifications “Push”• Trois types de notification‣ pastille, message, son
• Format JSON, taille maximale: 256 octets
• Centralisées
• Pas de garantie de livraison, file d’attente de taille un
• Vérifier régulièrement les appareils invalides
• Attention au moment de l’enregistrement de l’identifiant de l’application!
15
-
Objective-C 2.0• Langage objet
• Sur-ensemble strict du C
• Un objet racine NSObject
• Héritage simple
• Protocoles
• Faiblement typé
• void* = id
• Pointeur nul: nil
• Envoi de messages (pas d’invocation de méthodes)
• Runtime
• Pas d’espaces de nommage
16
-
Quelques facilités
• Garbage collector
• Énumération rapide (for … in)
• Génération des accesseurs (@property)
• Possibilité de rajouter dynamiquement des méthodes et attributs à une classe (catégories, extensions et références associatives)
17
-
Messages
18
-
Messages
•[rect display];
18
-
Messages
•[rect display];
•[rect setLength:42];
18
-
Messages
•[rect display];
•[rect setLength:42];
•[rect setLength:42 andWidth:24];
18
-
Messages
•[rect display];
•[rect setLength:42];
•[rect setLength:42 andWidth:24];
•setLength:andWidth:‣ nom de la méthode‣ “sélecteur”
18
-
Messages
•[rect display];
•[rect setLength:42];
•[rect setLength:42 andWidth:24];
•setLength:andWidth:‣ nom de la méthode‣ “sélecteur”
•[nil foo];‣ aucun effet
18
-
Classes - définition
19
@interface Foo : NSObject{ int bar;}
-(void)setBar : (int)x;-(int)bar;+(int)theBar;
@end
-
Classes - définition
19
@interface Foo : NSObject{ int bar;}
-(void)setBar : (int)x;-(int)bar;+(int)theBar;
@end
méthode d’instance
-
Classes - définition
19
@interface Foo : NSObject{ int bar;}
-(void)setBar : (int)x;-(int)bar;+(int)theBar;
@end
méthode d’instance
méthode de classe
-
Classes - implémentation
20
#import “Foo.h”
@implementation Foo
-(void)setBar : (int)x{ bar = x;}
-(int)bar{ return bar;}
+(int)theBar{return 42;
}
@end
-
Classes - implémentation
20
#import “Foo.h”
@implementation Foo
-(void)setBar : (int)x{ bar = x;}
-(int)bar{ return bar;}
+(int)theBar{return 42;
}
@end
gestion des inclusions multiples
-
#import “Foo.h”
@implementation Foo@synthesize bar;@end
Propriétés (1)
21
@interface Foo : NSObject{}
@property (readwrite) int bar;
@end
-
#import “Foo.h”
@implementation Foo@synthesize bar;@end
Propriétés (1)
21
@interface Foo : NSObject{}
@property (readwrite) int bar;
@end“copy”, “nonatomic”, etc.
-
#import “Foo.h”
@implementation Foo@synthesize bar;@end
Propriétés (1)
21
@interface Foo : NSObject{}
@property (readwrite) int bar;
@end
-
Propriétés (2)
22
[foo setBar:42]; foo.bar = 42;=
x = [foo bar]; x = foo.bar;=
-
Vie et mort d’une classe (1)
23
- (void) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release];}
-
Vie et mort d’une classe (1)
23
- (void) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release];}
allocation mémoire
-
Vie et mort d’une classe (1)
23
- (void) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release];}
allocation mémoire
initialisation
-
Vie et mort d’une classe (1)
23
- (void) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release];}
plus d’intérêt pour f
allocation mémoire
initialisation
-
Vie et mort d’une classe (2)
24
-(id) initWithValue : (int)x{ self = [super init]; if( self ) { value = x; } return self;}
-(id) init{ return [self initWithValue:17];}
-(void) dealloc{[super dealloc];
}
-
Gestion de la mémoire (1)
• Garbage collector pour MacOS X, pas iOS
• Comptage de référence manuel‣ retain, release‣ autorelease(éviter autant que possible)
• Suppression dès que refcount == 0
•Des conventions de nommage à respecter
• @property: code adéquat généré
25
-
Gestion de la mémoire (2)
26
- (void) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release];}
-
Gestion de la mémoire (2)
26
- (void) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release];}
1
-
Gestion de la mémoire (2)
26
- (void) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release];}
1
0
-
Gestion de la mémoire (3)
27
- (void) baz{ Foo* f = bar.f;
[f retain];
// do nasty stuff with f [f release];}
-
Gestion de la mémoire (3)
27
- (void) baz{ Foo* f = bar.f;
[f retain];
// do nasty stuff with f [f release];}
?
-
Gestion de la mémoire (3)
27
- (void) baz{ Foo* f = bar.f;
[f retain];
// do nasty stuff with f [f release];}
+1
?
-
Gestion de la mémoire (3)
27
- (void) baz{ Foo* f = bar.f;
[f retain];
// do nasty stuff with f [f release];}
+1
-1
?
-
- (Foo*) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f autorelease]; return f;}
- (Foo*) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release]; return f;}
Gestion de la mémoire (4)
28
-
- (Foo*) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f autorelease]; return f;}
- (Foo*) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f release]; return f;}
Gestion de la mémoire (4)
28
f est effacé!
-
- (Foo*) bar{ Foo* f = [[Foo alloc] init];
// do nasty stuff with f [f autorelease]; return f;}
Gestion de la mémoire (4)
28
-
Protocoles (1)
29
@protocol Plan9
@required-(Deads*)awakeDeads;
@optional-(BOOL)conquerEarthWith:(Deads*)deads;
@end
-
Protocoles (2)
30
#import “Plan9.h”#import “Alien.h”
@interface Invaders : Alien {}
@end
-
Délégation
31
• Utilisation très fréquente du design pattern “délégation”
• À l’aide des protocoles‣ [aManager setDelegate:self]
• Protocoles parfois implicites‣ APIs < MacOS X 10.5
-
Délégation
31
• Utilisation très fréquente du design pattern “délégation”
• À l’aide des protocoles‣ [aManager setDelegate:self]
• Protocoles parfois implicites‣ APIs < MacOS X 10.5
-
• Grand Central Dispatch‣ vue par tâches‣ gestion des threads au niveau de l’OS
• À l’ancienne‣ surcouche des threads POSIX
• Blocks‣ lambdas‣ extension C (proposée à la normalisation)
Parallélisme
32
-
• Grand Central Dispatch‣ vue par tâches‣ gestion des threads au niveau de l’OS
• À l’ancienne‣ surcouche des threads POSIX
• Blocks‣ lambdas‣ extension C (proposée à la normalisation)
#include
intmain(){ std::cout
-
• Grand Central Dispatch‣ vue par tâches‣ gestion des threads au niveau de l’OS
• À l’ancienne‣ surcouche des threads POSIX
• Blocks‣ lambdas‣ extension C (proposée à la normalisation)
#include
intmain(){ std::cout
-
“Hello, world!\n”
33
-
Géo-localisation (1)
34
-
Géo-localisation (2)
• Changements “significatifs”‣ à l’arrière-plan
• Localisation continue‣ au premier-plan‣ à l’arrière-plan
35
-
Autres langages
• GUI en Objective-C, appels à des bibliothèques‣ Python, Haskell, OCaml, Lua
• Cocoa complètement exporté‣ Lua
• Cross-compilation‣ armv[6|7]-apple-darwin
• Frameworks multi-plateforme‣ très souvent orientés jeux
36
-
En résumé
37
-
En résumé
• Payant
37
-
En résumé
• Payant
• Pas d’accès très bas niveau
37
-
En résumé
• Payant
• Pas d’accès très bas niveau
• Encadrement strict
37
-
En résumé
• Payant
• Pas d’accès très bas niveau
• Encadrement strict‣ déploiement fastidieux
37
-
En résumé
• Payant
• Pas d’accès très bas niveau
• Encadrement strict‣ déploiement fastidieux
•Mon avis
37
-
En résumé
• Payant
• Pas d’accès très bas niveau
• Encadrement strict‣ déploiement fastidieux
•Mon avis‣ (vraiment très) simple
37
-
En résumé
• Payant
• Pas d’accès très bas niveau
• Encadrement strict‣ déploiement fastidieux
•Mon avis‣ (vraiment très) simple‣ $, € et £
37
-
En résumé
• Payant
• Pas d’accès très bas niveau
• Encadrement strict‣ déploiement fastidieux
•Mon avis‣ (vraiment très) simple‣ $, € et £‣ peu adapté à la recherche
37
-
Lectures conseillées
• The Objective-C 2.0 Programming Language - Apple
• iPhone Programming - Joe Conway & AAron Hillegass
•Documentation Xcode
38