我正在为iOS构建PhoneGap 1.5(Cordova)应用程序,并希望使用ChildBrowser插件来显示PDF文件。我已经能够设置它,当我查看外部PDF文件(http,https)时它非常有效。
该应用程序的离线功能有限。我正在使用文件系统和文件传输API下载PDF文件并将其保存到本地文件系统。当我尝试使用ChildBrowser插件查看这些文档时,它们永远不会加载。
我通过在插件的命令和viewcontroller中添加一些断点来完成一些故障排除。我发现当我尝试查看本地文档时,我使用以下消息点击webViewDidFailLoadWithError方法:
The operation couldn't be completed.
(WebKitErrorDomain error 101.)
控制台显示我尝试加载的文档的文件:// URL,如果我在模拟器上的safari中浏览该URL,我就可以查看该文档。在模拟器中运行时,URL与此类似:
file://localhost/Users/{username}/Library/Application Support/iPhone Simulator/5.1/Applications/5D8EDAB7-4BB7-409E-989D-250A84B37877/Documents/{filename}
我正在做什么,如果是这样,我如何配置我的应用程序以便能够从ChildBrowser中的本地文件系统显示PDF文件?
答案 0 :(得分: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];
}
...
}