Une introduction sans prétention au développement d'applications natives pour iPhone. N'hésitez pas à me faire part de vos commentaires s'il y a des erreurs, c'est ma première.
3. Un téléphone?
Mobile Phones (dumb phone)
●
●
Appel et SMS
Généralement gratuit dans le contrat opérateur
Feature Phones
●
●
●
Entre le mobile phone et le smartphone
Certaines "features" telle que caméra, web browsing, ...
Généralement 0 à 100€ sur des contrats opérateurs de 2 ans.
Smartphones
●
●
●
Comparable à un ordinateur portable, avec des capteurs supplémentaires
(GPS, gyroscope, ...).
Les plus chers sont autour de 600-800€ hors offre opérateur.
Il y aura probablement de plus en plus d'offres "aggressives" en cours
autour de 200-300€ (ex: Google Nexus 4).
8. La part des smartphones
Une énorme part du gâteau reste à prendre !
Les US font partie des pays où la pénétration des smartphones est la plus importante.
En déc 2011, plus de 45% des mobiles vendus en Europe étaient des smartphones.
http://www.asymco.com/page/3/
9. Les smartphones sur 5 ans
http://www.asymco.com/2012/11/14/google-vs-samsung/
10. Compétition: Samsung vs Apple
Guerre des brevets, des innovations, de la capacité de production, marketing,
du modèle de vente, de l'OS, des "stores", etc...
11. Part de marché des OS
Android : près de 73% du marché
iOS : environ 14% du marché
Mais..........
12. Revenus & marges
Analyst (attention: prédiction!):
"One in every two smartphones sold in
2017 will be priced below US$150"
"The expensive smartphones will find
their market share shrinking from 85%
of total smartphones sold in 2011 to
33% in 2017. In contrast, the low-end
smartphones will gain enormous
amount of market share over the years
to account for just over half (52%) of the
smartphones sold in 2017."
http://www.asymco.com/2012/11/14/google-vs-samsung/
be-priced-below-us150/
http://blogs.informatandm.com/6575/press-release-one-in-every-two-smartphones-sold-in-2017-will-
15. Web Traffic
Les utilisateurs iPhone utilisent et consomment plus.
http://techcrunch.com/2012/10/17/apples-total-smartphone-web-traffic-share-climbs-to-46-with-iphone-5-samsung-trails-at-17/
http://www.businessinsider.com/mobile-market-share-2012-11
17. L'iPhone, c'est quoi ?
Un smartphone "high-end" au design épuré, léger et bien fini.
Vendu par Apple, première capitalisation boursière mondiale.
Processeur (A6 pour l'iPhone 5) très performant
Un système d'exploitation: iOS
Support réseau: EDGE/CDMA/3G/LTE/4G, Wifi, Bluetooth
GPS
Ecran multi-touch
Caméra avant et arrière photo et vidéo
Audio in / out
Gyroscope
Accéléromètre
Capteur de luminosité ambiante
Etc...
Un produit de luxe, inutilement cher, pour certains.
Un produit incontournable pour d'autres.
Comme en cuisine, c'est souvent une question de goût ! (no troll)
22. Only 1 in 10 apps gets any reasonable traction at all.
Only 1 in 1000 manages to get to the top 10 of the App
Store. For non-games, only 1 in 1690 reaches the top.
50% of revenue generated by iOS and Android apps
goes to just 25 developers (US).
24 are games !
http://build.developereconomics.com/appsfire-infographic-illustrates-once-more-difficulty-to-get-to-the-top/
http://venturebeat.com/2012/12/05/half-of-revenue-generated-by-ios-and-android-apps-goes-to-just-25-developers/
23. Une "app" pour qui?
http://www.visionmobile.com/blog/2012/11/which-apps-make-money/
24. Une "app" dans quel domaine?
http://www.visionmobile.com/blog/2012/11/which-apps-make-money/
25. Une "app" pour quel effort?
http://www.visionmobile.com/blog/2012/11/which-apps-make-money/
26. Une "app" pour quel pays?
http://www.visionmobile.com/blog/2012/11/which-apps-make-money/
27. Une "app" utilisée?
the average amount of time, in
seconds, a user of a device
spends with an app open every
time he or she launches it
http://www.localytics.com/blog/2012/new-ipads-combine-for-4-of-all-apple-tablets-in-november/
This metric shows how many app sessions
on average a user initiated over a given
period of time – in this case the month of
November.
29. iOS
Un OS: support matériel et logiciel.
Propriétaire et protégé.
●
●
On ne peut pas publier d'applications sans être développeur enregistré.
Le "jailbreak" consiste à casser la sécurité d'iOS pour permettre ça.
Des apps de base:
●
Téléphonie, Messaging, Contacts, Calendar, Photo, Plans, ...
Des tonnes de frameworks:
●
iCloud, UIKit, PassKit, MapKit, StoreKit, Notifications, iAd, ...
30. iOS
Un Store applicatif (unique): l'AppStore
Toutes les apps sont d'abord approuvées.
Qualité de l'app, API respectées
Fonctions disjointes avec Apple
Règles éthiques
Sandbox : cloisonnement des applications
Une app s'exécute indépendamment des autres apps (mémoire, ...).
Il existe quelques moyens pour le partage inter-app.
32. Compatibilité
Compatibilité ascendante assurée.
iOS 6 disponible sur toute la gamme jusqu'au 3GS (!)
Avec quelques ajustements:
●
●
●
●
Gestion Retina (x 2)
Gestion du 3.5 et 4 pouces depuis l'iPhone 5
Frameworks
○ API suivant modèle (ex: gyroscope)
○ Obsolescence de certains Frameworks ou API
ARC, gestion mémoire améliorée, au choix (recommandée)
34. Le Langage
Sur-ensemble orienté objet de C.
En Objective C, on peut écrire du C.
Dérivé de SmallTalk.
Natif. Langage compilé. Edition de liens.
Apple = "Think different".
Issu du rachat de NextSTEP OS pour:
○
○
Mac OS X
iOS
35. Built-in Types & Variables
char
un caractère sur 1 octet (signé -128 à 127)
short
un entier sur 2 octets (signé)
int
un entier sur 4 octets (signé)
long
un entier sur 4 octets (signé)
long long
un entier sur 8 octets (signé)
unsigned ___
pour ces mêmes types non signés (ex: unsigned int)
float
un décimal sur 4 octets
double
un décimal sur 8 octets
BOOL
un booléen (typedef signed char)
36. Built-in Types & Variables
enum Type { kRed, kGreen, kBlue };
énuméré
un type
typedef enum { kCircle, kRectangle, kSquare } ShapeType;
un typedef (C)
Exemples de déclaration:
int foo = 32;
// une variable entière
int* ptr = &foo; // un pointeur vers entier (en C)
CGPoint point;
UIView* view;
// une variable de type CGPoint (structure C)
// un pointeur vers une vue
38. Type Id
Comme void* de C mais l'appel de méthode est
supportée!
Exemple:
Rectangle* rectangle = ...;
Car* car = ...;
id thing = rectangle;
double surface = [thing surface];
thing = car;
[thing fillWithGas:45];
40. Structures de contrôle
if (x < 10) {
...
} else {
...
}
for (int i = 0; i < 100; i++) {
...
}
for (UIView* view in self.view.subviews) {
while (x < 10) {
...
}
...
}
break;
do {
...
} while (x < 10);
switch (value) {
case 0:
case 1:
...
break;
case 2:
...
break;
default:
break;
}
continue;
41. Interface et Implémentation
Car.h
Inclure un autre fichier
source (header)
#import "Vehicle.h"
@interface Car : Vehicle {
Car.m
#import "Car.h"
@interface Car ()
float fillLevel;
L'interface peut être
étendue en privé ici.
}
@end
// Déclaration des méthodes publiques
@implementation Car
- (void) addGas;
// Implémentation des méthodes privées et
publiques
@end
- (void) addGas {
Fin de déclaration
// Code pour ajouter de l'essence
}
@end
42. Visibilité des variables d'instance
Car.h
Car.m
#import "Vehicle.h"
#import "Car.h"
@interface Car : Vehicle {
@interface Car ()
@protected
float fillLevel;
@end
@private
@implementation Car
float time;
}
// Déclaration des méthodes publiques
// Implémentation des méthodes privées et
publiques
- (void) addGas {
// Code pour ajouter de l'essence
- (void) addGas;
}
@end
@end
43. Propriétés
@interface Car : Vehicle {
// Déclaration de propriété
@property (strong, nonatomic) NSString* name;
}
[self setName:@"Peugeot 5008"];
// Fixer la valeur
self.name = @"Peugeot 5008";
// Equivalent
NSLog(@"The car is %@", [self name]);
// Lire la valeur
NSLog(@"The car is %@", self.name); // Equivalent
45. Readonly, Atomic/nonatomic
// Génère seulement le getter (self.name), pas le setter
@property (readonly, nonatomic) NSString* name;
@property (strong, atomic) NSString* name;
46. Synthesize
@synthesize name = _name;
Génère l'implémentation des getters et setters.
Seulement s'ils ne sont pas déjà définis (surcharge).
A partir de XCode 4.4, ils sont auto-générés.
Plus besoin de @synthesize.
47. Messages
// Méthode d'instance
int nb = [book numberOfPages ];
// Méthode de classe
Book* book = [Book createBookWithTitle :@"Game of Thrones"
author:@"George R. R. Martin"];
Comment déclarer ces méthodes?
Nom de la méthode
- (int) numberOfPages;
Type du paramètre
+ createBookWithTitle:(NSString*)title author:(NSString*)author;
+ pour méthode de classe
- pour méthode d'instance
Nom du paramètre
48. Attention !
En Objective C, on peut appeler une méthode
sur ........ Nil !?!
Car* myCar = Nil;
[myCar fillWithGas]; // Ne fait rien !
Dans d'autres langages, on aurait obtenu:
un plantage
un NullPointerException
...
49. Self & super
self : représente l'instance de la classe
super : représente l'instance de la super classe
Exemples:
[self performSegueWithIdentifier:@"MySegue"
sender:sender];
[super viewWillAppear:animated];
51. Introspection
Dans la classe NSObject (la classe racine de quasiment tout objet)
+(Class) class
-(BOOL) isKindOfClass: classObj
-(BOOL) isMemberOfClass:
-(BOOL) respondsToSelector:
+(BOOL) instancesRespondToSelector:
-(id) performSelector:selector
Exemples:
if ([vehicle isMemberOfClass:[Car class]] == YES ) {
// ...
}
if ( [vehicle respondsToSelector:@selector(setFillLevel:)] == YES) {
// ...
}
53. Protocols
Héritage multiple de spécifications (pas implémentation).
Très utilisé pour le pattern Delegate dans iOS.
@protocol Printing
@required
- (void)print;
@optional
- (void)printColor
@end
@interface HPPrinter: NSObject <Printing>
//...
@end
54. Protocols - Exemple
@interface ViewController : UIViewController <UIActionSheetDelegate>
// ...
Le protocole à implémenter.
- (void)viewDidLoad {
[super viewDidLoad];
UIActionSheet *actionSheet = [[UIActionSheet alloc]
L'instance du protocole
(nous même)
initWithTitle:@"Delegate Example"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:@"Destructive Button"
otherButtonTitles:@"Other Button",nil
[actionSheet showInView:self.view];
}
La méthode du delegate à
implémenter.
- (void)
actionSheet:(UIActionSheet *)actionSheet
clickedButtonAtIndex:(NSInteger)buttonIndex {
NSLog(@"hello world!");
55. Categories
Extension d'une classe - Maintenabilité
(ex: librairie dont on n'est pas l'auteur)
Convention sur le nom du fichier source : Car+TrailerSupport.h
@interface Car (TrailerSupport)
- (void)attach:(Trailer*)trailer;
@end
@implementation Car (TrailerSupport)
- (void)attach:(Caravan*)trailer {
}
@end
Une catégorie ne supporte
pas l'ajout d'une variable
d'instance !!!
Contournement:
objc_setAssociatedObject
obc_getAssociatedObject
56. Blocks
Un bloc == un fragment de code:
^{
// Du code
}
Exemple de déclaration:
typedef int (^IntegerComparisonBlock)(int i, int j);
IntegerComparisonBlock whichIsGreaterBlock = ^ int (int i, int j) {
return i > j ? i : j;
};
Exemple d'utilisation:
int val = whichIsGreaterBlock(10, 15);
57. Blocks - Autre exemple
Facilite le développement asynchrone.
Code plus efficace : le thread courant peut continuer.
[self.client postPath:@"/getMeSomething" parameters:params
success:^(Response* response) {
// Success code
}
failure:(^Response* response) {
// Failure code
}
];
58. Namespace... no!
Pas de "namespace" == collision possible de noms.
:-(
Convention: préfixer ses classes, ses #define, ses
constantes, ... par un trigram de votre produit.
Exemple:
@interface PRJMaClasse
// ...
@end
60. Frameworks
Plus de 50 frameworks:
● Foundation: les classes de bases
● UIKit : interface graphique
● MapKit: gestion des cartes géographiques
● CoreLocation: géolocalisation
● CoreMotion: gyroscope, accéléromètre
● Social: Facebook, Twitter, ...
● ...
Bien sûr, impossible de tous les connaître.
Néanmoins, leur fonctionnement, leur conception, sont
souvent identiques.
61. Foundation - NSObject
La classe racine de toute classe.
NSObject (NS = NextSTEP)
description
copy
mutableCopy
...
Des méthodes d'introspection, d'archivage, etc...
63. Foundation Framework
NSNumber
NSData
Un "wrapper" pour un int, float,
double, BOOL, etc...
Sauver/restaurer/transmettre des
données
NSValue
NSDate
Un "wrapper" pour les types nonobjet (ex: struct C)
Un point unique dans le temps.
67. NSUserDefaults
Stockage de PropertyList.
Pas une base de données mais un moyen
simple de lire/écrire de l'information persistante.
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:@"TextToSave" forKey:@"keyToLookupString"];
NSString *myString = [prefs stringForKey:@"keyToLookupString"];
69. NSNotificationCenter
Recevoir des notifications
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector
(receiveEvent:) name:@"SomeEvent" object:nil];
- (void)receiveEvent:(NSNotification *)notification {
// Handle event
}
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"SomeEvent" object:
nil];
Envoyer des notifications
[[NSNotificationCenter defaultCenter] postNotificationName:@"SomeOtherEvent"
object:nil];
Pratique mais à minimiser (spaghetti pattern)
70. Grand Central Dispatch
GCD = Une API de programmation concurrente
○ Tâche = block ou fonction
○ Queue d'exécution synchrone ou asynchrone
○ Annulation de tâche
○ Groupes d'exécution
○ Synchronisation lecture/écriture
○ Bien sûr, il y a des threads derrière
Plus facile que la programmation bas niveau multithread.
71. Grand Central Dispatch
dispatch_queue_t myQueue = dispatch_queue_create("com.mycompany.myqueue",
0);
dispatch_async (myQueue, ^{
// Exécution asynchrone: on n'attend pas la fin.
});
dispatch_sync (queue, ^{
// Exécution synchrone: on attend la fin.
});
La queue principale (thread principal):
dispatch_get_main_queue ()
72. NSOperation & NSOperationQueue
Légèrement moins performant que GCD.
Mais encore un niveau d'abstraction au dessus.
Exemple:
@interface PageLoadOperation : NSOperation {
@property(retain) NSURL *targetURL;
- (id)initWithURL:(NSURL*)url;
@end
NSOperationQueue* queue = [[NSOperationQueue alloc] init];
PageLoadOperation *plo = [[PageLoadOperation alloc] initWithURL:url];
[queue addOperation:plo];
74. Et de nombreux autres frameworks
MapKit : gestion des cartes
CoreLocation : gestion de la géolocalisation
CoreData : framework de persistence (dans SQLLite)
Notification Center : une plateforme de notifications
Bien plus que l'exemple précédent !
Etc... découvrez par vous-même au fil des besoins !
76. MVC
Dans iOS, c'est le pattern MVC.
Même du MVC de MVC de MVC...
Modèle
Quelles sont vos données?
Vue = UIView
Où sont présentées les données (ex: l’écran)?
Contrôleur = UIViewController
Comment sont présentées les données?
77. UIViews
Une UIView = une surface rectangulaire dans laquelle on
peut dessiner et gérer des évènements.
Hiérarchique: une vue a 1 supervue et des sous-vues.
Construite dans XCode graphiquement (Storyboard).
Ou dans le code directement (pour les vrais ;-).
81. Storyboard
Défini sous forme graphique la composition
des vues et l'association des controleurs.
●
Outlets: propriétés du code source liés à
un élement de l'interface (ex: un bouton)
●
Actions: les messages quand un
évènement se produit (ex: une "touche"
sur le bouton).
C'est en fait un fichier XML maintenu par
Interface Builder.
83. Segues
C'est une transition entre 2 view controllers.
Push segue pousse le "destination view controller" sur navigation controller’s
stack.
Modal segue présente le "destination view controller" (modal = bloquant
jusqu'à "dismiss").
Popover segue affiche le "destination view controller" dans un popover
(affichage par dessus). Ipad uniquement.
Custom segue permet de définir une transition personalisée (ex: avec une
animation)
87. Un vaste sujet...trop pour ce cours !
Auto layout
Adaptation automatique à la taille d'écran de l'iPhone.
Basé sur de la définition de contraintes.
Programmable.
Auto rotation
Adaptation des éléments à la rotation de l'écran (mode portrait / paysage).
Gestures
Swipe, Pinch, etc... tous les gestes d'utilisation du multitouch.
Définis dans le storyboard par drag&drop sur un composant.
91. XCode > Organizer
Gestion des projets
Gestion des devices
Gestion des repository Git
Gestion de la documentation
Gestion des archives (de la distribution des apps)
92. XCode > Debugger
LLDB (ou GDB au choix)
Exécution pas à pas, etc...
Points d'arrêt.
Inspection des variables.
Vue des queues d'exécution vs threads.
Du classique pour un IDE.
93. XCode > Simulator
Simulation *presque* complète:
● des différents modèles d'iphone
● des différentes versions d'OS
Il manque certaines fonctions liées au matériel:
● la caméra
● le gyroscope
● ...
Mais il y en a certaines:
● orientation de l'écran
● GPS
95. Processus de publication
1.
2.
3.
4.
5.
6.
7.
S'enregistrer à l'Apple Developer Program : 80€ pour iOS.
Générer toutes les clés/certificats (PKI) nécessaires:
a. Développeur : pour soi
b. Adhoc : pour des devices d'une flotte de tests
c. Distribution : pour la distribution sur l'AppStore
Activer le développement sur son iPhone et l'enregistrer (UDID) chez Apple
Enregistrer l'app sur iTunes Connect
a. Accepter les contrats Apple
b. Prix, Données administratives, Contacts, Compte bancaire, Mots clés, Icônes, etc, etc...
Soumettre l'app (ou sa mise à jour) : 5 à 10 jours en moyenne pour la validation d'Apple.
Un fois validée, autoriser la distribution de l'app
Récupérer la monnaie: 70% des ventes (30% pour Apple)
http://developer.apple.
com/library/ios/#documentation/ToolsLanguages/Conceptual/YourFirstAppStoreSubmission/AboutYourFirstAppStoreSubmission/AboutYourFirstAppStoreSubmi
96. Visibilité des Apps
Ref: http://blog.gaborcselle.com/2012/10/the-biggest-problem-in-app-discovery.html
103. github.com
Basé sur outil de gestion des versions "git".
Gestion des bugs, des branches, etc...
Outil social.
Vitrine. CV réel du développeur.
Et surtout nombreuses librairies et exemples pour iOS.
Ne réinventez pas la roue:
● cherchez & utilisez pour vos besoins
○ Vérifiez toujours les licences
● "forkez" puis améliorer/personaliser (si besoin)
104. stackoverflow.com
Foire aux questions.
Notification, gratification, etc...
Communauté iOS très active.
Impressionnant niveau d'expertise de certains membres.
Qualité des réponses.
Faîtes une recherche avant de poser votre question.
106. Alternatives à XCode et Objective C
HTML 5 bien sûr (le mobile web).
Pro:
● portabilité
● coût
● formation (réutilisation compétences)
Cons:
● pas de visibilité sur l'AppStore
● expérience utilisateur (suivant la réalisation)
● performance (exemple récent: Facebook)
● peu d'accès aux API natives (ex: contacts, photos, ...)
107. Alternatives à XCode et Objective C
Hybride: HTML5 + Natif
Phonegap, Titanium, ...
Pro:
● visibilité sur l'AppStore
● accès aux API natives
● portabilité
● coût
● formation
Cons:
● expérience utilisateur (ça dépend)
● performance (ça dépend)
● pérennité
● accès incomplet aux API natives
110. Parse, Stackmob, Kinvey, ...
Optimiser le développement d'app, en particulier le serveur.
Fourniture d'un backend serveur (PAAS - Platform as a Service):
Stockage des données et fichiers
Gestion des utilisateurs (signup/signin + réseaux sociaux)
API REST & versioning
Gestion notifications push
Analytics
Sécurité des échanges
API Clientes: iOS, Android, W8, Javascript, REST, ...
Intégration avec partenaires (envoi SMS, ...)