首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止iOS QuickLook生成缓存

防止iOS QuickLook生成缓存
EN

Stack Overflow用户
提问于 2013-04-20 15:34:31
回答 3查看 1.6K关注 0票数 9

我正在使用QuickLook框架在我的iOS应用程序预览各种文件。我最近注意到,QuickLook在我的应用程序的tmp目录中保存了所有预览文件的缓存。但是,QuickLook缓存文件有两个问题:

  1. 这些缓存的文件已经存储在Documents目录中。所以从理论上讲,如果用户想要预览他们所有的文件(他们可能会这样做),这个应用程序的大小可以加倍。好吧,没什么大不了的,我可以定期使用以下代码清除缓存: NSFileManager *fileMgr = NSFileManager defaultManager;NSArray *fileArray = fileMgr fileMgr错误:nil;for (NSString *filename in fileArray) { [fileMgr removeItemAtPath:NSTemporaryDirectory() stringByAppendingPathComponent:文件名错误:NULL];}
  2. 第二个,也是最重要的问题是,似乎是在系统文件夹(而不是我的应用程序)中创建二级缓存。这是一个问题,因为用户可以选择加密我的应用程序中的单个文件。如果他们在加密前预览一个文件,它看起来是正常的。如果它们加密后预览,则文件仍然显示为未加密。我知道加密没有问题,因为我的应用程序的Documents目录中存储的加密文件是加密的,任何程序都无法正确读取。这是一个主要问题,因为它可能导致用户相信文件没有加密。这也是一个安全问题,因为这意味着QuickLook正在其他地方缓存文件。

以下是我的QuickLook代码:

代码语言:javascript
复制
- (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缓存在哪里,或者是否存在(可能是某种bug)?

如何防止QuickLook缓存文件,或者如何重新设置缓存?如果这两种方法都不可能,那么iOS 6是否可以替代QuickLook (我听说iOS 6中的QuickLook已被更改,因此没有任何解决办法、替代方案等)?

任何解决方案或想法都很感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-30 12:25:02

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

这绝不是一个理想的解决方案,而且您不会像QLPreviewController所提供的那样,拥有接近性能/UI质量的任何级别。嗯..。这是一个被黑客攻击的解决方案,但缺少一个公共API来清除二级缓存.这是我唯一能想到的。

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

祝好运!

票数 1
EN

Stack Overflow用户

发布于 2013-04-30 12:26:26

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

代码语言:javascript
复制
qlmanage -r cache

或使用以下方法为特定文档生成预览:

代码语言:javascript
复制
qlmanage -p document.ext

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-30 14:24:51

也许尝试一个NSURLCache,看看这是否有帮助。

在应用程序中设置它,使用选项完成启动:

代码语言:javascript
复制
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];

然后,当您想要清空缓存时,可以执行以下操作

代码语言:javascript
复制
[[NSURLCache sharedURLCache] removeAllCachedResponses];

我不知道这是否行得通,但值得一试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16122095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档