2013-04-20 119 views
9

我在iOS應用中使用QuickLook Framework來預覽各種文件。我最近注意到QuickLook在我的應用的tmp目錄中保留了所有預覽文件的緩存。儘管有QuickLook緩存文件有兩個問題:防止iOS QuickLook生成緩存

  1. 這些緩存的文件已存儲在Documents目錄中。因此,理論上,如果用戶想要預覽所有文件(他們可能會這樣做),應用程序的大小可能會增加一倍。好了,沒什麼大不了的,我可以定期使用此代碼清除緩存:

    NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    NSArray *fileArray = [fileMgr contentsOfDirectoryAtPath:NSTemporaryDirectory() error:nil]; 
    for (NSString *filename in fileArray) { 
        [fileMgr removeItemAtPath:[NSTemporaryDirectory() stringByAppendingPathComponent:filename] error:NULL]; 
    } 
    
  2. 第二,和最重要的問題是QuickLook的似乎在系統文件夾中已創造了一個二級高速緩存(未我的應用程序)。這是一個問題,因爲用戶可以選擇在我的應用程序中加密單個文件。如果他們在加密之前預覽文件,它看起來很正常。如果他們加密並在之後進行預覽,則該文件仍會顯示爲未加密。我知道加密沒有問題,因爲存儲在我的應用程序的Documents目錄中的加密文件是加密的,不能被任何程序讀取(正確)。這是一個主要問題,因爲它可能會導致用戶認爲該文件未加密。這也是一個安全問題,因爲它意味着QuickLook在其他地方緩存文件。

這裏是我的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]; 
} 

有誰知道在哪裏的QuickLook的緩存,或者如果有一個(也許是某種錯誤的)?

如何防止QuickLook緩存文件,或者如何重置緩存?如果這兩者都不可能有QuickLook的iOS 6替代品(我聽說iOS 6中QuickLook已更改,因此沒有任何解決方法,替代方法等)?

任何解決方案或想法讚賞!

+1

除了「我沒有看到任何方式並使用'UIWebView'」(儘管功能更差),我沒有任何答案。您是否曾嘗試向Apple提交功能請求並查看他們的說法? – DBD 2013-04-30 13:47:38

回答

1

如果沒有辦法阻止QLPreviewController執行自己的緩存,那麼您可能需要考慮使用UIWebView製作您自己的QLPreviewController版本(因爲那樣可以查看許多文件類型,例如PDF,docs,xls,等等。)。

這絕不是一個理想的解決方案,你不會在QLPreviewController提供的性能/ UI質量水平附近。是的...這是一個黑客攻擊的解決方案,但缺少一個公共API來清除二級緩存......這是我能想到的唯一的事情。

我想這是用戶友好性+安全性之間的折騰。

祝你好運!

1

我相信你可以在命令提示符下使用整個緩存復位:

qlmanage -r cache 

或者使用產生特定文檔的預覽:

qlmanage -p document.ext 

但因爲這是一個命令行的解決方案,這可能不是你需要的。祝你好運,但。

+1

我猜這可以在OSX上工作,但可能不會在iOS上 - 因爲沒有任何訪問命令行:-( – 2013-04-30 12:28:06

+2

很好的一點,我想知道爲什麼我認爲OP使用的是OSX。在其他情況下在OSX中使用QuickLook時遇到問題。 – Jonathan 2013-04-30 14:43:33

1

也許嘗試一個NSURLCache,看看是否有幫助。

設置它在應用didfinishlaunchingwithoptions:

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]; 

然後,你可以做以下的時候要清空緩存

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

這是否可與快看我不知道但值得一試。