70-485: ADVANCED OF DEVELOPING WINDOWS STORE APPS USING C#

Preview:

Citation preview

Template designed by

Advanced Windows Store Development Using C#Matteo PaganiSupport Engineer – AppConsult @ Microsoftmatteo.pagani@microsoft.com http://wp.qmatteoq.com

Il percorso di certificazione

• L’esame Advanced Windows Store Development Using C# fa parte del percorso per ottenere la certificazione MCSD sulle Windows Store app

• Gli altri due esami sono:• Programming in C#• Basic Windows Store Development Using C#

• E’ possibile organizzare una review della propria applicazione con un engineer di Microsoft (uno a caso )

• Vengono valutati una serie di criteri (uso della live tile, gestione dei settings, ecc.)

• Se l’app passa la review, è possibile ottenere la certificazione MCSD sostenendo solamente l’esame Advanced

• http://aka.ms/AppToCertDvlup

Il programma AppToCert

• Develop Windows Store apps

• Discover and interact with devices

• Program user interaction

• Enhance the user interface

• Manage data and security

• Prepare for a solution deployment

Gli argomenti della certificazione

I background task sono il meccanismo offerto dal Windows Runtime per effettuare operazioni quando l’app non è in esecuzione.

Concetti fondamentali:

• Imparare a creare un task in background

• Utilizzare la classe Windows.ApplicationModel.Background

• Implementare l’interfaccia IBackgroundTask

Obiettivo 1.1: create background tasks

• Un background task è un progetto separato dall’applicazione, che girà però nel suo stesso contesto (storage, capability, ecc.)

• E’ un progetto di tipo Windows Runtime Component e contiene una classe pubblica che implementa l’interfaccia IBackgroundTask

• Il metodo Run() definisce il codice che viene eseguito quando il background task viene lanciato

Creare un background task

public sealed class BikePositionUpdateBackgroundTask : IBackgroundTask{

public void Run(IBackgroundTaskInstance taskInstance){

}}

Il background task deve essere registrato nel file di manifest e nel codice dell’applicazione principale

Creare un background task

var taskName = "bikePositionUpdate";var builder = new BackgroundTaskBuilder();builder.Name = taskName;builder.TaskEntryPoint = "BikeGPS.BikePositionUpdateBackgroundTask";

Il background task viene registrato e gestito dall’applicazione principale.

Concetti fondamentali:

• Usare i trigger

• Gestire il canale di comunicazione

• Interagire con la lock screen

• Gestire trasferimenti di file in background

Obiettivo 1.2: consumare un background task

Trigger: è la condizione che fa scatenare l’esecuzione di un task in background.

Esempi:

• TimeTrigger, per esecuzione a intervalli di tempo

• PushNotificationTrigger, per intercettare le notifiche push

• SystemTrigger, per rispondere a eventi di sistema, come la presenza di connettività

Alcuni trigger richiedono che l’applicazione sia in grado di interagire con la lock screen

Consumare un background task

Condizioni: permettono l’esecuzione di un background task solo se una determinata condizione è soddisfatta.

Esempi:

• InternetAvailable

• UserPresent

• SessionConnected

Consumare un background task

• L’obiettivo dei background task è quello di dare maggiore flessibilità allo sviluppatore, senza intaccare le performance e la batteria del sistema

• Esistono due vincoli:• CPU: tempo di CPU limitato

• Rete: massima quantità di dati trasferibili dalla rete, calcolata in base alla velocità della linea

Consumare un background task

• Il Windows Runtime offre le classi BackgroundDownloader e BackgroundUploader per il trasferimento di file in background

• Devono essere usate per file di medie / grandi dimensioni

• In caso di file necessari per l’utilizzo dell’applicazione o di piccole dimensioni, meglio utilizzare la classe HttpClient

Trasferimento di file

WinMD è il nuovo formato che consente di creare componenti per le applicazioni basate sul Windows Runtime

Concetti fondamentali:

• Creare un componente WinMD in C#

• Utilizzare un componente WinMD

• Gestire i tipi dei componenti WinMD

• Aggiungere una reference ad un componente WinMD

Obiettivo 1.3: creare componenti WinMD

• Sono librerie che possono essere utilizzate all’interno di una Windows Store app

• Sfruttano lo stesso approccio di Win32 (COM, P/Invoke, ecc.) ma sono più semplici da consumare

• Grazie ai file .winmd (che contengono i metadati che descrivono la libreria), è possibile utilizzarle indipendentemente dal linguaggio con cui è stata sviluppata l’app

I componenti WinMD

• Tutti i campi, parametri e valori di ritorno di un metodo pubblico devono essere tipi base del Windows Runtime

• Le classi pubbliche devono essere sealed

• Tutti i tipi pubblici devono avere un namespace base che coincida con il nome dell’assembly e non deve iniziare con la parola chiave «Windows»

Creare un componente WinMD

I concetti fondamentali sono:

• Utilizzare la classe CameraCaptureUI

• Utilizzare la classe MediaCapture

• Configurare la fotocamera

• Scegliere il codec più adatto

• Gestire gli eventi

Obiettivo 2.1: catturare audio e video

• Adatta per applicazioni nelle quali non è necessario iun controllo avanzato della fotocamera

• L’operazione di acquisizione viene demandata all’applicazione nativa di Windows 8

• La vostra applicazione riceve direttamente la foto o il video che sono stati acquisiti

CameraCaptureUI

• Adatte per il controllo avanzato della fotocamera

• Preview e acquisizione sono a carico dell’applicazione

• Possibilità di controllare in dettaglio le proprietà della fotocamera

• Possibilità di acquisire audio e video in diversi formati

• In entrambi i casi, assicurarsi di aver aggiunto le capability Webcam e Microphone nel file di manifest

MediaCapture

I dispositivi Windows sono dotati di numerosi sensori, con cui è possibile interagire dall’applicazione.

Concetti fondamentali:

• Determinare se un sensore sia disponibile

• Configurare il file di manifest

Obiettivo 2.2: interagire con i sensori

• Ogni sensore di movimento (accelerometro, bussola, giroscpio, ecc.) è mappato con una classe del namespace Windows.Devices.Sensors

• Tramite il metodo GetDefault() si ottiene un riferimento al sensore: occorre sempre valutare che non sia null

• Tramite il metodo ReadingChanged ci si può sottoscrivere alle variazioni di dati riportate dal sensore

Sensori di movimento

Principali sensori:

• Accelerometro

• Giroscopio

• Bussola

• Inclinometro

• Luce

• Orientation Sensor, che combina i valori ottenuti dagli altri sensori

Sensori di movimento

• Richiede l’apposita capability nel file di manifest

• E’ possibile ottenere una localizzazione puntuale oppure ricevere i cambiamenti di posizione

• E’ importante verificare lo stato dei servizi prima di utilizzarli tramite la proprietà Status

Geolocalizzazione

• La classe Windows.Devices.Enumeration.DeviceInformation espone il metodo FindAllAsync() per ottenere i dispostivi collegati

• Tramite un enumeratore che accetta un parametro di tipo DeviceClass, è possibile restringere il campo e recuperare solo dispositivi di una certa categora (audio, video, memorie esterne, ecc.)

• E’ possibile sfruttare la classe DeviceWatcher per essere avvisati quando lo stato del dispositivo cambia (collegato, scollegato, etc.)

Obiettivo 2.3: determinare le capability

Windows 8 supporta un contratto di stampa, attivabile dalla charm bar

Concetti fondamentali:

• Implementare il contatto di stampa

• Creare un template di stampa

• Visualizzare l’anteprima di stampa

• Gestire la paginazione

• Gestire le impostazioni di stampa

• Supportare la stampa dall’applicazione

Obiettivo 3.1: implementare la stampa

• Ci si sottoscrivere all’evento PrintTaskRequested della classe PrintManager

• Si crea un task tramite il metodo CreatePrintTask()

• L’oggetto PrintTask offre diversi eventi per gestire i vari stati della stampa:

• Previewing

• Progressing

• Completed

• Submitting

• E’ possibile sfruttare lo XAML per creare un template personalizzato per la stampa

Implementare la stampa

Il contratto PlayTo consente di inviare lo streaming audio e video di un’applicazione ad un dispositivo in rete, come una Xbox o una TV

Concetti fondamentali:

• Registrare l’applicazione con il contratto PlayTo

• Utilizzare la classe PlayToManager per inviare lo streaming

• Registrare l’applicazione come receiver del contratto PlayTo

Obiettivo 3.2: supportare il contratto PlayTo

• Si utilizza la classe PlayToManager e ci si sottoscrive all’evento SourceRequested

• Nell’evento si chiama il metodo SetSource() e si passa l’oggetto MediaElement con il contenuto audio e video da inviare

• L’applicazione può anche usare la classe PlayToReceiver se vuole ricevere contenuti in streaming da un altro device

Il contratto PlayTo

Windows supporta la possibilità di ricevere notifiche push inviate dal Windows Push Notification Service (WNS)

Concetti fondamentali:

• Creare e salvare un canale per le notifiche

• Autenticarsi con il WNS

• Inviare notifiche dal WNS

Obiettivo 3.3: inviare notifiche push

• Si chiama il metodo CreatePushNotificationChannelForApplicationAsync() della classe PushNotificationChannelManager

• Si ottiene l’Uri del canale, da salvare in locale e nel backend del vostro servizio

• L’applicazione server invia, tramite una POST HTTP, un pacchetto con l’XML che definisce la notifica

Registrare il canale

• Il servizio di backend deve autenticarsi con il WNS

• Package Security Identifier e Client Secret vengono forniti dal Dev Center in fase di creazione del pacchetto

• Quattro tipologie di notifiche:• Toast

• Tile

• Badge

• Raw (possono essere intercettate solo da un background task)

Inviare una notifica

Il Windows Runtime offre diversi meccanismi per realizzare UI reattive e in grado di rispondere velocemente alle interazioni dell’utente

Concetti fondamentali:

• Scegliere una strategia asincrona per l’applicazione

• Implementare la Task Parallel Library (TPL)

• Convertire operazioni asincrone in Task

Obiettivo 4.1: realizzare una UI reattiva

• In passato si usavano le callback:• Ci si sottoscrive ad un evento che viene invocato quando l’operazione

è terminata

• Si avvia l’operazione

• Ora si usano async e await, che consentono di scrivere codice in maniera sincrona, ma che dietro le quinte viene eseguito su thread differenti da quello della UI

Gestire operazioni asicrone

public async Task Operation(){

StreamReader sr = new StreamReader(@"document.txt");string text = readTask = await sr.ReadToEndAsync();DisplayText.Text = text;

}

• Il metodo che invoca operazioni asincrone deve essere marcato con la parola chiave async

• Il metodo asincrono deve essere invocato con il prefisso await

• Un metodo asincrono deve sempre restituire Task o Task<T>

• Unica eccezione concessa: gli event handler, dato che sono metodi di tipo fire & forget

Gestire operazioni asincrone

• Possibilità, tramite la classe Progress, di tracciare lo stato di avanzamento di un Task

• La classe Task offre metodi per avviare operazioni asincrone multiple in parallelo:

• WhenAll() termina quando tutti i task sono stati completati

• WhenAny() termina quando almeno un task è stato completato

Operazioni asincrone avanzate

Animazioni e transizioni sono fondamentali per creare UI reattive e piacevoli da utilizzare

Concetti fondamentali:

• Sfruttare le animazioni incluse nel runtime

• Creare animazioni e transizioni personalizzate

• Implementare storyboard e trasformazioni

• Utilizzare animazioni predefinite per i controlli

Obiettivo 4.2: creare transizioni e animazioni

• La classe Storyboard consente di definire diversi tipi di animazioni che possono essere controllate in dettaglio

• Diverse tipologie di animazioni, legate al tipo di proprietà da animare (numeri, coordinate, colori, ecc.)

• Il Windows Runtime include molte animazioni predefinite e funzioni matematiche per realizzare animazioni complesse (rimbalzo, dissolvenza, ecc.)

Animazioni

• Le transizioni sono animazioni speciali che vengono automaticamente applicate ad un controllo in seguito ad un evento (caricamento della pagina, aggiunta di un elemento ad una lista, ecc.)

• Non è possibile controllarle in maniera avanzata come le animazioni

• Ricca libreria di transizioni incluse nel Windows Runtime

Transizioni

I custom controlo sono il meccanismo dello XAML che consente di creare controlli personalizzati, in aggiunta a quelli nativi

Concetti fondamentali:

• Scegliere il controllo base corretto come punto di partenza

• Definire lo stile del controllo tramite i template

Obiettivo 4.3: creare controlli personalizzati

• Un custom control è simile ad una pagina, ma vive di vita propria e può essere incluso in altre pagine

• E’ composto da un file XAML e da una classe di code behind

• Tramite dependency property, è possibile definire e aggiungere nuove proprietà che ne definiscono l’aspetto e il comportamento

Custom control

<local:MyCustomControl Width="300" Height="300"ImagePath="Assets/logo.png" ImageLabel="http://www.microsoft.com" />

• I VisualState permettono di definire i differenti stati visuali che può assumere un controllo (es: Normal, Pressed, Disabled)

• Sono definiti nello XAML ed esprimono le differenze rispetto allo stato base

• Da codice si usa la classe VisualStateManager per passare da uno stato all’altro

Visual State

Per ottenere maggiore visibilità, è importante rendere l’applicazione il più facilmente fruibile anche da persone provenienti da paesi diverso dal nostro

Concetti fondamentali:

• Sfruttare i file .resw per gestire le traduzioni

• Supportare diversi sensi di lettura

• Gestire data e ora nella maniera corretta

Obiettivo 4.4: gestire la localizzazione

• I file .resw sono dei file XML che consentono di memorizzare coppie di chiave / valore

• La chiave è definita da un nome seguito dal nome della proprietà che si vuole valorizzare, separati da un punto (es: MyLabel.Text)

• Si associa la risorsa nello XAML tramite la proprietà x:Uid (es: x:Name=«MyLabel»>

• Possibilità di usare immagini localizzate tramite una naming convention per la cartella (Images/en-us/logo.png)

Localizzare l’applicazione

Il Windows Runtime supporta molte tecniche per salvare i dati della propria applicazione

Concetti fondamentali:

• Determinare quale tipo di dato si deve salvare

• Definire dove e quando salvare i dati

• Selezionare il meccanismo di salvataggio più corretto

Obiettivo 5.1: gestire il salvataggio dei dati

• Local: i dati sono persistiti e accessibili solo dall’app stessa

• Roaming: i dati sono sincronizzati tramite OneDrive tra diversi dispositivi

• Temporary: i dati possono essere eliminati dal sistema in caso di necessità

Local e roaming offrono un meccanismo per gestire in maniera semplice le impostazioni dell’applicazione

Le tipologie di storage

• Storage locale

• Librerie di sistema (foto, musica, video, ecc.)

• OneDrive

• Database e soluzioni storage di terze parti (es: SQLite)

• Cloud

Strategie per il salvataggio dei dati

Il Windows Runtime offre alcune classi per interagire con il file system del dispositivo.

Concetti fondamentali:

• Gestire gli stream

• Utilizzare le classi StorageFile e StorageFolder

• Utilizzare i picker

• Accedere alle librerie di sistema

Obiettivo 5.2: leggere e scrivere dati dal file system

• FileOpenPicker: consente di accedere al disco dell’utente e importare, all’interno dell’app, il file selezionato

• FolderOpenPicker: consente di accedere al disco dell’utente e avere accesso, all’interno dell’app, ad una cartella

• FileSavePicker: consente di esportare un file dell’applicazione all’interno del file system

Non sono API ad accesso diretto: è richiesto l’intervento dell’utente

I file picker

• Ogni libreria è collegata ad una specifica capability nel file di manifest

• Le librerie sono esposte dalla classe KnownFolders

• Sono ad accesso diretto, quindi è possibile utilizzare le classi StorageFile e StorageFolder come se fossero file locali

Accedere alle librerie di sistema

• Tramite il file di manifest, è possibile associare l’applicazione ad una o più estensioni di file

• Quando un’altra applicazione vuole aprire un file di questo tipo, viene invocata la nostra applicazione, la quale riceve il file aperto

• Il file aperto viene ricevuto dagli eventi di attivazione dell’applicazione

Associazione ai file

Il Windows Runtime offre delle API per salvare i dati confidenziali in maniera sicura.

Concetti fondamentali:

• Criptaggio dei dati

• Gestione dei certificati

• Criptaggio tramite certificati

Obiettivo 5.3: dati e sicurezza

Il namespace Windows.Security.Cryptograhpy offre una API per criptare i dati utilizzando gli algoritmi più diffusi.

• Hash

• Generazione casuale di numeri e dati

• Algoritmi MAC (Message Authentication Code)

• Firma digitale

Criptaggio dei dati

Il Windows Runtime offre delle API per offrire agli utenti la possibilità di provare la vostra applicazione prima di acquistarla.

Concetti fondamentali:

• Implementare trial temporali

• Implementare trial con limitazione di funzionalità

• Implementare in-app purchase

• Migrare un’applicazione da trial a full

Obiettivo 6.1: Implementare la modalità trial

• L’abilitazione della modalità trial viene definita in fase di submission sul Dev Center

• E’ possibile impostare una data e ora di scadenza: l’applicazione cesserà automaticamente di funzionare scaduto tale termine

• Tramite la classe LicenseInformation è possibile scoprire:• ExpirationDate: la data di scadenza (se si vuole mandare avvisi all’utente)

• IsTrial: se l’applicazione è in esecuzione in modalità trial (se si vogliono disabilitare delle feature)

• La classe offre un metodo per avviare l’acquisto della versione full direttamente dall’app

Aggiungere la modalità trial

• E’ la possibilità di acquistare prodotti dall’applicazione stessa

• La classe LicenseInformation offre tutte le API necessarie per:

• Recuperare l’elenco dei prodotti disponibili

• Avviare la procedura di acquisto

• Verificare se un prodotto sia stato acquistato o meno

• Due tipologie di prodotti acquistabili:• Durable: una volta acquistato, la licenza viene mantenuta a vita.

• Consumable: una volta acquistato, è possibile riacquistarlo nuovamente.

In-app purchase

• All’interno dello storage è possibile configurare un file chiamato WindowStoreProxy.xml che contiene la definizione di prodotti, prezzo dell’app, ecc.

• Nell’applicazione reale, si usa la classe CurrentApp per interagire con i servizi dello Store

• Nell’applicazione di testi, si sua la classe CurrentAppSimulator che recupera i dati da questo file di proxy.

Simulare gli acquisti

Il Windows Runtime offre gli strumenti necessari per gestire gli errori ed evitare crash improvissi durante l’utilizzo dell’app

Concetti fondamentali:

• Realizzare l’app in modo che l’utente finale non veda mai errori od eccezioni

• Gestire gli errori nelle procedure asincrone

• Gestire gli errori dovuti alle capability

Obiettivo 6.2: gestire gli errori

• Le keyword try / catch vi permettono di racchiudere i blocchi di codice che potrebbero generare degli errori

• Mai catturare le eccezioni senza fare nulla (in gergo, soffocare)

• Usare try / catch per gestire scenari che potrebbero fallire, non per risolvere errori di programmazione o progettazione

Gestire le eccezioni

• Se non si usano i metodi asincroni nella maniera corretta (async e await) le eccezioni non vengono intercettate

• I metodi marcati come async void non sono in grado di riportare l’eccezione al Task, perchè non vengono aspettati

• In caso di esecuzione di più task in parallelo, le eccezioni vengono memorizzate all’interno di una AggregrateException

Gestire le eccezioni asincrone

Visual Studio offre dei meccanismi per testare le applicazioni e rilevare potenziali problema prima della pubblicazione.

Concetti fondamentali:

• Unit testing

• Coded UI test

• Test di performance e di carico

Obiettivo 6.3: adottare una strategia di testing

• Unit test: test di tipo che verifica la correttezza delle routine incluse nel codice della nostra applicazione.

• Test funzionale: verifica che l’applicazione esegua i task per cui è stata progettata

• Test di integrazione: verifica che tutte le componenti dell’applicazione funzioni correttamente tra di loro

• Coded UI: test automatici di utilizzo dell’interfaccia utente

Tipologie di test

Visual Studio offre strumenti per monitorare, in tempo reale, il consumo di CPU, memoria, ecc. dell’applicazione

Concetti fondamentali:

• Effettuare il profiling dell’applicazione

• Efettuare il log degli eventi

Obiettivo 6.4: profiling e monitor dell’applicazione

Tool di profiling

Il Dev Center offre una serie di report che possono aiutare a identificare e risolvere problemi

• Dump e stack trace dei crash

• Numeri di download e vendite

Il Dev Center

Grazie a tutti per la partecipazione

Riceverete il link per il download a slide e demo via email nei prossimi giorni

Per contattarmi

matteo.pagani@microsoft.com

Twitter: @qmatteoq

Grazie