2013-04-20 20 views
9

Sto utilizzando il QuickLook Framework nel mio app iOS per visualizzare in anteprima i vari file. Recentemente ho notato che QuickLook mantiene una cache di tutti i file in anteprima nella directory tmp della mia app. Esistono tuttavia due problemi con i file di cache QuickLook:Impedire iOS QuickLook di generare una cache

  1. Questi file memorizzati nella cache sono già memorizzati nella directory Documenti. Quindi, in teoria, l'app potrebbe raddoppiare le dimensioni se l'utente desidera visualizzare in anteprima tutti i propri file (che probabilmente lo faranno). Va bene, non un grosso problema, posso periodicamente pulire la cache utilizzando questo codice:

    NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    NSArray *fileArray = [fileMgr contentsOfDirectoryAtPath:NSTemporaryDirectory() error:nil]; 
    for (NSString *filename in fileArray) { 
        [fileMgr removeItemAtPath:[NSTemporaryDirectory() stringByAppendingPathComponent:filename] error:NULL]; 
    } 
    
  2. Il secondo, e questione più importante è che QuickLook sembra essere la creazione di una cache secondaria in una cartella di sistema (non la mia app). Questo è un problema perché gli utenti hanno la possibilità di crittografare i singoli file nella mia app. Se visualizzano l'anteprima di un file prima della crittografia, sembra normale. Se criptano e poi visualizzano in anteprima, il file appare ancora come se non fosse crittografato. So che non c'è un problema con la crittografia perché il file crittografato memorizzato nella directory della mia app è crittografato e non può essere letto (correttamente) da alcun programma. Questo è un grosso problema, poiché potrebbe far credere all'utente che il file non sia stato crittografato. È anche un problema di sicurezza perché significa che QuickLook sta memorizzando il file altrove.

Ecco il mio codice QuickLook:

- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller { 
    return 1; 
} 

- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    //Get the stored user data and file name 
    NSString *FileName = [defaults objectForKey:@"FileName"]; //Name of file stored in NSUserDefaults 
    NSString *finalFilePath = [documentsDirectory stringByAppendingPathComponent:FileName]; 

    return [NSURL fileURLWithPath:finalFilePath]; 
} 

- (IBAction)previewFile:(id)sender { 
    //Setup QuickLook 
    QLPreviewController *previewController = [[QLPreviewController alloc] init]; 
    previewController.delegate=self; 
    previewController.dataSource=self; 
    previewController.currentPreviewItemIndex = 0; 
    [previewController reloadData]; 
    [self presentModalViewController:previewController animated:YES]; 
    [previewController.navigationItem setRightBarButtonItem:nil]; 
} 

Qualcuno sa dove la cache QuickLook è, o se ce n'è uno (forse è una specie di bug)?

Come posso impedire che QuickLook dalla cache dei file, o come posso ripristinare la cache? Se nessuna di queste sono possibili c'è un iOS 6 un'alternativa a QuickLook (ho sentito QuickLook è stato cambiato in iOS 6, in modo che non ci sono soluzioni alternative, alternative, ecc)?

Eventuali soluzioni o idee apprezzate!

+1

Non ho una risposta per te diversa da "Non ho visto neanche una strada e ho usato un' UIWebView' "(nonostante le funzionalità peggiori). Hai provato a inviare una richiesta di funzione ad Apple e vedere cosa hanno detto? – DBD

risposta

1

Se non esiste un modo per impedire a QLPreviewController di eseguire la propria memorizzazione nella cache, è consigliabile prendere in considerazione la creazione della propria versione di QLPreviewController con una UIWebView (poiché è in grado di visualizzare molti tipi di file come PDF, documenti, xls, eccetera.).

E 'in alcun modo una soluzione ideale e non avrà nessuna parte vicino il livello di qualità delle prestazioni/UI come il QLPreviewController fornirà. Sì ... è un po 'una soluzione compromessa, ma a parte un'API pubblica per cancellare la cache secondaria ... è l'unica cosa che riesco a pensare.

Credo che sia un lancio tra facilità d'uso + sicurezza.

Buona fortuna!

1

io credo che si possa ripristinare l'intera cache dal prompt dei comandi utilizzando:

qlmanage -r cache 

o generare l'anteprima di documenti specifici utilizzando:

qlmanage -p document.ext 

Ma poiché questa è una soluzione a riga di comando, questo probabilmente non è quello che ti serve. Buona fortuna, però.

+1

Suppongo che funzionerebbe su OSX, ma probabilmente non su iOS - poiché non c'è alcun accesso alla riga di comando :-( –

+2

Un punto molto buono. Mi chiedo perché ho pensato che l'OP usasse OSX. rispondere nel caso in cui altri abbiano problemi con QuickLook in OSX. – Jonathan

1

Forse provare un NSURLCache e vedere se questo aiuta.

rimetterla in didFinishLaunchingWithOptions di applicazione:

int cacheSizeMemory = 8*1024*1024; // 8MB 
int cacheSizeDisk = 16*1024*1024; // 16MB 
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; 
[NSURLCache setSharedURLCache:sharedCache]; 

Quindi è possibile effettuare le seguenti operazioni quando si vuole svuotare la cache

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

Se questo funziona con rapido sguardo non lo faccio lo so, ma vale la pena provare

Problemi correlati