我在iOS应用中使用QuickLook Framework来预览各种文件。我最近注意到QuickLook在我的应用程序的tmp
目录中保留了所有预览文件的缓存。 QuickLook缓存文件有两个问题:
这些缓存文件已存储在Documents目录中。因此,理论上,如果用户想要预览他们所有的文件(他们可能会这样),应用程序的大小可能会翻倍。没关系,我可以使用以下代码定期清理缓存:
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSArray *fileArray = [fileMgr contentsOfDirectoryAtPath:NSTemporaryDirectory() error:nil];
for (NSString *filename in fileArray) {
[fileMgr removeItemAtPath:[NSTemporaryDirectory() stringByAppendingPathComponent:filename] error:NULL];
}
第二个,最重要的问题是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缓存文件,或者如何重置缓存?如果这些都不可能,那么有一个iOS 6替代QuickLook(我听说过QuickLook已被更改) iOS 6所以没有任何变通办法,替代方案等)?
赞赏任何解决方案或想法!
答案 0 :(得分:1)
如果没有办法阻止QLPreviewController进行自己的缓存,您可能需要考虑使用UIWebView创建自己的版本QLPreviewController(因为它能够查看许多文件类型,如PDF, docs,xls等)。
它绝不是一个理想的解决方案,你不会像QLPreviewController那样提供接近性能/ UI质量水平的任何地方。是的......它是一个被黑客入侵的解决方案,但是没有用于清除二级缓存的公共API ......这是我唯一能想到的。
我想这是用户友好性+安全性之间的折腾。
祝你好运!答案 1 :(得分:1)
我相信您可以使用以下命令从命令提示符重置整个缓存:
qlmanage -r cache
使用以下方法生成特定文档的预览:
qlmanage -p document.ext
但是因为这是一个命令行解决方案,这可能不是你需要的。祝你好运。
答案 2 :(得分: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];
这是否适用于快速查看我不知道,但值得一试。