A key component of the creation of cross-platform applications to be able to share code among several specific projects and platform dependent. Each different platform can only use the class libraries that have been developed for that specific platform. In Xamarin there are two main approaches to the sharing code: Using Shared Asset Projects (Shared Library) and the Portable Class Library (PCL) Projects. In this session we will see how and when to use the shared library, or the PCL library and we will try to answer the question: Shared or PCL?
3. 3
Cross Platform
PCL vs STL
Apache Cordova, Ionic, PhoneGap per
realizzare app ibride cross-platform in HTML5
e Javascript
Xamarine Studio, Android Studio,
Xcode, Visual Studio
4. 4
PCL vs STL
App Ibride o Native?
Time To Market
Fluidità
Accesso API di sistema
Accesso a Hardware importante
(Geo, Camera ecc)
UX / UI
NativaIbrida
Si No
No
No
No
Si
Si
Si
Si
Non esiste un approccio migliore o peggiore di un altro
ma dipende da ciò che dobbiamo fare e in che tempi
5. 5
Sviluppo di app native
Utilizzo di un linguaggio comune e conosciuto come C#
Utilizzo di Visual Studio
Utilizzo di Xamarin Studio
Android, iOS,Android Wear,Android Tv, Apple Watch,
WinPhone, UWP
6. 6
Xamarin.Android Xamarin.IOS
Xamarin (C#)
Xamarin SDK IOS SDK Windows Phone
SDK
Basato su Mono, permette lo
sviluppo di app Android tramite
un wrapping delle API native in
C#
Grazie alla libreria proprietaria
MonoTouch, offre pieno
supporto allo sviluppo di app
iOS tramite un wrapping delle
API native in C#
Frameworks
7. 7
Architettura di Xamarin
Ha un piccola porzione di codice in
C# nei progetti di ognii piattaforma
ed è necessario per inizializzare ed
eseguire l’app su ogni OS nativo
Shared C# User Interface code Using Xamarin
Forms
Shared C# App Logic
Platform Specific
Inizialitation Code
Cross Platform
UI Layer
Core Library
Offre la logica dell’applicazione e
di accesso ai dati definita in C#
È lo strato contenente tutta la UI
realizzata, ad esempio con
Xamarin.Forms definita in C#
PCL vs STL
8. 8
PCL vs STL
In breve, l’IDE e il sistema
operativo da utilizzare
saranno legati al modello
di business previsto per la
nostra app.
IDE E SUE LIMITAZIONI
9. 9
App
(portable)
In questo progetto andremo a
scrivere il codice condiviso di
tutta la solution compresa la
logica di business e la UI.
App.Android
In questo progetto è contenuto
il codice nativo di Android e
questo è il progetto che è
selezionato per default.
App.iOS In questo progetto è contenuto
il codice nativo di iOS.
App.UWP
In questo progetto è contenuto
il codice nativo di UWP.
PCL – Portable Class Library
PCL vs STL
10. 10
La Dependency Injection offre le linee guida per includere le funzionalità specifiche di una piattaforma nella
nostra soluzione, fornendo un modo per implementare i pattern Strategy e/o Bridge descritti da Gang of
Four (GoF).
Android
iOS
Windows-UWP
MainActivity.cs
MainActivity.cs
MainPage.xaml.cs
Startup Class. File.
Nel progetto principale troviamo al suo
interno file App.xaml.cs. Questa classe
definisce e offre la pagina principale
dell’app ed è referenziata in ogni progetto
della soluzione attraverso le rispettive
startup class.
PCL – Portable Class Library
PCL vs STL
12. 12
La creazione di un’interfaccia, INomeClasse, definita nel PCL.
L’implementazione specifica delle interfacce del PCL all’interno
dei progetti delle piattaforme di interesse e opportunamente
registrate tramite il tag [assembly]
La classe DependencyService, messa a disposizione da xamarin,
è utile per implementare i principi del DI attraverso
PCL – Portable Class Library
[assembly: Xamarin.Forms.Dependency(typeof(NomeClasse_PIATTAFORMA))]
l’invocazione del metodo specifico all’interno del codice condiviso usando il
metodo DependencyService.Get<INOMECLASSE>.Nome_Metodo
13. 13
App.xaml.cs (clase della Portable)
Inizializzazione Xamarin.Form
namespace App2.Droid
{
[Activity(Label = "App2", Icon =
"@drawable/icon", Theme = "@style/MainTheme",
MainLauncher = true, ConfigurationChanges =
ConfigChanges.ScreenSize |
ConfigChanges.Orientation)]
public class MainActivity :
global::Xamarin.Forms.Platform.Android.FormsAppCo
mpatActivity
{
protected override void OnCreate(Bundle
bundle)
{
TabLayoutResource =
Resource.Layout.Tabbar;
ToolbarResource =
Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
}
}
}
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new
App2.MainPage();
}
protected override void OnStart()
{
// Handle when your app starts
}
protected override void OnSleep()
{
// Handle when your app sleeps
}
protected override void OnResume()
{
// Handle when your app
resumes
}
}
PCL –Snippet Code
PCL vs STL
14. 14
In particolare, dalla colonna di Xamarin si evince che Xamarin.iOS e Xamarin.Android
supportano tutte le caratteristiche riportate in tabella. Xamarin.Forms è quindi fortemente
limitato da Windows Phone e dalla versione del .NET Framework richiedendo così allo
sviluppatore di impiegare meccanismi più articolati per fornire servizi basilari ed essenziali
come, ad esempio, la localizzaione dell’utente.
PCL – Funzionalità supportate
PCL vs STL
Funzionalità supportate da PCLs
15. 15
STL – SharedTemplate Library
PCL vs STL
E’ durante la compilazione che Il codice è condiviso
tra i progetti di interesse durante la
compilazione della soluzione.
16. 16
Direttive C# al compilatore
#If #elif
#endif
Il limite di questo approccio è:
I progetti Android e iOS accedono ad una
versione del .NET framework che differisce da
quella usata per i progetti Windows.
Quindi è necessario differenziare il codice per
ogni piattaforma supportata per effettuare
l’operazione di interesse, come ad esempio
accedere a un database.
Shared Project (e i suoi layer) vengono
praticamente copiati in ogni progetto della
soluzione che lo referenzia, e viene
compilato come parte del progetto
17. 17
PCL vs STL
STL – DirettiveC# al
compilatore
_MOBILE_
_IOS_
_ANDROID_
_ANDROID_nn_
WINDOWS_PHONE_APP
WINDOWS_PHONE_APP
Impiegato nei progetti iOS e
Android
Definito nel progetto iOS
Definito nel progetto Android
Definito per Android, dove nn rappresenta il livello delle
API per cui eseguire una particolare azione
Definito nel progetto per
Windows Phone
Utilizzato nel progetto delle UWP
#if __IOS__
// codice specifico per iOS
#elif __ANDROID__
// codice specifico per Android
#elif WINDOWS_PHONE_APP
// codice specifico per Windows Phone
… //supporto agli altri progetti
#endif
18. 18
PCL STL
Pro
• Condivisione del codice tra progetti.
• Creazione di una DLL che può essere condivisa
in altre soluzioni.
• Refactoring del codice più semplice
• Condivisione del codice tra progetti.
• Il codice può essere gestito con le direttive del compilatore.
• Possibilità di includere referenze specifiche
Contro • Utilizzo di un sottoinsieme di funzioni del .NET
Framework limitato dalle piattaforme
supportate.
• Complessità nell’aggiungere comportamenti
specifici delle piattaforme
• La compilazione del progetto non genera un assembly come
output da referenziare in altri progetti (inclusi quelli
Shared).
• Refactoring del codice con le direttive del compilatore è più
complesso
Analisi • Se l’assembly generato deve essere condiviso
con altri sviluppatori.
• Rispetto a STL è Largamente impiegato.
• Ottimo approccio che permette una gestione più semplice
delle specifiche funzionalità delle piattaforme.
• Consigliabile se il codice non è condiviso con altri
sviluppatori ed è utilizzato solo all’interno della soluzione
PCL vs STL
STL – PCL vs STL
19. 19
Xamarin Nativa Ibrida
Gruppo di sviluppo Singolo (C#, .NET) Un gruppo per ogni
piattaforma
Singolo (HTML5, Javascript,CSS)
Condivisione del
codice
Si, Oltre 80% No, il codice è differente
per piattaforma
Si, 100%
UI/UX Nativa della
piattaforma
Nativa della piattaforma No, una UI per tutte le piattaforme
Performances Ottime: Molto simili al
nativo
Eccellenti Medio basse
Capacità utilizzo
hardware
Alto, utilizza le API
specifiche della
piattaforma
Alto Medio, Si accede all’hardware attraverso
librerie di terze parti
Time to Market Ottimo, un gruppo di
lavoro per tutte le
piattaforme, stesso
linguaggio, stesse API
Scarso, gruppo di lavoro
differente per ogni
piattaforma, con
linguaggi differenti e
problematiche differenti.
Eccellente, un gruppo di lavoro per tutte le
piattaforme e velocità di sviluppo.
PCL vs STL
Perché Xamarin
20. 20
Anche strumenti di sviluppo ibridi per il mobile si stanno evolvendo
rapidamente, mancano ancora le prestazioni e le funzionalità native che Xamarin
offre più o meno allo stesso costo.
Xamarin viene scelto in quanto diminuisce il time to market e i costi di
ingegneria, attraverso la condivisione del codice e utilizzando un unico gruppo di
sviluppo.
Eppure, lo scopo della app e il suo target di riferimento potrebbe essere un fattore
ancora più importante da considerare. Secondo studi, Xamarin è la migliore
soluzione per una App di tipo Aziendale, nella quale una interfaccia utente
standard che copre il 90% dei progetti la logica può essere condivisa tra le varie
piattaforme.
Nel caso di applicazioni di consumo con pesante interfaccia utente, la quantità di
codice condiviso diminuisce drasticamente. Così, Xamarin perde il suo vantaggio
importante e potrebbe essere uguale nel tempo e costi per le soluzioni native.
Perché Xamarin - Conclusioni
PCL vs STL