阻止iOS QuickLook生成缓存

时间:2013-04-20 15:34:32

标签: ios objective-c caching quicklook

我在iOS应用中使用QuickLook Framework来预览各种文件。我最近注意到QuickLook在我的应用程序的tmp目录中保留了所有预览文件的缓存。 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正在将文件缓存到其他地方。

  3. 这是我的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所以没有任何变通办法,替代方案等)?

    赞赏任何解决方案或想法!

3 个答案:

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

这是否适用于快速查看我不知道,但值得一试。