CocoaHeads Rennes #5 : iOS & Android

Post on 22-May-2015

3407 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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

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

• image@2x.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.

top related