iOS Open Document with External App from UIWebVIew

隐身守侯 提交于 2020-01-23 01:38:09

问题


I have a UIWebView. When a link which contains a document is clicked, I want to open that document in a external app (office, openoffice, etc) but not inside the UIWebView.

I know how to do it for emails:

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

}

Is there any way to do this but for documents? Thanks!

EDIT: That's what I have done:

- (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; 
}

The problem now is that the UIDocumentInteractionController only shows Mail and Messages apps. I need the apps for opening pdf, docx, etc files.

Any ideas? Thanks!


回答1:


In [UIWebViewDelegate webView: shouldStartLoadWithRequest: navigationType: navigationType:] you can check if the URL looks like it points to a document. The simplest way to do that is just to look for pdf, doc etc. If you want it to be nicer, then use UTTypes.

NSURL* possibleDocumentURL = [request mainDocumentURL];
NSString* extension = [[possibleDocumentURL lastPathComponent] pathExtension];
// TODO: check ending

If it's a URL to a document, then just download the document. You can now either open a DocumentPreviewController, UIDocumentInteractionController or QLPreviewController. The user will still need to select where the file should go.

If the app you want to open it in supports a custom URL scheme you could pass the URL or the file itself directly to it without user interaction.




回答2:


UIDocumentInteractionController will work for you.

Apple docs

Great step by step tutorial



来源:https://stackoverflow.com/questions/28279463/ios-open-document-with-external-app-from-uiwebview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!