86
Développement iOS Alexandre Hamez - LAAS/OLC - 21/02/11

Développement iOS - LAAS · 2011. 2. 22. · Matériels et logiciels nécessaires • Xcode + iOS SDK ‣ developer.apple.com ‣ gratuit • Mac Intel ‣ moins gratuit • iPhone,

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

  • 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