Pagine

2012-12-14

Sandbox per vecchie app

Ogni sviluppatore sa che il MacAppStore di Apple ha inaugurato da un po' di mesi una replica delle forche caudine: la Sandbox!
Lo scopo è buono: far sì che, nell'improbabile caso in cui un codice malintenzionato riesca a prendere il controllo di un'applicazione, i danni si riducano al minimo indispensabile (che, detto in parole povere, significa: al massimo perdiamo i dati interni della stessa applicazione, senza andare a toccare punti importanti del sistema).
Come stato raggiunto questo risultato? Mantenendo nascosti tutti i dati dell'applicazione! E l'unico punto nascosto è risultato essere la cartella Library, che, a meno di sapere come fare, non è più visibile.
Dentro la Library utente sono nascosti i dati delle applicazioni che onorano la sandbox (chiamate, in modo orribile, sandboxate).
Però c'è un problema: quando si aggiorna alla nuova versione, la nostra app cercherà i dati all'interno del suo orticello (appunto, la sandobox) e non troverà i dati della versione precedente, che verranno a trovarsi in un punto per lei inaccessibile. Questo significa che, una volta lanciata, tutti i dati originali sembreranno scomparsi. Ciò non sarebbe bello!
In effetti, anche Apple ha visto il problema e ha inserito una soluzione nel meccanismo della sandbox: basta inserire nella versione sandboxata un file XML, dal nome obbligatorio di container-migration.plist. In questo file andremo a dire alla nuova versione quali file e cartelle trasferire nel proprio orto; così, al primo lancio, l'applicazione sposterà i dati nella propria sandbox, proprio dove si aspetta di trovarli, li leggerà e l'utente sarà contento di non aver perso tutto.
Il meccanismo è molto semplice e nella documentazione ufficiale viene anche riportato un esempio, comprensibilissimo.
Quello che invece non viene detto (e che mi ha fatto perdere mezza giornata di prove) è che tale meccanismo non funziona semplicemente lanciando l'applicazione dall'interno di Xcode, nella configurazione di debug! Dopo una ventina di prove diverse e di insulti molto particolareggiati all'indirizzo della signora Sandbox, in un ultimo sprazzo di lucidità, ho fatto un archivio seguito da una esportazione in locale, lanciato un'applicazione dal desktop e... voilà! I dati sono stati trasferiti nella nuova posizione! Eureka!
C'è solo da ricordare che questo avviene solamente al primo lancio; se in seguito dovessimo ripetere l'esperimento, dobbiamo ricordarci di cancellare il container della nostra applicazione, altrimenti questa saprà di essere già stata lanciata almeno una volta e quindi non effettuerà lo spostamento.

Avvertimento: ricordiamoci di fare una copia dei dati originali, poiché questi non verranno copiati, bensì spostati. Quindi, se dovessimo ripetere l'esperimento, dovremo averne una copia.

Nessun commento:

Posta un commento