Как загрузить файлы из UIWebView и снова открыть

Как создать "диспетчер загрузки", который обнаружит, когда ссылка, на которую вы нажимаете (в UIWebView), имеет файл, заканчивающийся ". pdf", ".png", ".jpeg", ".tiff".gif ",".doc ",".docx ",".ppt ",".pptx ",".xls "и".xlsx", а затем откроется окно UIActionSheet, в котором вы спрашиваете, хотел бы загрузить или открыть. Если вы выберете загрузку, он затем загрузит этот файл на устройство.

В другом разделе приложения будет список загруженных файлов в UITableView, и когда вы нажмете на них, они будут отображаться в UIWebView, но, конечно, автономно, потому что они будут загружаться локально, поскольку они были бы загружены.

См. http://itunes.apple.com/gb/app/downloads-lite-downloader/id349275540?mt=8 для лучшего понимания того, что я пытаюсь сделать.

Каков наилучший способ сделать это?

Ответы

Ответ 1

Используйте метод - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType в вашем делете UiWebView, чтобы определить, когда он хочет загрузить ресурс.

Когда вызов метода вызывается, вам просто нужно проанализировать URL-адрес из параметра (NSURLRequest *)request и вернуть НЕТ, если он один из ваших желаемых типов, и продолжить с вашей логикой (UIActionSheet) или вернуть ДА, если пользователь просто нажал кнопку простая ссылка на файл HTML.

Имеет смысл?

Edit_: для лучшего понимания примера быстрого кода

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
     if(navigationType == UIWebViewNavigationTypeLinkClicked) {
          NSURL *requestedURL = [request URL];
          // ...Check if the URL points to a file you're looking for...
          // Then load the file
          NSData *fileData = [[NSData alloc] initWithContentsOfURL:requestedURL;
          // Get the path to the App Documents directory
          NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
          NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
          [fileData writeToFile:[NSString stringWithFormat:@"%@/%@", documentsDirectory, [requestedURL lastPathComponent]] atomically:YES];
     } 
}

Edit2_: я обновил образец кода после нашего обсуждения ваших проблем в чате:

- (IBAction)saveFile:(id)sender {
    // Get the URL of the loaded ressource
    NSURL *theRessourcesURL = [[webView request] URL];
    NSString *fileExtension = [theRessourcesURL pathExtension];

    if ([fileExtension isEqualToString:@"png"] || [fileExtension isEqualToString:@"jpg"]) {
        // Get the filename of the loaded ressource form the UIWebView request URL
        NSString *filename = [theRessourcesURL lastPathComponent];
        NSLog(@"Filename: %@", filename);
        // Get the path to the App Documents directory
        NSString *docPath = [self documentsDirectoryPath];
        // Combine the filename and the path to the documents dir into the full path
        NSString *pathToDownloadTo = [NSString stringWithFormat:@"%@/%@", docPath, filename];


        // Load the file from the remote server
        NSData *tmp = [NSData dataWithContentsOfURL:theRessourcesURL];
        // Save the loaded data if loaded successfully
        if (tmp != nil) {
            NSError *error = nil;
            // Write the contents of our tmp object into a file
            [tmp writeToFile:pathToDownloadTo options:NSDataWritingAtomic error:&error];
            if (error != nil) {
                NSLog(@"Failed to save the file: %@", [error description]);
            } else {
                // Display an UIAlertView that shows the users we saved the file :)
                UIAlertView *filenameAlert = [[UIAlertView alloc] initWithTitle:@"File saved" message:[NSString stringWithFormat:@"The file %@ has been saved.", filename] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [filenameAlert show];
                [filenameAlert release];
            }
        } else {
            // File could notbe loaded -> handle errors
        }
    } else {
        // File type not supported
    }
}

/**
    Just a small helper function
    that returns the path to our 
    Documents directory
**/
- (NSString *)documentsDirectoryPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectoryPath = [paths objectAtIndex:0];
    return documentsDirectoryPath;
}