2013-04-20 117 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]; 

这是否可与快看我不知道但值得一试。