6

暗号化されたword/excel / pdfファイルがローカルに保存されており、iPadアプリでプレビューする必要があります。QLPreviewControllerまたはUiDocumentInteractionControllerを使用してこれらのファイルをプレビューできることを理解しています。私はこれを非常にうまく使うことができます

- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger) index {

    return [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[documents objectAtIndex:index] ofType:nil]];
}

しかし、ファイルは暗号化されており、復号化するとNSDataオブジェクトを取得します。これらのいずれかにNSDataをロードするにはどうすればよいですか。

また、NSDataをローカルファイルとして保存し、プレビューにロードできることも理解しています。ただし、暗号化されていないファイルをローカルに保存しないという制約があります。

誰かがすでにこれを達成していて、ここで私を助けることができるならば、それは大いに感謝されるでしょう。

ありがとうAJ

4

4 に答える 4

11

を使用しているためQuick Look、オプションが制限されています。を指定する必要があります。これは、ファイルシステム(またはインターネット)上にある必要があることを意味しますQuick LookNSURL幸いなことに、これはそれほど問題にはならないはずです。iOSデバイスは、ハードウェアレベルの暗号化を使用します。ファイルが暗号化されている場合、アプリだけがファイルを復号化するためのキーを持っています。そのため、ファイルは引き続き暗号化されますが、アプリとアプリのみが読み取ることもできます。

これがあなたがすることです:

  1. ファイルをNSDataオブジェクトに復号化します。これはすでに実行済みです。

  2. iCloudにアップロードされたり、iTunesによってバックアップされたりしない場所にファイルを書き込みます。tmpディレクトリはおそらく最良の選択です。コードは次のようになります。

    NSData * data = // Your decrypted file data.
    NSString * fileName = // Whatever you want to name your file.
    NSString * path = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
    NSURL * url = [NSURL URLWithString:path];
    NSError * error = nil;
    
    BOOL success = [data writeToURL:url
                            options:NSDataWritingFileProtectionComplete
                              error:&error];
    if (success) {
        // Give the URL to Quick Look.
    }
    else {
        // An error happened. See the 'error' object for the details.
    }
    

    この時点で、で使用できるNSURLがありますQuick Look。使い終わったら、復号化されたファイルを削除することを忘れないでください。

ディスク上の暗号化について注意すべき点がいくつかあります。

  1. iOS4.0以降でのみサポートされます。

  2. 「古い」デバイスでは動作しない場合があります。

  3. ユーザーはアクティブなパスコードを持っている必要があります。

  4. を使用するNSDataWritingFileProtectionCompleteと、デバイスがロックされている間はファイルにアクセスできません。アプリがロックされているときにファイルにアクセスする必要がある場合は、NSDataWritingFileProtectionCompleteUnlessOpenまたはNSFileProtectionCompleteUntilFirstUserAuthentication代わりにを使用する必要があります。これにより、デバイスが盗まれてジェイルブレイクされた場合でも、優れた保護が提供されます。ただし、これらの暗号化オプションはiOS5.0以降でのみ使用できることに注意してください

オンディスク暗号化の詳細については、iOSアプリプログラミングガイドをご覧ください。

于 2012-02-01T23:12:37.547 に答える
1

いくつか掘り下げた後、私はそれが下QLPreviewControllerを使用していることを知り、要求されたファイルをロードするためにUIWebViewを呼び出します。loadRequest:

目的を達成するもう1つの方法は、でプライベートカテゴリを作成しUIWebView、メソッドswizzlingを使用してメソッドをオーバーライドし、loadRequest:代わりにメソッドを呼び出すことloadData:MIMEType:textEncodingName:baseURL:です。

注意してください

1)メモリ不足のシナリオ(つまり、大きなファイル)では、懸念がある場合は、「ドキュメントの読み込みエラー」という黒い画面が表示されます。(ハッキングされていないQLPreviewControllerは、これらのシナリオを非常にうまく処理し、ドキュメントを提示する方法を知っています)。

2)ここではプライベートAPIは使用されていませんが、Appleがこの種のハッキングを承認するかどうかはわかりません。

コード:

@implementation UIWebView (QLHack)

    - (void)MyloadRequest:(NSURLRequest *)request
    {
        // Check somehow that it's the call of your QLPreviewController           
        // If not, just call the original method.

        if (!insideQLPreviewController)
        {
             // Call original implementation
             [self MyloadRequest:request];     
        }
        else
        {
             // Load the real data you want
             [self loadData:data MIMEType:mimeType textEncodingName:nil baseURL:someURL];
        }

    }

    + (void)load 
    {
        method_exchangeImplementations(class_getInstanceMethod(self, @selector(loadRequest:)), class_getInstanceMethod(self, @selector(MyloadRequest:)));
    }

@end
于 2012-04-29T09:24:17.040 に答える
1

実際、tmpディレクトリへのファイルの書き込みはまだ安全ではありません。もう1つの方法は、NSURLProtocolでUIWebViewを使用し、このデータをその場で復号化できるようにすることです。

于 2015-05-11T23:52:31.393 に答える
0

1つの方法があります。

Temp Dirを使用し、Tempにファイルを保存し、そのTempファイルからNSURLを作成して表示し、その後、そのtempDirを削除します。

ありがとう。

于 2012-01-31T04:43:55.623 に答える