Guida all’uso delle Web View su iOS Tesina per il corso di Programmazione di Sistemi Mobile Lorenzo Pellegrini Matricola: 0000653299 Cosa sono le Web View? Le web view sono componenti grafiche, integrabili dentro una applicazione, che permettono la visualizzazione e l’iterazione da parte dell’utente con pagine web. La visualizzazione avviene tramite il motore messo a disposizione dal sistema operativo e l’applicazione ospitante può interagire con la view con i metodi messi a disposizione dalla particolare implementazione fornita, che cambia per ogni sistema operativo. Perché usare una Web View? Una web view è un metodo per visualizzare contenuto indubbiamente meno performante rispetto a un’interfaccia nativa. Tuttavia vi sono situazioni in cui è necessario visualizzare pagine che per loro natura non è possibile integrare dentro l’app (perché la pagina web da visualizzare non è gestita dalle stesse persone che creano l’app e non è possibile estrarre dati dalla sua struttura, oppure perché la sua struttura può cambiare spesso nel tempo). Integrare una UIWebView in un’app iOS Ogni sistema operativo mette a disposizione metodi differenti per integrare una Web View. Li accomuna il fatto che tale view è facilmente inseribile tramite gli editor di interfaccia grafica messi a disposizione. Si crei (o apra) un progetto usando Xcode e si navighi fino alla view in cui inserire la UIWebView. Dalla visualizzazione dei controlli inseribili si trascini l’oggetto “Web View” dentro la view. Sarà necessario aggiustare il layout in base a come si desidera venga visualizzata la pagina web. Molte app utilizzano le Web View per visualizzare contenuto (per un periodi di tempo prefissato o in attesa di un input) su tutta la vista mentre altre la rilegano a una parte più limitata (ad esmpio per mostrare un banner o un avviso/notizia caricato/a da un sito web). 1 Tra le proprietà disponibili per la UIWebView vi è la possibilità di abilitare la detection di numeri di telefono, indirizzi, la riproduzione di alcuni tipi di contenuto multimediale, ecc.. Questa personalizzazione è resa disponibile dal momento che spesso non è interessante permettere all’utente di interagire con la pagina web come se si trattasse di una schermata del browser completa: nella grande maggioranza dei casi il contenuto della pagina web è (a grandi linee) conosciuto per cui, per questioni di performance o per prevenire una esperienza d’uso non in linea con quanto previsto, può essere necessario disabilitare certe funzionalità. Interagire con la UIWebView Allo stato attuale la Web View è inserita ma è ovviamente necessario interagirvi. Usando l’editor grafico è possibile trascinare la Web View (dalla lista dei controlli disponibili) nel codice sorgente del controller. Come visto nelle lezioni questa azione crea un riferimento, inizializzato in automatico, alla view dentro il codice. La prima scontata e più utilizzata azione è quella di impostare la pagina web da aprire. Per fare ciò è necessario trasformare la stringa che definisce l’indirizzo web in un URL: let url = NSURL (string: “http://www.sitoweb.it”); 2 Dopodichè è necessario effettuare la vera e propria richiesta di caricamento della pagina web: let request = NSURLRequest(URL: url!); riferimentoWebView.loadRequest(request); E SEMPIO PRATICO DI SETUP DELLA WEB UI IL RISULTATO OTTENUTO Queste operazioni devono ovviamente essere compiute a schermata correttamente inizializzata, cioè all’interno del metodo viewDidLoad o in un momento successivo. Questo è sufficiente a eseguire l’operazione più usata quando si parla di Wev View: visualizzare una pagina web. Caricamento di una pagina in memoria In alcuni casi si rende necessario caricare il contenuto dalla memoria (una stringa html). Quando viene effettuata questa operazione, a prescindere dal sistema operativo utilizzato, bisogna essere sicuri che le risorse utilizzate (immagini, script, fogli di stile) siano recuperabili: è possibile che il device, nel momento del caricamento, sia offline. Caricare un contenuto HTML è estremamente semplice: riferimentoWebView.loadHTMLString(strngaHTML, baseURL: nil); 3 Tramite questa operazione viene caricato il contenuto della stringa passata come primo parametro. È possibile specificare un URL che verrà utilizzato come base per caricare i contenuti/referenziare le anchor. CARICAMENTO HTML DA STRINGA : CODICE DI ESEMPIO E RISULTATO OTTENUTO Caricamento di una pagina memorizzata su file Caricare una pagina da un file memorizzato sulla memoria è semplice come caricare una pagina dalla rete. Rispetto al caricamento dalla memoria questo metodo offre il vantaggio di poter caricare le risorse (immagini, ecc.) dalla stessa directory in cui si trova la pagina senza configurazioni aggiuntive e con la sicurezza di disporre di tutte le risorse anche offline. L’unico cambiamento da apportare rispetto al caricamento da rete è il metodo con cui viene ricavato l’URL: let urlFileLocale = NSBundle.mainBundle().URLForResource("nome", withExtension: "html"); Questo crea un URL a partire da una risorsa di cui il nome è contenuto nel primo parametro. I successivi step sono identici a quelli per il caricamento da rete. 4 CARICAMENTO DI UN PDF: CODICE DI ESEMPIO E RISULTATO Operazioni comuni Per le operazioni comuni (back, reload, forward) vengono messi a disposizione i seguenti metodi: riferimentoWebView.goBack(); riferimentoWebView.reload(); 5 riferimentoWebView.goForward(); Oltre a questi è messo a disposizione un metodo per fermare il caricamento di una pagina: riferimentoWebView.stopLoading(); Per verificare lo stato della pagina è possibile usare alcune proprietà che cambiano durante la vita della View: loading: proprietà usata per verificare se la Web View sta eseguendo il caricamento della pagina canGoForward: proprietà usata per verificare se è possibile andare avanti di pagina canGoBack: proprietà usata per verificare se è possibile andare indietro di pagina Caricamento di elementi non HTML UIWebView permette di visualizzare anche contenuti non HTML. In particolare è possibile caricare documenti di testo, pdf e qualisasi contenuto supportato dal browser. Oltre al metodo descritto in precedenza viene messo a disposizione un altro metodo che permette di caricare contenuti esterni al bundle della app. Per caricare questi contenuti è necessario conoscerne il tipo MIME e la codifica, oltre alla sua posizione in memoria. Ottenuto in qualche modo il percorso, è necessario caricare in memoria il contenuto. Da notare la differenza nei metodi utilizzati: nel metodo esposto in precedenza veniva ottenuto un URL che veniva utilizzato per localizzare il contenuto; con questo metodo il dato è caricato dal file in memoria e dalla memoria nella WebUi. let loadedData = NSFileManager.defaultManager().contentsAtPath(“path”) Una volta che il contenuto è stato caricato in memoria è sufficiente richiamare il metodo loadData: riferimentoWebView.loadData(loadedData!, MIMEType: “tipo MIME”, textEncodingName: “UTF-8”, baseURL: nil); Il MIME type deve essere impostato a seconda del tipo di contenuto. Se il contenuto è testuale è necessario che il parametro textEncodingName sia correttamente impostato. 6