Открыть средство просмотра файлов (PDF) из приложения iOS

#ios #pdf #ios4 #openfiledialog

#iOS #PDF #ios4 #openfiledialog

Вопрос:

У нас есть код для загрузки PDF-файла с сервера с использованием протокола SOAP.

Мы сохраняем файл в папке Documents устройства iOS, и мы хотим разрешить пользователю открывать файл (обычно файлы PDF)

Но, по крайней мере, на симуляторе, приложение не открыло файл успешно.

Конечно, я могу открыть файл вручную (чтобы проверить, что файл был загружен идеально)

 // Get the documents folder where write the content
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:documentDownloaded.fileName];

if ([[NSFileManager defaultManager] fileExistsAtPath:[self getFileCompletePath]]){
    NSString *filePath = [[NSString alloc] initWithFormat:@"%@", [self getFileCompletePath]];
    NSURL *url = [[NSURL alloc] initFileURLWithPath:filePath];

    if ([[UIApplication sharedApplication] canOpenURL:url]){
        [[UIApplication sharedApplication] openURL: url];
    } else {
        NSLog(@"Not supported application to open the file %@", filePath);
    }

    [url release];
    [filePath release];
}
  

Полный путь к файлу в симуляторе:

/Пользователи / Пользователь / Библиотека / Поддержка приложений / Симулятор iPhone/4.3.2/Приложения/87800296-2917-4F26-B864-B20069336D1D/Документы/0000907.pdf

Кто-нибудь знает, что-то не так?

Файл может быть и электронной таблицей, pdf, изображением, документом… но для первого обхода будет отлично подходит только для PDF-файлов.

Спасибо,

Ответ №1:

omz вы были правы. Окончательное решение было следующим.

В моем контроллере реализован UIDocumentInteractionControllerDelegate

Когда пользователь хочет открыть документ, код был следующим:

     NSString *filePath = [[NSString alloc] initWithFormat:@"%@", [self getFileCompletePath]];
    NSURL *url = [[NSURL alloc] initFileURLWithPath:filePath];
    UIDocumentInteractionController *documentController = [self setupControllerWithURL:url 
                                                                         usingDelegate:self];

    [documentController retain];
    [documentController presentOptionsMenuFromRect:self.view.frame inView:self.view animated:YES];
    [url release];
    [filePath release];
  

Используя следующий метод, вы можете найти его в библиотеке разработчика Apple

 - (UIDocumentInteractionController *) 
    setupControllerWithURL: (NSURL *) fileURL
    usingDelegate: (id <UIDocumentInteractionControllerDelegate>) interactionDelegate {

    UIDocumentInteractionController *interactionController =
      [UIDocumentInteractionController interactionControllerWithURL: fileURL];
    interactionController.delegate = interactionDelegate;

    return interactionController;
}
  

Наконец, мы включаем методы делегирования:

 #pragma mark methods for the UIDocumentInteractionControllerDelegate

- (void)previewDocumentWithURL:(NSURL*)url
{
    UIDocumentInteractionController* preview = [UIDocumentInteractionController interactionControllerWithURL:url];
    preview.delegate = self;
    [preview presentPreviewAnimated:YES];
    [preview retain];
}

- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller
{
    [controller autorelease];
}

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
    return self;
}

- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController *)controller{
    return self.view.frame;
}

- (UIView *)documentInteractionControllerViewForPreview:(UIDocumentInteractionController *)controller{
    return self.view;
}
  

Спасибо,

Комментарии:

1. Есть ли способ определить тип mimetype, если, скажем, ваш контент представляет собой байтовый поток, а не файл? Кажется глупым записывать файл на диск с правильным расширением, если он уже есть в памяти. UIWebView поддерживает это при использовании loadData.

Ответ №2:

Вы не можете открывать URL-адреса файлов с UIApplication openURL: помощью метода ‘s. Из-за песочницы другие приложения не могли получить доступ к файлам в папке документов вашего приложения.

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

Комментарии:

1. Вчера я читал об этом компоненте в библиотеке Apple, сегодня проверю, но … Если я не ошибаюсь, когда применяю эти строки кода … // Получаем папку documents, в которую записываем содержимое NSArray *пути = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, ДА); NSString * documentsDirectory = [пути objectAtIndex:0]; Я обращаюсь к папке документов пользователя, а не к документу приложенияпапка.