• Non ci sono risultati.

6.3 Architettura

6.3.5 Porting dell’applicazione

Una volta realizzata l’intelaiatura, è possibile programmare direttamente l’applicazione come se fosse una qualsiasi Web Application all’interno della cartella HtmlFiles: a tale scopo, portiamo quanto già scritto per Android e Webworks in questa versione IPhone.

Dato che l’interfaccia è comune, possiamo semplicemente trasferire il codice così come è da Android a IPhone. Occorreranno alcuni piccoli adat- tamenti, il primo dei quali è estetico: data l’altissima risoluzione disponibile sullo smartphone di Cupertino, dovremo aumentare le dimensioni dei font per rendere maggiormente visibile la gui; a tale scopo utilizziamo una sem- plice classe css per impostare il tipo di carattere per tutto il documento

6.3. ARCHITETTURA 81

Algoritmo 6.3 Controller IambOOGap I

1 @ i m p l e m e n t a t i o n V i e w C o n t r o l l e r 2 3 @ s y n t h e s i z e w e b W i e w ; 4 5 - ( v o i d ) d i d R e c e i v e M e m o r y W a r n i n g 6 { 7 [ s u p e r d i d R e c e i v e M e m o r y W a r n i n g ];

8 // R e l e a s e any c a c h e d data , images , etc t h a t aren ’ t in use . 9 } 10 11 # p r a g m a m a r k - V i e w l i f e c y c l e 12 13 - ( v o i d ) v i e w D i d L o a d 14 { 15 [ s u p e r v i e w D i d L o a d ]; 16 w e b W i e w . d e l e g a t e = s e l f ; 17 [[ w e b W i e w . s u b v i e w s o b j e c t A t I n d e x :0] s e t B o u n c e s : f a l s e ]; 18 N S S t r i n g * d a t a F i l e P a t h = [[ N S B u n d l e m a i n B u n d l e ] p a t h F o r R e s o u r c e : @ " H t m l F i l e s / i n d e x " o f T y p e : @ " h t m l "]; 19 N S U R L * url = [ N S U R L f i l e U R L W i t h P a t h : d a t a F i l e P a t h i s D i r e c t o r y : NO ]; 20 N S U R L R e q u e s t * r e q u e s t = [ N S U R L R e q u e s t r e q u e s t W i t h U R L : url ]; 21 [ w e b W i e w l o a d R e q u e s t : r e q u e s t ]; 22 23 }

Algoritmo 6.4 Controller IambOOGap II 1 - ( v o i d ) v i e w D i d U n l o a d 2 { 3 [ s u p e r v i e w D i d U n l o a d ]; 4 // R e l e a s e any r e t a i n e d s u b v i e w s of the m a i n v i e w . 5 // e . g . s e l f . m y O u t l e t = nil ; 6 } 7 8 - ( v o i d ) v i e w W i l l A p p e a r :( B O O L ) a n i m a t e d 9 { 10 [ s u p e r v i e w W i l l A p p e a r : a n i m a t e d ]; 11 } 12 13 - ( v o i d ) v i e w D i d A p p e a r :( B O O L ) a n i m a t e d k j 14 { 15 [ s u p e r v i e w D i d A p p e a r : a n i m a t e d ]; 16 } 17 18 - ( v o i d ) v i e w W i l l D i s a p p e a r :( B O O L ) a n i m a t e d 19 { 20 [ s u p e r v i e w W i l l D i s a p p e a r : a n i m a t e d ]; 21 } 22 23 - ( v o i d ) v i e w D i d D i s a p p e a r :( B O O L ) a n i m a t e d 24 { 25 [ s u p e r v i e w D i d D i s a p p e a r : a n i m a t e d ]; 26 } 27 28 - ( B O O L ) s h o u l d A u t o r o t a t e T o I n t e r f a c e O r i e n t a t i o n :( U I I n t e r f a c e O r i e n t a t i o n ) i n t e r f a c e O r i e n t a t i o n 29 { 30 // R e t u r n YES for s u p p o r t e d o r i e n t a t i o n s 31 if ([[ U I D e v i c e c u r r e n t D e v i c e ] u s e r I n t e r f a c e I d i o m ] == U I U s e r I n t e r f a c e I d i o m P h o n e ) { 32 r e t u r n ( i n t e r f a c e O r i e n t a t i o n != U I I n t e r f a c e O r i e n t a t i o n P o r t r a i t U p s i d e D o w n ) ; 33 } e l s e { 34 r e t u r n YES ; 35 } 36 }

6.3. ARCHITETTURA 83

Algoritmo 6.5 Controller IambOOGap III

1 - ( B O O L ) w e b V i e w :( U I W e b V i e w *) w e b V i e w s h o u l d S t a r t L o a d W i t h R e q u e s t :( N S U R L R e q u e s t *) r e q u e s t n a v i g a t i o n T y p e :( U I W e b V i e w N a v i g a t i o n T y p e ) n a v i g a t i o n T y p e { 2 N S S t r i n g * r e q u e s t U r l = [[ r e q u e s t URL ] a b s o l u t e S t r i n g ]; 3 4 if ([ r e q u e s t U r l h a s P r e f i x : @ " i a m b o o g a p : " ] ) { 5 N S L o g ( @ " i a m b O O G a p r e q u e s t t y p e ") ; 6 // r i c h i e s t a del l i n g u a g g i o i m p o s t a t o sul D i s p o s i t i v o 7 if ([ r e q u e s t U r l h a s S u f f i x : @ " g e t L o c a l e "]) { 8 N S L o g ( @ " u s e r r e q u e s t e d l a n g u a g e ") ; 9 // o b t a i n d e v i c e l a n g u a g e 10 N S U s e r D e f a u l t s * d e f a u l t s = [ N S U s e r D e f a u l t s s t a n d a r d U s e r D e f a u l t s ]; 11 N S A r r a y * l a n g u a g e s = [ d e f a u l t s o b j e c t F o r K e y : @ " A p p l e L a n g u a g e s "]; 12 N S S t r i n g * c u r r e n t L a n g u a g e = [ l a n g u a g e s o b j e c t A t I n d e x : 0 ] ; 13 N S S t r i n g * j s C a l l = [ N S S t r i n g s t r i n g W i t h F o r m a t : @ " G l o b a l i z a t i o n . c a l l b a c k ( ’% @ ’) " , c u r r e n t L a n g u a g e ]; 14 [ w e b W i e w s t r i n g B y E v a l u a t i n g J a v a S c r i p t F r o m S t r i n g : j s C a l l ]; 15 r e t u r n NO ; 16 17 }

Algoritmo 6.6 Controller IambOOGap IV 1 if ([ r e q u e s t U r l h a s S u f f i x : @ " g e t N e t w o r k S t a t u s " ]) { 2 N S L o g ( @ " u s e r ␣ r e q u e s t e d ␣ n e t w o r k ␣ s t a t u s " ) ; 3 // o b t a i n n e t w o r k s t a t u s 4 N S M u t a b l e S t r i n g * n e t w o r k S t a t u s = [ N S M u t a b l e S t r i n g s t r i n g W i t h S t r i n g : @ " {\ n " ]; 5 R e a c h a b i l i t y * c o n n = [ R e a c h a b i l i t y r e a c h a b i l i t y F o r I n t e r n e t C o n n e c t i o n ]; 6 s w i t c h ([ c o n n c u r r e n t R e a c h a b i l i t y S t a t u s ]) { 7 c a s e N o t R e a c h a b l e : 8 [ n e t w o r k S t a t u s a p p e n d S t r i n g : @ " W I F I : ␣ \" not ␣ c o n n e c t e d \" ,\ n W W A N : ␣ \" not ␣ c o n n e c t e d \" ,\ n } " ]; 9 b r e a k ; 10 c a s e R e a c h a b l e V i a W i F i : 11 [ n e t w o r k S t a t u s a p p e n d S t r i n g : @ " W I F I : ␣ \" c o n n e c t e d \" ,\ n W W A N : ␣ \" not ␣ c o n n e c t e d \" ,\ n } " ]; 12 b r e a k ; 13 c a s e R e a c h a b l e V i a W W A N : 14 [ n e t w o r k S t a t u s a p p e n d S t r i n g : @ " W I F I : ␣ \" not ␣ c o n n e c t e d \" ,\ n W W A N : ␣ \" c o n n e c t e d \" ,\ n } " ]; 15 16 d e f a u l t : 17 b r e a k ; 18 } 19 N S S t r i n g * j s C a l l = [ N S S t r i n g s t r i n g W i t h F o r m a t : @ " N e t w o r k . c a l l b a c k (% @ ) " , n e t w o r k S t a t u s ]; 20 [ w e b W i e w s t r i n g B y E v a l u a t i n g J a v a S c r i p t F r o m S t r i n g : j s C a l l ]; 21 r e t u r n NO ; 22 } 23 }; 24 r e t u r n YES ; 25 } 26 27 @ e n d

6.3. ARCHITETTURA 85

(è chiaramente una prassi standard, in quanto ogni device ha un proprio Look&Feel, realizzare quindi un css personalizzato per ogni tipo di hard- ware diventa una scelta obbligata, analogamente a quanto viene fatto per le Web Application per ogni tipo di browser).

Le elaborazioni interne al controller sono eseguite asincronamente ri- spetto al codice javascript, quindi la versione IOS della libreria iambOOGap contiene il metodo Network.getNetworkStatus() asincrono, con la specifica della callback passata per argomento.

Capitolo 7

Windows Phone 7

7.1

Introduzione

Windows Phone 7 (Mango) è l’ultimo nato di casa Microsoft, un sistema operativo per dispositivi mobili che porta una piccola ventata di freschezza nell’ambiente mobile.

Questo SO è stato scelto da alcune delle più importanti aziende pro- duttrici per accompagnare i propri smartphones, tra cui Nokia, Lg. Nokia è stato, prima dell’avvento di IPhone ed Apple, il più grande produttore di telefonini e smartphone al mondo, dominando il mercato fin dagli albori delle tecnologie mobili GSM, in cui competeva con Motorola, Ericcson, per citarne alcuni tra i più famosi.

Tuttavia, negli ultimi anni la diffusione dei terminali Nokia ha visto una copiosa flessione, nonostante per numero di dispositivi resti ancora in testa alle classifiche, per quanto riguarda gli smartphones ha perso la leadership in favore della casa di Cupertino e, in minor parte, di Research In Motion padre dei Blackberry e Android con in testa Samsung (e lo zampino di Google).

Dopo vari periodi di adattamento, con modifiche sostanziali al proprio Sistema Operativo, il Symbian, Nokia decise di recidere completamente i legami e puntare, per i suoi nuovi dispositivi smartphone, sul colosso di Bill Gates.

Per quanto una scelta del genere sembri una garanzia di affidabilità no- tevole, il mercato mobile è comunque già abbastanza maturo e comprende soluzioni già ampiamente sperimentate: Windows Phone 7 deve ancora affermarsi e solo il tempo ci dirà quanto la scelta abbia pagato.

Figura 7.1.1: Architettura software di Windows Phone 7

WP7 poggia le sue basi sull’ampia scelta di ambienti di sviluppo Micro- soft e sull’IDE più conosciuto, Visual Studio, giunto alla sua decima edizio- ne ed in incubazione la undicesima: in tale ordine di cose, programmare applicazioni WP7 diventa relativamente semplice se si conoscono alcune tecnologie che Microsoft ha portato avanti nelle ultime edizioni di Visual Studio.

Gli sviluppatori Web avranno piacere nel sentire che il framework su cui si basa l’SDK WP7 è Silverlight, naturalmente con possibilità di utilizzare uno dei due linguaggi di programmazione, che sono il visual basic e il c#, scegliendo in base a quale sia il vostro background di sviluppo.

Microsoft ha quindi portato un set delle API di Silverlight su piattaforma Phone 7, rendendo più semplice l’apprendimento per chi ha familiarità con tale framework. Non finisce qui: lo sviluppo di App su WP7 comprende anche la possibilità di utilizzare il framework di sviluppo che è stato pensato per XBox, (o meglio una versione di esso) per sviluppare videogiochi e applicazioni che necessitano un uso intensivo di grafica e I/O, lo XNA.

Questi framework possono essere combinati insieme per avere il meglio di entrambi, nell’ultima versione, la 7.5 mango. Per i nosti propositi, ci occorre conoscere solo Silverlight, per cui nel proseguimento, lasceremo da parte XNA.

7.2. STRUTTURA DI UN’APPLICAZIONE WP7 89

7.2

Struttura di un’applicazione WP7

Windows Phone 7 sfrutta, come accennato, Silverlight come framework di sviluppo, nella sua versione 4. Per chi ha qualche dimestichezza con lo sviluppo di web applications attraverso visual studio, Silverlight risulterà familiare: ogni schermata che compone l’applicazione è descritta da una coppia di files, uno dedicato alla visualizzazione grafica, uno dedicato al comportamento di tale schermata.

Ogni schermata è quindi come una pagina web .asp per esempio, ed il comportamento dinamico di tale pagina è determinato da un listato di codice (una classe) C# o VB, denominato “code behind”.

Le pagine sono descritte in un linguaggio di markup la cui base è XML, denominato XAML. Tag personalizzati consentono l’inserimento di oggetti quali textbox, textarea e quant’altro, gli attributi di tali oggetti consentono di impostare le proprietà statiche quali posizionamento, dimensioni, ecc... suona familiare come l’HTML vero?

In linea con la tradizione Microsoft e Visual Studio, un buon editor gra- fico consente la costruzione grafica delle pagine, così come l’impostazione delle proprietà, diminuendo i tempi di sviluppo considerevolmente. Per la regolazione fine dei componenti comunque alla fine si è sempre costretti a modificare il codice sottostante.

Per creare un’applicazione WP7 e Silverlight occorre Visual Studio 2010 e il plugin SDK per Windows Phone. Una volta installato il software di svi- luppo, (la versione express è completamente gratuita e liberamente sca- ricabile dal sito di Microsoft) è possibile creare un nuovo progetto windo- ws phone 7: dal menù files possiamo scegliere l’autocomposizione che ci porta diretta ad uno scheletro di applicazione WP7.

I files fondamentali dell’applicazione sono contenuti nella root e nella cartella Properties, oltre che nella cartella Riferimenti. Se scegliamo un modello vuoto, troviamo una sola view e due files Xaml, app.xaml, che contiene elementi di inizializzazione dell’applicazione (il code behind con- tiene operazioni di costruzione e distruzione e cleanup dell’applicazione) e mainPage.xaml, che contiene la pagina principale che verrà visualizzata. E’ possibile aggiungere altre view esattamente come faremmo per pagine HTML.

La root contiene anche alcune immagini, queste sono parte integrante dell’applicazione in quanto costituiscono la splash screen (SplashScreenI- mage.jpg) 700x480px; l’icona dell’applicazione (ApplicationIcon.png) que- sta deve essere di dimensioni minime 62x62px, è possibile anche includer-

ne una versione più grande, 173x173px; infine un’immagine utilizzata come sfondo (Background Panorama), 1000x800px (Background.png).

La cartella Properties contiene i file di specifica delle proprietà dell’ap- plicazione, un po’ come il manifest per Android e l’info.plist per Apple; questi files sono AppManifest.xml, AssemblyInfo.cs, WMAppManifest.xml:

• AppManifest.xml contiene elementi per il deploy dell’app

• WMAppManifest è l’equivalente del file manifest di Android e per- tanto deve essere ben conosciuto anche da chi intende utilizzare il framework HTML5+Javascript&CSS

• AssemblyInfo.cs contiene informazioni sull’assembly prodotto dalla compilazione dei sorgenti

La cartella Riferimenti contiene un elenco di tutti gli assembly caricati e lin- kati al progetto, come librerie e API aggiuntive, contiene anche le dll del framework base utilizzato. Di solito, questa cartella non viene utilizzata dal programmatore Web, in quanto i suoi framework saranno inclusi all’inter- no della struttura di directory del progetto HTML, come file *.js in caso di javascript frameworks o *.css per fogli di stile ecc.

7.2.1 WMAppManifest.xml

In questa sezione, spiegheremo l’architettura del file WMAppManifest.xml, che contiene tutte le proprietà che possono essere specificate in una appli- cazione windows phone 7.

Dopo il preambolo xml, l’elemento radice è Deployment, che contiene il namespace xml e la versione della piattaforma Windows Phone. Il primo elemento contenuto è APP, che contiene informazioni sull’autore, una de- scrizione dell’applicazione, il tipo di hub e il genere a cui appartiene: sono caratteristiche importanti in quanto vengono sfruttate dal Windows Phone App Store.

Altre informazioni del tag App riguardano il runtime type, il Publisher, la versione dell’ app, se è in versione beta o meno. una volta specificato tale tag, si passa ai figli dello stesso: iconpath, capabilities, requirements, tasks, tokens, extensions.

• Iconpath: contiene il percorso per ottenere l’icona dell’applicazione: come già accennato questa si trova, di default, nella root dell’app, con il nome ApplicationIcon.png

7.2. STRUTTURA DI UN’APPLICAZIONE WP7 91

• Capabilities: questo elemento funge come le permission di blackber- ry, è un elemento di sicurezza in cui ogni feature che si vuole utilizzare nell’applicazione deve essere qui specificata:

– ID_CAP_APPOINTMENTS dà accesso ai dati sugli appuntamen-

ti

– ID_CAP_CAMERA dà accesso alla fotocamera, ma è riservato

agli operatori e produttori di HW

– ID_CAP_CONTACTS dà accesso alla rubrica contatti

– ID_CAP_GAMERSERVICES dà accesso alle API XBox LIVE – ID_CAP_IDENTITY_DEVICE dà accesso all’UUID che identifica

il dispositivo

– ID_CAP_IDENTITY_USER dà accesso all’anonimo LiveID per

identificare l’utente

– ID_CAP_ISV_CAMERA dà accesso alla fotocamera (retro o fron-

tale)

– ID_CAP_LOCATION dà accesso ai servizi di localizzazione – ID_CAP_MEDIALIB dà accesso alla libreria multimediale – ID_CAP_MICROPHONE dà accesso al microfono

– ID_CAP_NETWORKING dà accesso ai servizi internet

– ID_CAP_PHONEDIALER dà accesso alla funzione di chiamate

telefoniche

– ID_CAP_PUSH_NOTIFICATION l’applicazione può sfruttare le

notifiche push

– ID_CAP_SENSORS dà accesso ai sensori disponibili

– ID_CAP_WEBBROWSERCOMPONENT l’applicazione può uti-

lizzare il web browser component

– ID_HW_FRONTCAMERA serve per notificare l’utente nel caso

in cui non sia presente la fotocamera frontale sul dispositivo, ma l’applicazione lo richiede.

• Requirements: deve seguire immediatamente Capabilities, serve per indicare che l’applicazione per funzionare correttamente ha bisogno di un certo tipo di hw collegato o disponibile. E’ un elemento opzio- nale.

Figura 7.2.1: Tile (piastra) Standard

– Requirement: specifica il requisito, attraverso l’attributo name

• Tasks: viene utilizzato per specificare se l’applicazione usa task mul- tipli e quali sono, attraverso l’attributo name e quale pagina viane mostrata quando un task parte (attributo NavigationPage)

– figlio di Tasks è EXTENDEDTASKS, che contiene elementi BACK-

GROUNDSERVICEAGENT: questi specificano tasks che vengo- no eseguiti in background

• Tokens: ogni applicazione è formata da “piastre” (tiles) che posso- no essere aggiunte alla schermata start di WP7, l’elemento tokens consente la specifica delle piastre che compongono l’applicazione, o meglio, delle loro proprietà iniziali.

– PRIMARYTOKEN: specifica la piastra principale che compone

l’applicazione, ha due attributi: TokenID (nome della piastra) e TaskName (nome del task invocato dalla piastra)

◦ figlio di PRIMARYTOKEN è TEMPLATETYPE5, che specifi- ca un template standard che controlla i tiles dell’applicazio- ne: gli attributi sono backgroundimageuri (sfondo del tile), counter (mostra un numero da 0 a 99, e se è 0 non vie- ne visualizzato: è il badge di IPhone), title (il titolo del tile) fig.7.2.1

7.2. STRUTTURA DI UN’APPLICAZIONE WP7 93

Figura 7.2.2: Integrazione tra app e Bing

• Extensions: questo elemento consente di specificare l’integrazione tra l’applicazione ed il motore di ricerca Bing, attraverso il tasto fisi- co presente sul dispositivo; in questo modo, l’utente può effettuare una ricerca web e verrà mostrata una pagina con le applicazioni che estendono l’esperienza di ricerca: per apparire in questa pagina, oc- corre specificare un elemento relativo qui e nel file Extras.xml (fig. 7.2.2).

– EXTENSION: specifica una estensione di ricerca supportata dal-

l’applicazione attraverso gli attributi ConsumerID (restringe l’e- stensione agli utenti che rispondono ad uno specifico hardware); ExtensionName (tipo dell’estensione); ExtraFile (specifica la po- sizione del file extras.xml); TaskID (indica quale task viene in- vocato dall’attivazione dell’estensione nella pagina di risultato ricerca)

7.3

Il WebBrowser Component

Una volta che abbiamo chiara l’architettura di una applicazione per Win- dows Phone 7, possiamo procedere a costruire il framework di svilup- po in Html5. Sulla base di quanto già fatto per altre piattaforme, il nu- cleo dell’applicazione è una unica pagina, nella quale dovremmo inseri- re il componente che realizza un “browser” integrabile e gestibile in modo programmatico.

Il componente in questione per Windows Phone 7 è il Web Browser Component: quindi, all’interno dell’editor grafico di visual studio, apriamo il MainPage.xaml e ci troviamo di fronte alla prima pagina dell’applicazione, da cui togliamo i componenti superflui, come il titolo e gli altri standard inse- riti dall’autocomposizione iniziale. Dal tool Explorer (Casella degli strumen- ti) selezioniamo il componente Web Browser, lo trasciniamo sulla pagina ed ecco che ci appare graficamente il simbolo di Internet Explorer (infatti, il Web Browser Component non è altro che il motore di IE sviluppato per WP7).

Dobbiamo impostare le proprietà statiche di tale componente per ren- derlo compatibile con le specifiche del framework: deve essere a tutto schermo, orientabile a seconda della posizione del telefono, deve esse- re disabilitato lo zoom via pinch (con 2 dita) e deve auto adattarsi alle di- mensioni dello schermo. Questo è impostabile attraverso gli attributi del componente VerticalAlignment=”stretch”, HorizontalAlignment=”stretch” (il componente si adatta alle dimensioni dello schermo), poichè ogni compo- nente è contenuto in una griglia, dobbiamo renderla grande quanto tutto lo spazio disponibile (elemento ColumnDefinition con attributi width=”Auto” e “*”); inoltre occorre che la pagina supporti gli orientamenti Portrait e Landscape attraverso l’attributo SupportedOrientations dell’elemento pho- ne:PhoneApplicationPage che va impostato a PortraitOrLandscape.

Ci resta da impostare la pagina html che verrà visualizzata all’avvio dell’applicazione, che da specifiche è index.html e da abilitare gli script (di default disabilitati). Due ulteriori attributi controllano la sorgente html del componente (source) e gli script (IsScriptEnabled), source conterrà una stringa con il percorso (“HtmlFiles\index.html”) mentre IsScriptEnabled è un booleano e sarà impostato a true.

Provando ad eseguire il codice appena prodotto e mostrato nel listato 7.1, ci aspettiamo che il simulatore di WP7 ci mostri la pagina index.html, che preventivamente avremo incluso nel progetto insieme alla sua cartella madre HtmlFiles. Purtroppo non è così: occorre un ulteriore approfondi- mento, mostrato nel successivo paragrafo.

7.3. IL WEBBROWSER COMPONENT 95

Algoritmo 7.1 Pagina MainPage.xaml

1 < p h o n e : P h o n e A p p l i c a t i o n P a g e 2 x : C l a s s = " P h o n e A p p 1 . M a i n P a g e " 3 x m l n s = " h t t p : // s c h e m a s . m i c r o s o f t . com / w i n f x / 2 0 0 6 / x a m l / p r e s e n t a t i o n " 4 x m l n s : x = " h t t p : // s c h e m a s . m i c r o s o f t . com / w i n f x / 2 0 0 6 / x a m l " 5 x m l n s : p h o n e = " clr - n a m e s p a c e : M i c r o s o f t . P h o n e . C o n t r o l s ; a s s e m b l y = M i c r o s o f t . P h o n e " 6 x m l n s : s h e l l = " clr - n a m e s p a c e : M i c r o s o f t . P h o n e . S h e l l ; a s s e m b l y = M i c r o s o f t . P h o n e " 7 x m l n s : d = " h t t p : // s c h e m a s . m i c r o s o f t . com / e x p r e s s i o n / b l e n d / 2 0 0 8 " 8 x m l n s : m c = " h t t p : // s c h e m a s . o p e n x m l f o r m a t s . org / markup - c o m p a t i b i l i t y / 2 0 0 6 " 9 m c : I g n o r a b l e = " d " F o n t F a m i l y = " { S t a t i c R e s o u r c e ␣ P h o n e F o n t F a m i l y N o r m a l } " 10 F o n t S i z e = " { S t a t i c R e s o u r c e ␣ P h o n e F o n t S i z e N o r m a l } " 11 F o r e g r o u n d = " { S t a t i c R e s o u r c e ␣ P h o n e F o r e g r o u n d B r u s h } " 12 S u p p o r t e d O r i e n t a t i o n s = " P o r t r a i t O r L a n d s c a p e " O r i e n t a t i o n = " P o r t r a i t " 13 s h e l l : S y s t e m T r a y . I s V i s i b l e = " T r u e " D a t a C o n t e x t = " { B i n d i n g } " d : D e s i g n H e i g h t = " 768 " d : D e s i g n W i d t h = " 480 " > 14 15 < ! - - L a y o u t R o o t è la g r i g l i a r a d i c e in c u i v i e n e i n s e r i t o t u t t o il c o n t e n u t o d e l l a p a g i n a - - > 16 < G r i d x : N a m e = " L a y o u t R o o t " B a c k g r o u n d = " T r a n s p a r e n t " > 17 < G r i d . R o w D e f i n i t i o n s > 18 < R o w D e f i n i t i o n H e i g h t = " A u t o " / > 19 < R o w D e f i n i t i o n H e i g h t = " * " / > 20 < / G r i d . R o w D e f i n i t i o n s > 21 < ! - - C o n t e n t P a n e l - - > 22 < G r i d x : N a m e = " C o n t e n t P a n e l " G r i d . R o w S p a n = " 2 " > 23 < G r i d . C o l u m n D e f i n i t i o n s > 24 < C o l u m n D e f i n i t i o n W i d t h = " A u t o " / > 25 < C o l u m n D e f i n i t i o n W i d t h = " * " / > 26 < / G r i d . C o l u m n D e f i n i t i o n s > 27 < p h o n e : W e b B r o w s e r H o r i z o n t a l A l i g n m e n t = " S t r e t c h " N a m e = " w e b B r o w s e r 1 " 28 V e r t i c a l A l i g n m e n t = " S t r e t c h " I s S c r i p t E n a b l e d = " T r u e " G r i d . C o l u m n S p a n = " 2 " 29 S o u r c e = " / H t m l F i l e s / i n d e x . h t m l " S c r i p t N o t i f y = " n a t i v e R e q u e s t s H a n d l e r " O p a c i t y = " 1 " / > 30 < / G r i d > 31 < / G r i d > 32 33 < / p h o n e : P h o n e A p p l i c a t i o n P a g e >

7.4

Isolated Storage

Ogni applicazione Windows Phone 7 vive in un proprio spazio, denominato SandBox, per ragioni di sicurezza: è così per tutti i moderni smartphone ed è un politica comprensibile. A differenza delle altre piattaforme, per WP7 la sandbox comprende anche una parte della memoria di massa, che non può essere gestita staticamente: più chiaramente, significa che includere un file nel progetto (copiandolo o importandolo) non implica che sia disponibile allo stesso modo per l’applicazione quando è in esecuzione.

Lo spazio di memoria di massa allocabile per una applicazione WP7 è denominato Isolated Storage ed è accessibile a tempo di esecuzione da parte del programmatore; la dimensione di tale spazio non è prefissata ed in teoria è possibile anche occupare quasi tutta la memoria disponibile (ricevendo un relativo warning).

Creando, nella directory root del progetto la cartella HtmlFiles, a sua volta root del framework per poi popolarla con i files necessari all’applica- zione finale non ha alcun effetto a tempo di esecuzione sul package che verrà installato sul dispositivo. Ciò che deve essere fatto è la copia dei files dalla struttura di directory del progetto a quella nell’Isolated Storage.

Se l’intento fosse quello di realizzare una ed un’unica applicazione, sa- rebbe possibile utilizzare il tool che l’SDK mette a disposizione (ISoSto- re Explorer) che consente di vedere il contenuto dell’Isolated Storage e modificarlo come una cartella qualsiasi.

Nell’intento di realizzare invece un Framework, in cui i files che verranno a costituire l’applicazione non sono noti a priori e si deve rendere traspa- rente al programmatore finale tutta questa gestione, la soluzione via tool non è praticabile.

La soluzione sta nel creare dinamicamente, prima di compilare il sor- gente, un file di testo, o xml, o con qualsiasi altra forma leggibile da pro- gramma, dove poter salvare il contenuto della directory HtmlFiles, o meglio i percorsi dei files contenuti. In tal modo, conoscendo il nome di tale fi- le ed avendo cura nel mantenerlo inalterato, sarà possibile all’avvio del programma ricreare i files di progetto all’interno dell’Isolated Storage.

Visual Studio mette a disposizione degli eventi di pre e post compila- zione che fanno al caso nostro: è possibile eseguire comandi da linea di comando, al lancio di uno di questi eventi, inoltre sono disponibili variabi- li di scripting (macro) che possono venire utilizzate in combinazione con i comandi.

Sarebbe stato possibile utilizzare qualsiasi linguaggio di programmazio- ne per creare un programma da linea di comando che scrivesse su file, ma

7.4. ISOLATED STORAGE 97

Algoritmo 7.2 Script FileIndexer.js

in sede progettuale è stato ritenuto più semplice utilizzare uno script per la piattaforma Windows Scripting Host, il cui tool è presente in tutti i sistemi operativi a partire da Windows XP e consente l’utilizzo di Visual Basic o JScript in combinazione con qualsiasi oggetto ActiveX presente nel siste- ma: l’ideale è l’oggetto FileSystemObject che consente la manipolazione in forma nativa del file system. Lo Script è mostrato nel listato 7.2.

Per abilitare gli eventi di precompilazione occorre accedere alle proprie- tà del progetto (click con il tasto destro del mouse sul nome del progetto nel Project Explorer), quindi accedere alla categoria Eventi di compilazione: qui occorre cliccare su Modifica pre-compilazione per accedere al mini edi- tor di linea di comando, da cui è possibile selezionare le macro da utilizzare

Figura 7.4.1: Eventi di pre-compilazione

in modo del tutto grafico(fig. 7.4.1).

In questo modo, ad ogni compilazione, viene generato il file FileIn- dex.xml, che contiene tutto l’albero di directory del progetto. La seconda parte della soluzione sta a livello di inizializzazione dell’applicazione: se apriamo il code behind della MainPage, troviamo la struttura della classe MainPage che realizza la schermata principale.

È qui che dobbiamo aggiungere tutto il codice che gestisce in modo personalizzato la pagina. Il costruttore contiene le istruzioni che vengono utilizzate per inizializzare i componenti: creiamo quindi un metodo che ser- virà a copiare i files dalla memoria di massa all’isolated storage, attraverso ciò che è indicato nel file FileIndex.xml.

Il codice è mostrato nel listato 7.3, 7.4, 7.5.

A questo punto, possiamo creare un qualunque tipo di struttura proget- tuale nella directory HtmlFiles, che fungerà da root dell’applicazione: se eseguiamo il progetto, inserendo una pagina html statica qualunque nella root con nome index.html, verrà aperta come pagina principale.

7.5

Libreria Javascript

Come per IPhone, siamo adesso pronti a realizzare un’infrastruttura Java- script per poter interagire con il sottosistema formato dal dispositivo hard- ware, ma anche per poter utilizzare certe primitive Javascript che sono di-

7.5. LIBRERIA JAVASCRIPT 99

Algoritmo 7.3 MainPage.xaml.cs e metodo CreateProjectFiles I

1 p u b l i c v o i d C r e a t e P r o j e c t F i l e s ()

2 {

3 // o b t a i n the i s o l a t e d s t o r a g e for the a p p l i c a t i o n

4 u s i n g ( I s o l a t e d S t o r a g e F i l e m y S t o r e = I s o l a t e d S t o r a g e F i l e . G e t U s e r S t o r e F o r A p p l i c a t i o n () ) 5 { 6 // c r e a t e the b a s e f o l d e r in the I s o l a t e d S t o r a g e : 7 m y S t o r e . C r e a t e D i r e c t o r y ( " H t m l F i l e s " ) ; 8 // o b t a i n a c c e s s to the f i l e xml F i l e I n d e x 9 S t r e a m R e s o u r c e I n f o f i l e = A p p l i c a t i o n . G e t R e s o u r c e S t r e a m ( new Uri ( " f i l e I n d e x . xml " , U r i K i n d . R e l a t i v e ) ) ; 10 if ( f i l e != n u l l ) 11 { 12 X m l R e a d e r r e a d e r = X m l R e a d e r . C r e a t e ( f i l e . S t r e a m ) ; 13 // c r e a t e f i l e s t r e e - - - - - 14 w h i l e ( r e a d e r . R e a d () ) 15 { 16 if ( r e a d e r . N a m e == " f i l e " ) 17 { 18 s t r i n g n a m e = r e a d e r . G e t A t t r i b u t e ( " n a m e " ) ; 19 int t r i m = n a m e . I n d e x O f ( " H t m l F i l e s " ) ; 20 s t r i n g r e l a t i v e P a t h = n a m e . S u b s t r i n g ( t r i m ) ; 21 S t r e a m R e s o u r c e I n f o f i l e T o C o p y = A p p l i c a t i o n . G e t R e s o u r c e S t r e a m ( new Uri ( r e l a t i v e P a t h , U r i K i n d . R e l a t i v e ) ) ; 22 if ( f i l e T o C o p y != n u l l ) 23 { 24 u s i n g ( B i n a r y R e a d e r br = new B i n a r y R e a d e r ( f i l e T o C o p y . S t r e a m ) ) 25 { 26 b y t e [] d a t a = br . R e a d B y t e s (( int ) f i l e T o C o p y . S t r e a m . L e n g t h ) ; 27 u s i n g ( I s o l a t e d S t o r a g e F i l e S t r e a m o u t F i l e = m y S t o r e . O p e n F i l e ( r e l a t i v e P a t h , F i l e M o d e . C r e a t e ) ) 28 { 29 u s i n g ( var w r i t e r = new B i n a r y W r i t e r ( o u t F i l e ) ) 30 { 31 w r i t e r . W r i t e ( d a t a ) ; 32 } 33 } 34 }

Algoritmo 7.4 MainPage.xaml.cs e metodo CreateProjectFiles II 1 } 2 } 3 if ( r e a d e r . N a m e == " f o l d e r " ) 4 { 5 s t r i n g n a m e = r e a d e r . G e t A t t r i b u t e ( " n a m e " ) ; 6 int t r i m = n a m e . I n d e x O f ( " H t m l F i l e s " ) ; 7 s t r i n g r e l a t i v e P a t h = n a m e . S u b s t r i n g ( t r i m ) ; 8 m y S t o r e . C r e a t e D i r e c t o r y ( r e l a t i v e P a t h ) ; 9 } 10 } 11 } 12 } 13 }

sabilitate all’interno del componente WebBrowser, per citarne una, il clas- sico metodo alert() che ci consente di mostrare una finestra di dialogo modale con un messaggio.

Il Componente WebBrowser mette a disposizione un completo set di API lato C# (o VB) per poter interagire con ciò che è mostrato all’inter- no: il Layer javascript invece ha una sola possibilità per comunicare con l’esterno: l’oggetto window.external.

Window.external contiene un metodo per notificare all’esterno un even- to, attraverso la stringa che viene passata come argomento. Sulla base di questa funzione possiamo costruire un meccanismo di callback asincrone

Documenti correlati