CocoaHeads Rennes #5 : iOS & Android

47
iOS & Android le meilleur des deux mondes Nicolas Klein - David Bonnet Novembre 2011

description

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.

Transcript of CocoaHeads Rennes #5 : iOS & Android

Page 1: CocoaHeads Rennes #5 : iOS & Android

iOS & Androidle meilleur des deux mondes

Nicolas Klein - David BonnetNovembre 2011

Page 2: CocoaHeads Rennes #5 : iOS & Android

CarMusic

David BonnetiOS Developer - Mobile fan - Android newbie

Page 3: CocoaHeads Rennes #5 : iOS & Android

CarMusic

Sur Android en 2012

Page 4: CocoaHeads Rennes #5 : iOS & Android

• Applications : • WishList

• Aion Profile Viewer

• Framework :• DataDroid : gestion des donnees locales et distantes

Développeur Android expert - iPhone intermédiaire

Nicolas Klein

Page 5: CocoaHeads Rennes #5 : iOS & Android

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

Page 6: CocoaHeads Rennes #5 : iOS & Android

L’environnement

Page 7: CocoaHeads Rennes #5 : iOS & Android

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

Page 8: CocoaHeads Rennes #5 : iOS & Android

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

Page 9: CocoaHeads Rennes #5 : iOS & Android

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

Page 10: CocoaHeads Rennes #5 : iOS & Android

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

Page 11: CocoaHeads Rennes #5 : iOS & Android

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

Page 12: CocoaHeads Rennes #5 : iOS & Android

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

Page 13: CocoaHeads Rennes #5 : iOS & Android

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

Page 14: CocoaHeads Rennes #5 : iOS & Android

L’interface utilisateur

Page 15: CocoaHeads Rennes #5 : iOS & Android

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

Page 16: CocoaHeads Rennes #5 : iOS & Android

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

[email protected]

Page 17: CocoaHeads Rennes #5 : iOS & Android

• 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

Page 18: CocoaHeads Rennes #5 : iOS & Android

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é

Page 19: CocoaHeads Rennes #5 : iOS & Android

Simulateur et émulateur

Page 20: CocoaHeads Rennes #5 : iOS & Android

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 !

Page 21: CocoaHeads Rennes #5 : iOS & Android

Fragmentation sur Android

Page 22: CocoaHeads Rennes #5 : iOS & 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

Page 23: CocoaHeads Rennes #5 : iOS & Android

Le cœur du système

Page 24: CocoaHeads Rennes #5 : iOS & Android

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

Page 25: CocoaHeads Rennes #5 : iOS & Android

Nouveautés propre au système

android.gesture

android.location

android.nfc

android.telephony

android.viewandroid.opengl ...

Nombreux ajouts en surcouche

android.widget

Page 26: CocoaHeads Rennes #5 : iOS & Android

Héritage de Cocoa

• Les bases de CoreOS sont disponibles

• Exemples : CoreFoundation - CoreGraphics - CoreData - CoreNetwork - ...

Enrichissement des bases

CoreImage GLKit CoreBluetooth

Page 27: CocoaHeads Rennes #5 : iOS & Android

Multi-tâches

Page 28: CocoaHeads Rennes #5 : iOS & Android

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

Page 29: CocoaHeads Rennes #5 : iOS & Android

Notifications / Widgets

Page 30: CocoaHeads Rennes #5 : iOS & Android

Ressources et Internationalisation

Page 31: CocoaHeads Rennes #5 : iOS & Android

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

Page 32: CocoaHeads Rennes #5 : iOS & Android
Page 33: CocoaHeads Rennes #5 : iOS & Android

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

Page 34: CocoaHeads Rennes #5 : iOS & Android

Bibliothèques tierces

Page 35: CocoaHeads Rennes #5 : iOS & Android

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/)

Page 36: CocoaHeads Rennes #5 : iOS & Android

La Gestion mémoire

Page 37: CocoaHeads Rennes #5 : iOS & Android

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)

Page 38: CocoaHeads Rennes #5 : iOS & Android

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;}

}

Page 39: CocoaHeads Rennes #5 : iOS & Android

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

Page 40: CocoaHeads Rennes #5 : iOS & Android

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

Page 41: CocoaHeads Rennes #5 : iOS & Android

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

Page 42: CocoaHeads Rennes #5 : iOS & Android

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

Page 43: CocoaHeads Rennes #5 : iOS & Android

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

Page 44: CocoaHeads Rennes #5 : iOS & Android

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

Page 45: CocoaHeads Rennes #5 : iOS & Android

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

Page 46: CocoaHeads Rennes #5 : iOS & Android

Conclusion

Arrivés à maturité, les deux systèmes sont désormais très proches tout en offrant une

expérience utilisateur différente.