Slides de la présentation "iOS & Android" de la session des CocoaHeads Rennais du 10 novembre 2011. Présentation assurée par David Bonnet et Nicolas Klein.
7. Déploiement
Interne : 3 types d’APK :
AdHoc Enterprise APK de APK APK non
développement signé signé
Manuelle Over The Air
Rapidité
de
valida,on
:
Sortie : • Instantané - 10 min au max
• Correction d’un bug rapidement
Sous réserve de • Pas de contraintes bizarres
validation • Post validation
8. Validation des applications
Premier filtrage sur les applications
Impose certaines contraintes de développement
Consommation réseau maîtrisée
Temps de validation considérablement raccourci
Validation stricte
Sécurité accrue
Nécessité d’attendre la validation en cas de bug
9. Sécurité
iTunes Connect
Android Market
• Login/mdp du compte développeur • Login/mdp du compte développeur
• Certificat et provisionning de • Keystore
distribution
Gestion du piratage
Gestion du piratage
• à la charge du développeur • Licence Validation Library (LVL)
• In App Purchase • In App Purchase
10. Cycle de vie de l’application
Statistiques Statistiques
• iTunes Connect Sales report très • Nombre téléchargements
limité Totaux / Actifs + Courbe
• Des outils tiers sauvent la mise • Répartition par version d’OS,
terminal, pays, langue
Rapports de crashs remontés •
Depuis 2.2, crashs remontés par les
automatiquement depuis iPhone OS 2.0
utilisateurs
Commentaires et notes
Commentaires et notes
• Liés à la version de l’application • Bientôt possibilité de répondre
• Notes sans commentaire possible • Pas par version
11. Cycle de vie de l’application
Statistiques Statistiques
• iTunes Connect Sales report très • Nombre téléchargements
limité Totaux / Actifs + Courbe
• Des outils tiers sauvent la mise • Répartition par version d’OS,
terminal, pays, langue
Rapports de crashs remontés •
Depuis 2.2, crashs remontés par les
automatiquement depuis iPhone OS 2.0
utilisateurs
Commentaires et notes
Commentaires et notes
• Liés à la version de l’application • Bientôt possibilité de répondre
• Notes sans commentaire possible • Pas par version
12. Cycle de vie de l’application
Statistiques Statistiques
• iTunes Connect Sales report très • Nombre téléchargements
limité Totaux / Actifs + Courbe
• Des outils tiers sauvent la mise • Répartition par version d’OS,
terminal, pays, langue
Rapports de crashs remontés •
Depuis 2.2, crashs remontés par les
automatiquement depuis iPhone OS 2.0
utilisateurs
Commentaires et notes
Commentaires et notes
• Liés à la version de l’application • Bientôt possibilité de répondre
• Notes sans commentaire possible • Pas par version
13. Catégories disponibles
• Top New Free
• Top New Paid
• Top Grossing • Top Grossing
• Top Free • Top Free
• Top Paid • Top Paid
• More from Developer • More from Developer
• Super Developer
• Apple week selection • Editor’s choice
15. Disposition des éléments
• Absolu On est certain du On connait la disposition
rendu final • Relatif
des éléments et le rendu sur
certains appareils
• Résolution fixe (en points) sur iPhone
• Multi-terminaux
• Définition supérieure sur certains
terminaux • Multi résolutions
• Le futur ? S’adapter pour tirer • Gestion multi-résolution par multi-
pleinement parti du périphérique fichier ou padding
• Uniquement des Téléphones et Tablettes • de la Télévision au Téléphone en passant
disponibles au développement par l’Auto-radio
16. Multi densité des écrans
• Multiple entier de la résolution native de • Les multi densités sur Android sont
l’iPhone original représentées par des dossiers :
• iPhone : 320x480 • Drawable
• iPhone Retina : 640x960 (x2) • Drawable-ldpi
• Drawable-mdpi
• Ajout du suffixe correspondant au • Drawable-hdpi
multiple sur l’image
• Drawable-xhdpi
• image.png
• image@2x.png
17. Gestion Portrait / Paysage
• UIAutoresizingMask • Resizing automatique via les
layout du SDK
• Redimentionnement automatique
des éléments
• Suffisant dans la plupart des cas
• Repositionnement via la • Possibilité d’avoir un fichier différent
méthode layoutSubviews pour chaque orientation
parfois nécessaire • Exemple : layout et layout-land
• Géré automatiquement par le
système
18. Liaison Fichier UI / Code
• IBOutlet • findViewById
• Syntaxe lourde • Accès simple à un élément de
• Généré nativement par Xcode 4 l’interface
• Accès via l’Activité parente
• viewByTag • Problèmes :
• Appel d’une vue par son tag sur la • Tout id défini est récupérable !
vue parente (superview) • Passage systématique par un cast
• Peu conseillé • Nécessite d’être rigoureux
20. Simulateur / Emulateur
• Simule iOS sur une architecture x86 / • Emule le hardware sur une machine
x86_64 virtuelle armv7
• Permet de se « rendre compte » du • Attention : Lourd à exécuter !
rendu de l’application
• Possibilité de snapshots
• Attention : Environnement parfait !
Il est important de tester sur le système réel !
22. Fragmentation
• Soit disant problème d’Android
• Quasiment aucun impact sur le développement
• Un problème remonté par la presse et le marketing
• Problème sur les surcouches
• OS pensé pour d’autres systèmes que les smartphones et
tablettes contrairement à iOS
• Google TV / Parrot Asteroid
24. Héritages de JAVA 5
• Les bases de JAVA sont disponibles :
• Exemples : java.lang - java.util- java.io - java.sql - java.net
• Quelques surcouches Android :
• Exemples : android.net - android.util - android.database
25. Nouveautés propre au système
android.nfc
android.gesture
android.telephony
android.location
android.opengl android.widget
android.view ...
Nombreux ajouts en surcouche
26. Héritage de Cocoa
• Les bases de CoreOS sont disponibles
• Exemples : CoreFoundation - CoreGraphics - CoreData -
CoreNetwork - ...
Enrichissement des bases
CoreImage GLKit CoreBluetooth
28. Multi-tâches
• Contrôle maîtrisé par le système • Tout est possible via les Services
1. Background Audio • Le développeur doit faire la part
des choses
2. Voice over IP
3. Background location
• Déclenchement
4. Push Notifications
• via Intent
5. Local Notifications
• à une date donnée
6. Task completion
• à un évènement donné
7. Fast app switching
(boot, connexion)
31. Ressources
• Possiblité de créer des Bundles • Ressources externalisables dans des
fichiers XML
• Localisation avec un fichier strings : • strings / layouts / dimens / anims / ...
• fr_FR.lproj/Localizable.string
(en français)
• Localisation en ajoutant des suffixes
aux répertoires concernés :
• en_US.lproj/Localizable.strings • values/strings.xml (par défaut)
(en américain)
• values-fr/strings.xml (en français)
• Langue par défaut dans le info.plist • values-fr-CA/strings.xml
(en québéquois)
33. Open Source
• Bases Open Source • Totalement Open Source (AOSP :
http://source.android.com/)
• http://opensource.apple.com/
• http://developer.apple.com/ • Facilité pour débugger
opensource/ • Permet de progresser
• Certaines bibliothèques Apple sont Open • Cas spécial Honeycomb (3.0)
Source
• Code non optimal
• Grand Central Dispath (GCD) • Non prévu pour Smartphone
• WebKit • Résolu avec Ice Cream Sandwich
• Bonjour / LLVM / Noyau Darwin (4.0)
35. Bibliothèques tierces
• Intégration de bibliothèques • Intégration de bibliothèques
• Seulement des bibliothèques statiques ! • Tout est permis
• Bibliothèques dynamiques réservées au • Intégration de .jar
système (possible sur OS X)
• Android Project Library
• Utilisation des frameworks privés iOS • Utilisation des frameworks privés
interdite et détectée à la validation
Android via l’inclusion du code source
• Chameleon project : reproduction UIKit
sur OS X (http://chameleonproject.org/)
37. Gestion mémoire
• Reference-counting • Garbage collector
• Le développeur gère la mémoire de • Pas de gestion mémoire à réaliser
son application par le développeur
• Retain / Alloc / New / Copy (+1) • Imprévisible
• Autorelease / Release (-1) • Bloque tout traitement dont l’UI
• SDK 4.3 et inférieur • Avant 2.3
• Gestion de la mémoire • 100ms de pause pour le GC
« manuellement »
• Depuis 2.3
• SDK 5.0 et supérieur
• Parallel GC Quasi invisible
• ARC (Automatic Reference Counting)
38. Ecrivons une pile...
public class Stack<T> {
private ArrayList<T> mList;
public Stack() {
mList = new ArrayList<T>();
}
public void push(T x) {
mList.add(x);
}
public T pop() {
final T x = mList.get(mList.size() - 1);
mList.remove(x);
return x;
}
}
39. Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
if (self = [super init])
_array = [NSMutableArray array];
Tableau en autorelease !
return self;
Le système peut s’en séparer à
}
n’importe quel moment
- (void) push: (id) x {
[_array addObject: x];
}
- (id) pop {
id x = [_array lastObject];
[_array removeLastObject];
return x;
}
@end
(WWDC 2011 : 323 Introduction to ARC)
40. Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
if (self = [super init])
_array = [[NSMutableArray array] retain];
return self;
} Désormais il y a une
- (void) push: (id) x { fuite mémoire !
[_array addObject: x]; Ajoutons une méthode dealloc
}
- (id) pop {
id x = [_array lastObject];
[_array removeLastObject];
return x;
}
@end
(WWDC 2011 : 323 Introduction to ARC)
41. Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
if (self = [super init])
_array = [[NSMutableArray array] retain];
return self;
}
- (void) push: (id) x {
[_array addObject: x];
}
- (id) pop { x peut-être libéré à
id x = [_array lastObject]; tout moment !
[_array removeLastObject]; Fonctionne seulement si x est
return x; référencé ailleurs
}
- (void) dealloc { [_array release]; [super dealloc]; }
@end
(WWDC 2011 : 323 Introduction to ARC)
42. Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
if (self = [super init])
_array = [[NSMutableArray array] retain];
return self;
}
- (void) push: (id) x {
[_array addObject: x];
}
- (id) pop { Désormais on retourne
id x = [[_array lastObject] retain]; un pointeur retenu!
[_array removeLastObject]; On viole la convention, une
return x; fiute est à prévoir
}
- (void) dealloc { [_array release]; [super dealloc]; }
@end
(WWDC 2011 : 323 Introduction to ARC)
43. Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
if (self = [super init])
_array = [[NSMutableArray array] retain];
return self;
}
- (void) push: (id) x {
[_array addObject: x];
}
- (id) pop {
id x = [[_array lastObject] retain];
[_array removeLastObject];
return [x autorelease];
}
- (void) dealloc { [_array release]; [super dealloc]; }
@end
(WWDC 2011 : 323 Introduction to ARC)
44. Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
if (self = [super init])
_array = [[NSMutableArray array] retain];
return self;
}
- (void) push: (id) x {
[_array addObject: x];
}
- (id) pop {
id x = [[_array lastObject] retain];
[_array removeLastObject];
return [x autorelease];
}
- (void) dealloc { [_array release]; [super dealloc]; }
@end
(WWDC 2011 : 323 Introduction to ARC)
45. Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
if (self = [super init])
_array = [NSMutableArray array];
return self;
}
- (void) push: (id) x {
[_array addObject: x];
}
- (id) pop {
id x = [_array lastObject];
[_array removeLastObject];
return x;
}
@end
(WWDC 2011 : 323 Introduction to ARC)
46. Conclusion
Arrivés à maturité, les deux systèmes sont
désormais très proches tout en offrant une
expérience utilisateur différente.