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