iOS 从 UIWebVIew 使用外部应用程序打开文档
iOS Open Document with External App from UIWebVIew
我有一个UIWebView
。单击包含文档的 link 时,我想在外部应用程序(office、openoffice 等)中打开该文档,而不是在 UIWebView
.
中打开该文档
我知道如何处理电子邮件:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ([[[request URL] scheme] isEqual:@"mailto"]) {
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}
return YES;
}
除了文档,还有什么办法可以做到这一点吗?
谢谢!
编辑:
这就是我所做的:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL* possibleDocumentURL = [request mainDocumentURL];
NSString* extension = [[possibleDocumentURL lastPathComponent] pathExtension];
if ([[[request URL] scheme] isEqual:@"mailto"]) {
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}else if ([extension isEqualToString:@"pdf"] || [extension isEqualToString:@"docx"]){
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:possibleDocumentURL];
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse
*resp, NSData *respData, NSError *error){ stringByAppendingString:names[names.count-1]];
NSString *fileName = @"myFile";
NSString * path = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
NSError *errorC = nil;
BOOL success = [respData writeToFile:path
options:NSDataWritingFileProtectionComplete
error:&errorC];
if (success) {
self.documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:path]];
self.documentController.delegate = self;
[self.documentController presentOptionsMenuFromRect:CGRectZero inView:self.view animated:YES];
} else {
NSLog(@"fail: %@", errorC.description);
}
}];
return NO;
}
return YES;
}
现在的问题是 UIDocumentInteractionController
只显示 Mail
和 Messages
应用程序。我需要用于打开 pdf
、docx
等文件的应用程序。
有什么想法吗?谢谢!
UIDocumentInteractionController 将为您工作。
在 [UIWebViewDelegate webView: shouldStartLoadWithRequest: navigationType: navigationType:]
中,您可以检查 URL 是否指向文档。最简单的方法就是查找 pdf、doc 等。如果您希望它更好,请使用 UTTypes。
NSURL* possibleDocumentURL = [request mainDocumentURL];
NSString* extension = [[possibleDocumentURL lastPathComponent] pathExtension];
// TODO: check ending
如果是 URL 文档,则只需下载该文档。您现在可以打开 DocumentPreviewController
、UIDocumentInteractionController
或 QLPreviewController
。用户仍然需要 select 文件应该放在哪里。
如果您要打开它的应用程序支持自定义 URL 方案,您可以将 URL 或文件本身直接传递给它,无需用户交互。
我有一个UIWebView
。单击包含文档的 link 时,我想在外部应用程序(office、openoffice 等)中打开该文档,而不是在 UIWebView
.
我知道如何处理电子邮件:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ([[[request URL] scheme] isEqual:@"mailto"]) {
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}
return YES;
}
除了文档,还有什么办法可以做到这一点吗? 谢谢!
编辑: 这就是我所做的:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL* possibleDocumentURL = [request mainDocumentURL];
NSString* extension = [[possibleDocumentURL lastPathComponent] pathExtension];
if ([[[request URL] scheme] isEqual:@"mailto"]) {
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}else if ([extension isEqualToString:@"pdf"] || [extension isEqualToString:@"docx"]){
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:possibleDocumentURL];
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse
*resp, NSData *respData, NSError *error){ stringByAppendingString:names[names.count-1]];
NSString *fileName = @"myFile";
NSString * path = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
NSError *errorC = nil;
BOOL success = [respData writeToFile:path
options:NSDataWritingFileProtectionComplete
error:&errorC];
if (success) {
self.documentController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:path]];
self.documentController.delegate = self;
[self.documentController presentOptionsMenuFromRect:CGRectZero inView:self.view animated:YES];
} else {
NSLog(@"fail: %@", errorC.description);
}
}];
return NO;
}
return YES;
}
现在的问题是 UIDocumentInteractionController
只显示 Mail
和 Messages
应用程序。我需要用于打开 pdf
、docx
等文件的应用程序。
有什么想法吗?谢谢!
UIDocumentInteractionController 将为您工作。
在 [UIWebViewDelegate webView: shouldStartLoadWithRequest: navigationType: navigationType:]
中,您可以检查 URL 是否指向文档。最简单的方法就是查找 pdf、doc 等。如果您希望它更好,请使用 UTTypes。
NSURL* possibleDocumentURL = [request mainDocumentURL];
NSString* extension = [[possibleDocumentURL lastPathComponent] pathExtension];
// TODO: check ending
如果是 URL 文档,则只需下载该文档。您现在可以打开 DocumentPreviewController
、UIDocumentInteractionController
或 QLPreviewController
。用户仍然需要 select 文件应该放在哪里。
如果您要打开它的应用程序支持自定义 URL 方案,您可以将 URL 或文件本身直接传递给它,无需用户交互。