2013-04-20 12 views
9

iOSアプリケーションでQuickLook Frameworkを使用しています。さまざまなファイルをプレビューしています。私は最近、QuickLookは、私のアプリのtmpディレクトリにすべてのプレビューファイルのキャッシュを保持していることに気づいた。iOS QuickLookがキャッシュを生成しないようにする

  1. これらのキャッシュされたファイルがすでにDocumentsディレクトリに格納されています。クイックルックはしかし、ファイルをキャッシュするには2つの問題があります。だから理論的には、ユーザーがファイルのすべてをプレビューしたい場合(おそらくこれがそうだろう)、アプリケーションのサイズは倍増する可能性があります。 (ない

    NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    NSArray *fileArray = [fileMgr contentsOfDirectoryAtPath:NSTemporaryDirectory() error:nil]; 
    for (NSString *filename in fileArray) { 
        [fileMgr removeItemAtPath:[NSTemporaryDirectory() stringByAppendingPathComponent:filename] error:NULL]; 
    } 
    
  2. 秒、および最も重要な問題は、クイックルックは、システムフォルダ内の二次キャッシュを作成しているように見えるということです:さて、大したことでは、私は定期的にこのコードを使用してキャッシュを一掃することはできません私のアプリ)。これは、ユーザーがアプリ内の個々のファイルを暗号化するオプションを持っているため、問題です。暗号化する前にファイルをプレビューすると正常に見えます。後で暗号化してプレビューすると、ファイルは暗号化されていないかのように表示されます。私のアプリケーションの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のキャッシュがどこにあるか誰もが知っている、または1つは、(多分それはバグの一部のようなものだ)がある場合にしていますか?

QuickLookがファイルをキャッシュしないようにするにはどうすればよいですか、またはキャッシュをリセットするにはどうすればよいですか?これらのいずれも可能でない場合は、QuickLookのiOS 6の代替品があります(iOS 6ではQuickLookが変更されたため、回避策や代替品などはありません)。

いずれかのソリューションやアイデアが評価されました!

+1

「私には道が見えず、UIWebViewを使っていませんでした」(悪い機能にもかかわらず)答えがありません。あなたはAppleに機能要求を提出し、彼らが何を言ったかを見てきましたか? – DBD

答えて

1

QLPreviewControllerが独自のキャッシュを行わないようにする方法がない場合は、UIWebViewを使用して独自のバージョンQLPreviewControllerを作成することを検討してください(PDF、docs、xls、等。)。

これは決して理想的なソリューションではなく、QLPreviewControllerが提供するパフォーマンス/ UI品質の水準には近くないでしょう。ええと...これはハッキングされた解決策ですが、二次キャッシュをクリアするための公開APIが不足しています...私が考えることができるのはこれだけです。

私はそれがユーザーフレンドリーとセキュリティの間にあると思う。

幸運を祈る!

qlmanage -r cache 

するか、使用して、特定のドキュメントのプレビューを生成します:

1

は、私はあなたが使用して、コマンドプロンプトからキャッシュ全体をリセットすることができると信じて

qlmanage -p document.ext 

をしかし、これはコマンドラインのソリューションであるため、これはおそらくあなたが必要としているものではありません。しかし、幸運。

+1

OSXで動作するとは思うけど、おそらくiOSではなく - コマンドラインへのアクセスがないから---( –

+2

非常に良い点。なぜOPがOSXを使っているのだろうと思ったのだろうか。 OSXのQuickLookで他の人が問題を抱えている場合の答え。 – Jonathan

1

おそらくNSURLCacheを試してみてください。

アプリケーションdidfinishlaunchingwithoptionsで設定し、それをアップ:あなたがキャッシュに

これは私にはないざっと見で動作するかどうかは
[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

を空にしたいとき

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

その後、次の操作を行うことができます知っているが、それは試してみる価値がある。

関連する問題