Titanium Mobile: download di aggiornamenti in background

Creato il 03 aprile 2012 da Andreafortuna @AndyF

Un rapido snipped di codice che permette di gestire l’aggiornamento over-the-air di file presenti all’interno della nostra app:

function getFile(filename) {
	Ti.API.info("Carico file" + filename + ".txt");
	var f = Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, filename + '.txt');
	var contents = f.read();
	contents = contents.text;
	if(Titanium.Network.networkType != Titanium.Network.NETWORK_NONE) {
		//Scarico cache
		Ti.API.info("scarico cache");
		var xhr = Titanium.Network.createHTTPClient();
		xhr.open("GET", "http://[SERVER DI PROVISIONING]/" + filename + ".txt");
		xhr.onload = function() {
			statusCode = xhr.status;
			if(statusCode == 200) {
				var doc = this.responseText;
				Ti.API.info(doc);
				var f = Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, filename + '.txt');
				Ti.API.info("ELIMINO VECCHIO FILE:" + f.deleteFile());
				f.write(doc);
			}
		};
		xhr.send();
	}
	return contents;
}

I file devono essere già presenti nella location Ti.Filesystem.applicationDataDirectory: la cosa migliore da fare è copiarli nella cartella Resources del progetto (io utilizzo una directory archivi nella quale metto tutti gli archivi ‘di default’) e copiarli in applicationDataDirectory con questa semplice funzione:

function copyFile(filename) {
	var fromFile = Titanium.Filesystem.getFile(Ti.Filesystem.resourcesDirectory, 'archivi/' + filename + '.txt');
	var contenuto = fromFile.read()
	var toFile = Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, filename + '.txt');
	if(toFile.exists() === false)
		toFile.write(contenuto);
}

La funzione getFile non fa altro che prelevare il file dal path passato come parametro e restituirlo, contestualmente verifica se è presente una connessione di rete disponibile e inizia a scaricare in background una nuova versione del file (dall’indirizzo specificato con [SERVER DI PROVISIONING]).A download terminato lo sostituisce a quello attualmente in uso.

Al successivo avvio dell’applicazione, i dati saranno aggiornati.