2

I'm building a PhoneGap 1.5 (Cordova) application for iOS and want to use the ChildBrowser plugin to show PDF files. I've been able to get it set up and it works very well when I'm viewing external PDF files (http, https).

The app has limited offline capabilities. I'm using the file system and file transfer API to download PDF files and save them to the local file system. When I try to view these documents using the ChildBrowser plugin, they never load.

I've done some troubleshooting by sticking some breakpoints in the plugin's command and viewcontroller. I find when I try to view a local document, I hit the webViewDidFailLoadWithError method with the following message:

The operation couldn't be completed. 
(WebKitErrorDomain error 101.)

The console shows the file:// URL of the document I tried to load, and if I browse that URL in safari on the simulator, I am able to view the document. The URL is similar to this when run in the simulator:

file://localhost/Users/{username}/Library/Application Support/iPhone Simulator/5.1/Applications/5D8EDAB7-4BB7-409E-989D-250A84B37877/Documents/{filename}

Is what I'm doing possible, and if so, how do I need to configure my application to be able to show PDF files from the local file system in the ChildBrowser?

4

1 に答える 1

4

私はこれを自分で解決することができました。PhoneGap fileEntry.toURI()メソッドは、元の投稿に含めたようなURLを返します。

file://localhost/Users/{username}/Library/Application Support/iPhone Simulator/5.1/Applications/5D8EDAB7-4BB7-409E-989D-250A84B37877/Documents/{filename}

いくつかのフープをジャンプして、ファイルURLがエスケープされ、アプリのドキュメントディレクトリに相対的であることを確認した後、正常に読み込まれる結果のURLは次のようになります。

file:///Users/{username}/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/B50682DD-AE6C-4015-AE61-3879576A4CB7/Documents/{relativeUri}

少し違います。これを修正するために、おそらくすべての場合ではありませんが、少なくとも私の場合は、ChildBrowserViewControllerのloadURLメソッドを変更して、ファイルURLを検索し、絶対的なものを取り除き、アプリのドキュメントディレクトリに相対的なURLを残しました。次に、NSFileManagerを使用して、機能するURLを作成しました。私はiOS開発に比較的慣れていないので、これを行うためのより良い方法があるかもしれません。入力を歓迎します。コードは次のとおりです。

- (void)loadURL:(NSString*)url {
...
    else if([url hasPrefix:@"file://"]) {
        NSError *error = NULL;

        //Create the regular expression to match against
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"file://.*/Documents/" options:NSRegularExpressionCaseInsensitive error:&error];

        // Create the new string by replacing the matching of the regex pattern with the template pattern(empty string)
        NSString *relativeUri = [regex stringByReplacingMatchesInString:url options:0 range:NSMakeRange(0, [url length]) withTemplate:@""];
        NSLog(@"New string: %@", relativeUri);

        NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
        NSURL *url = [documentsDirectory URLByAppendingPathComponent:relativeUri];
        NSLog(@"New string: %@", url);
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [webView loadRequest:request];
    }
...
}
于 2012-04-06T23:06:36.247 に答える