#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]; Я обращаюсь к папке документов пользователя, а не к документу приложенияпапка.