Xamarin et le développement
natif d’applications Android,
iOS et Windows en C#
07/03/2014

1
Cyril CATHALA
Expert .NET – Soat
MVP C#

@CyrilCathala
http://cyril.cathala.org

Wallbase

Quoties

1 Indice 1 Mot

Showrizo

Movie Battle
Agenda
Les enjeux de la mobilité
Hybride vs natif
Xamarin
Sous le capot
Design & UX
Multiplateforme
MvvmCross
07/03/2014

3
LES ENJEUX DE LA MOBILITÉ

#mstechdays

07/03/2014

4
Marché du mobile

07/03/2014

5
Fragmentation

07/03/2014

6
Fragmentation

07/03/2014

7
Fragmentation

07/03/2014

8
“By 2016, 70% of the mobile workforce
will have a smartphone, and 90% of
enterprises will have two or more
platforms to support”
Gartner Research

07/03/2014

9
HYBRIDE VS NATIF

#mstechdays

07/03/2014

10
Web mobile
• Plus
– Standard multiplateformes
– Version du site déclinée format
mobile
– Faibles coûts
– Référencement via moteur de
recherche

• Moins
– Expérience limitée au navigateur
– En ligne uniquement

Natif
• Plus
–
–
–
–

Meilleures performances
Référencement via Store
Respect de l’expérience utilisateur
Support du hors ligne

• Moins
– Spécifique à la plateforme
– Coûteux
– Maintenance
07/03/2014

11
Type

Description

Exemples

Cible

Langage

Web app

• Site web responsive
• Aide au développement
avec composants
réutilisables

jQuery Mobile, Sencha
Touch, Zepto JS, ImpactJS,
LimeJS, iUI, Wink…

Développeurs
web

Javascript

Hybride web

• Wrapper d’app HTML/JS
• Single-page app
• Web app avec
fonctionnalités natives

Adobe PhoneGap Build,
Uxebu, Sencha Touch v2,
MoSync…

Développeurs
web

HTML/CSS/Javascript

Cross-compilation

• 1 langage compilé dans le
langage natif cible

Xamarin, Titanium…

Développeurs
logiciel

Langage supporté (C#,
Javascript, Java…)

Runtime

• Machine virtuelle qui fait
tourner du code
intermédiaire

Adobe Air

Développeurs
logiciel

Langage supporté
(ActionScript, JS…)

Bas niveau

• Composants graphiques bas Unity, MonoGame,
niveau
DeltaEngine, Corona …
• Utilisé pour les jeux

Développeurs
jeux

Langage supporté
(C++, OpenGL…)

07/03/2014

12
Les utilisateurs veulent du natif pour :
- l’experience
- le look & feel
- les performances
- les fonctionnalités
XAMARIN

#mstechdays
Historique
Projet Mono (2001)
– Mené par Miguel de Icaza

MonoTouch / MonoDroid (2011)
Xamarin pour Mac (fin 2012)
Xamarin 2.0 (février 2013)
Partenariat Xamarin / Microsoft (novembre 2013)
07/03/2014

15
Xamarin c’est quoi ?

07/03/2014

16
Approche en silos

Android

iOS

Windows

Java
Eclipse

Objective-C
XCode

C#
Visual Studio

07/03/2014

17
Xamarin pour des applications natives
Développement en C#
1 Outil pour les compiler tous

07/03/2014

18
Rêve du développeur .NET
C# 5.0 / .NET 4.5
–
–
–
–

LINQ
async/await
.NET framework
Garbage collection

C# Libraries
– SQLite, JSON.NET, SharpZipLib…
07/03/2014

19
Outils
Visual Studio

– Add-in
– Connexion à un Mac

Xamarin Studio

– Basé sur MonoDevelop

Android designer
iOS designer (alpha)
– Mac uniquement

07/03/2014

20
Environnement de développement
OS

IDE
iOS
Android
Windows
Phone
(1) License business minimum
(2) Mac requis

Mac OS X
Xamarin
Studio
✓
✓
-

Windows
Xamarin
Visual Studio
Studio
(1)(2)
✓
(1)
✓
✓
-

✓

(1)

07/03/2014

21
Partage de code
Android

iOS

Windows

UI
Spécificités

UI
Spécificités

UI
Spécificités

Code commun
(business)

07/03/2014

22
API native
100% des APIs disponibles
Toujours à jour
– iOS7 pour Xamarin sorti le même jour

07/03/2014

23
Pourquoi utiliser Xamarin ?
- Développer en C# pour tous les OS
- Performances optimales
- API native
- Réutilisation de code
- Respect de l’expérience utilisateur

07/03/2014

24
Gratuit ?
Free Starter Edition
32kb d’IL
~25MB code source, sans linking

30 jours version d’essai
MSDN
– 90 jours avec un abonnement MSDN
– 1 Licence Business pour iOS + Android : $1399 ($1998)
– 5 Licences Enterprise pour iOS + Android : $9900 ($18900)
07/03/2014

26
Création de projets

XAMARIN
SOUS LE CAPOT

#mstechdays
Configuration

07/03/2014

29
Packaging et exécution
Packaging
–
–
–
–

Configuration
Compilation : ARM / IL
Inclue dll Xamarin utiles
Signature (device / store)

Xamarin runtime
– Allocations mémoire
– Garbage collection : Sgen vs Boehm
– Interopérabilité avec la plateforme

07/03/2014

30
Tests & debug
Debugger sur simulateur ou device
Xamarin Test Cloud
– 100aine de devices
– Fragmentation / Performance
– Scripting

07/03/2014

31
Documentation Xamarin
http://docs.xamarin.com/
Fondamentaux de chaque OS
Sujets avancés
Recettes
Exemples de code
07/03/2014

32
DESIGN & UX

#mstechdays

07/03/2014

33
UX iOS != Android != Windows

07/03/2014

34
UX différente

07/03/2014

35
Windows
iPhone
Phone

Android
Navigation différente

07/03/2014

37
Form factors
Téléphone vs tablette
Fragmentation Android
Form factor + capabilities
Différence d’UX
Approche développement différente
07/03/2014

38
MULTIPLATEFORME

#mstechdays

07/03/2014

39
Architecture
75% de code réutilisé (en moyenne)
Aucun partage d’UI
Portable Class Library
Link File
Conditional compilation
07/03/2014

40
File linking
Symboles prédéfinis
–
–
–
–
–

#if
#if
#if
#if
#if

__MOBILE__
__ANDROID__
__IOS__
WINDOWS_PHONE
SILVERLIGHT

Pour en avoir plus : Build Settings
07/03/2014

41
Architecture

07/03/2014

42
Vocabulaire
WINDOWS PHONE
View (.xaml)

ANDROID
Layout (.axml)

Page

Activity

UserControl
Frame
Application

Fragment
Intent
-

iOS
UIView (.xib ou
.storyboard)
UIViewController
UIView
UINavigationController
UIApplication

07/03/2014

43
Xamarin.Mobile
API cross platform
Contacts
Géolocalisation
Caméra
VNext
– Compas + Accéléromètre
– Notifications
07/03/2014

44
Android - Contacts
ContentResolver content = getContentResolver();
Cursor ncursor = null;
try {
ncursor = content.query (ContactsContract.Data.CONTENT_URI,
new String[] { ContactsContract.Data.MIMETYPE, ContactsContract.Contacts.LOOKUP_KEY, ContactsContract.Contacts.DISPLAY_NAME },
ContactsContract.Data.MIMETYPE + "=? AND " + ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME + "=?",
new String[] { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, "Smith" }, null);
while (ncursor.moveToNext()) {
print (ncursor.getString(ncursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) + lineSep);
String lookupKey = ncursor.getString (ncursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Cursor dcursor = null;
try {
dcursor = content.query (ContactsContract.Data.CONTENT_URI,
new String[] { ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.Data.DATA1 },
ContactsContract.Contacts.LOOKUP_KEY + "=?", new String[] { lookupKey }, null);
while (dcursor.moveToNext()) {
String type = dcursor.getString (ncursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
if (type.equals (ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE))
print ("Phone: " + dcursor.getString(dcursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) + lineSep);
else if (type.equals (ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE))
print ("Email: " + dcursor.getString(dcursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1)) + lineSep);
}
} finally {
if (dcursor != null)
dcursor.close();
}
}
} finally {
if (ncursor != null)
ncursor.close();
}

07/03/2014

45
iOS - Contacts
ABAddressBookRef ab = ABAddressBookCreate();
CFStringRef name = CFSTR ("Smith");
CFArrayRef smiths = ABAddressBookCopyPeopleWithName(ab, name);
CFRelease (name);
int count = CFArrayGetCount(smiths);
for (int i = 0; i < count; ++i) {
ABRecordRef person = (ABRecordRef)CFArrayGetValueAtIndex(smiths, (CFIndex)i);
if (ABRecordGetRecordType(person) != kABPersonType)
continue;
NSString *name = (NSString*)ABRecordCopyCompositeName(person);
NSLog ("%@n", name);
[name release];
ABMultiValueRef phoneNumberProp = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSArray* numbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProp);
CFRelease(phoneNumberProp);
for (NSString *pvalue in numbers)
NSLog ("Phone: %@n", pvalue);
[numbers release];
ABMultiValueRef emailProp = ABRecordCopyValue(person, kABPersonEmailProperty);
NSArray* emails = (NSArray*)ABMultiValueCopyArrayOfAllValues(emailProp);
CFRelease(emailProp);
for (NSString *evalue in emails)
NSLog ("Email: %@n");
[emails release];
}
CFRelease (ab);
CFRelease (smiths);

07/03/2014

46
Xamarin.Contacts
var book = new AddressBook (this) {
PreferContactAggregation = true
};
foreach (Contact c in book.Where (c => c.LastName == "Smith")) {
print (c.DisplayName);
foreach (Phone p in c.Phones)
print ("Phone: " + p.Number);

foreach (Email e in c.Emails)
print ("Email: " + e.Address);
}
07/03/2014

47
MonoTouch.Dialog
public class Expense
{
[Section("Expense Entry")]
[Entry("Enter expense name")]
public string Name;
[Section("Expense Details")]
[Caption("Description")]
[Entry] public string Details;
[Checkbox]
public bool IsApproved = true;
[Caption("Category")]
public Category ExpenseCategory;
}

07/03/2014

48
Composants Xamarin
http://components.xamarin.com
Composants cross platform
– UI
– Services
– Thèmes

07/03/2014

49
Bindings
Pont Xamarin <> natif
– https://github.com/mono/monotouch-bindings

07/03/2014

50
Architecture
Xamarin Components Store
Visual Studio

Xamarin Studio

Compilation native
Performances au top

Bindings natifs sur les APIs
iOS / Android

Mono

Implémentation cross-platform de .NET

07/03/2014

51
MVVMCROSS

#mstechdays

07/03/2014

52
MVC

07/03/2014

53
MVVM

07/03/2014

54
MvvmCross en résumé
Binding
– ValueConverter

ViewModels
– Navigation
– Cycle de vie

Inversion of Control
Contrôles simplifiés
Plugins
– File, DownloadCache, Json, Settings, Location…

07/03/2014

55
Configuration
Nuget
Ninja Coder for MvvmCross
Setup
IoC
Auto-configuration DataContext
07/03/2014

56
MVVM CROSS
CONCLUSION

#mstechdays

07/03/2014

58
Ressources
http://xamarin.com/getting-started
– Guide pour développer une app en 10mn

http://docs.xamarin.com
– Documentation, Recettes

http://github.xamarin.com
– Exemples de code

http://mvvmcross.blogspot.fr
– Documentation MvvmCross
07/03/2014

59
Conclusion
Applications natives
– Look & feel
– Performances

Le choix des armes
– Visual Studio
– Xamarin Studio

Partage de code
Communauté grandissante
– 500 000+ développeurs
07/03/2014

60
Conclusion
Oui mais …
–
–
–
–
–
–

Bonnes connaissances en architecture d’application
Paradigmes de chaque plateforme à apprendre
Besoin d’un Mac pour iOS
Packages plus lourds
Coût de la licence
Effet boîte noire
07/03/2014

61
Cyril CATHALA
@CyrilCathala
http://cyril.cathala.org

QUESTIONS ?
REPONSES !
07/03/2014

62
Xamarin

Titanium

PhoneGap

Corona

iOS, Android, WP

iOS, Android,
Blackberry

iOS, Android, WP
,
Blackberry

iOS, Android

Langage

C#

Javascript

HTML, CSS,
Javascript

Lua, ObjectiveC, C,
Java

Prix

$300 / plateforme /
développeur / an

Gratuit

Gratuit

$600 / développeur
/ an

UI

UI native (riche)

UI native (riche)

UI Web

Contrôles natifs
courants (acceptable)

Accès API

Accès complet

Accès complet

Limité

Accès complet
(presque)

Performances

Très proche du natif

Presque natif

Dépend de la
WebView du tél

Proche du OpenGL
natif

Types d’app

Productivité /
Utilitaire / Entreprise

Productivité /
Utilitaire

Basique / Simple

Jeux

Plateforme

07/03/2014

63

Xamarin et le développement natif d’applications Android, iOS et Windows en C#