9

我在我的 iOS 应用程序中使用QuickLook 框架来预览各种文件。我最近注意到 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 正在将文件缓存在其他地方。

这是我的快速查看代码:

- (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 中已更改,因此没有任何解决方法、替代方案等)?

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

4

3 回答 3

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

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

于 2013-04-30T14:24:51.037 回答
1

我相信您可以使用以下命令从命令提示符重置整个缓存:

qlmanage -r cache

或使用以下命令生成特定文档的预览:

qlmanage -p document.ext

但是因为这是一个命令行解决方案,所以这可能不是您所需要的。不过,祝你好运。

于 2013-04-30T12:26:26.317 回答
1

如果没有办法阻止 QLPreviewController 进行自己的缓存,您可能需要考虑使用 UIWebView 制作自己的版本 QLPreviewController(因为它能够查看许多文件类型,例如 PDF、文档、xls 等)。

这绝不是一个理想的解决方案,你不会有任何接近 QLPreviewController 将提供的性能/UI 质量水平。是的......这是一个有点被黑的解决方案,但缺少一个公共 API 来清除二级缓存......这是我唯一能想到的。

我想这是用户友好性+安全性之间的折腾。

祝你好运!

于 2013-04-30T12:25:02.033 回答