Наше приложение для iPad может отображать документы и сохранять их в автономном режиме, когда это необходимо.
У меня есть подкласс QLPreviewController с именем DocumentViewController (теперь он называется DVC) для их отображения.
Рабочий процесс приложения:
- Пользователь щелкает по имени документа, и DVC нажимается, чтобы показать документ.
- DVC загружает файл в автономном режиме и показывает его, когда закончите.
(Таким образом, URL-адрес HTTP загружается, сохраняется в автономном режиме и возвращается автономный URL-адрес)
Странно то, что с автономным URL-адресом работают только PDF-файлы, а остальные сбои ... (хотя он работает и с онлайн-ссылками)
Я провел несколько тестов, и когда я помещаю file: // перед автономной ссылкой, приложение не падает, но DVC предоставляет мне некоторую информацию о файле (например, это документ Excel 97-2004).
Итак, некоторая информация передается, но я не могу понять, в чем проблема.
Вот несколько скриншотов, а затем немного кода.
Код:
Обратите внимание, что Document является классом модели со свойствами документа, такими как id, имя, тип файла и URL.
//DVC QLPreviewController dataSource method for returning url
- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger)index
{
[SaveHelper saveDocumentFileAndPropertyWithDocument:document];
//[SaveHelper getDocumentFileWithDocument:document]; without file://
//if I return document.documentUrl it is working with all files except iworks files)
return [SaveHelper getDocumentFileAsPathWithDocument:document]; //with file://
}
//SaveHelper methods
+ (NSString *)documentFilePathWithDocument:(Document *)document
{
return [[self documentFilePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%d.%@", DOCUMENT_FILE_PREFIX, document.documentId, document.documentType]];
}
+ (NSURL *)saveDocumentFileAndPropertyWithDocument:(Document *)document
{
if([self saveDocumentPropertyWithDocument:document])
{
return [self saveDocumentFileWithDocument:document];
}
return nil;
}
+ (NSURL *)saveDocumentFileWithDocument:(Document *)document
{
NSData *data = [NSData dataWithContentsOfURL:document.documentURL];
NSString *fullPath = [self documentFilePathWithDocument:document];
if([[NSKeyedArchiver archivedDataWithRootObject:data] writeToFile:fullPath atomically:YES])
{
return [NSURL fileURLWithPath:fullPath];
}
return nil;
}
+ (NSURL *)getDocumentFileWithDocument:(Document *)document
{
return [NSURL fileURLWithPath:[self documentFilePathWithDocument:document]];
}
+ (NSURL *)getDocumentFileAsPathWithDocument:(Document *)document
{
return [NSURL fileURLWithPath:[@"file://" stringByAppendingPathComponent:[[self getDocumentFileWithDocument:document] absoluteString]]];
}
Если нужно больше кода, просто скажите.
EDIT:
При регистрации URL-адреса, переданного методом getDocumentFileAsPathWithDocument:
url: file:/var/mobile/Applications/xx-xx/Documents/documentFiles/file_20.pdf
url: file:/var/mobile/Applications/xx-xx/Documents/documentFiles/file_80.docx
Где файл PDF работает, а docx нет
Когда я пытаюсь загрузить изображение (jpg) из локального хранилища, я получаю черный экран с таким сообщением об ошибке:
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.5 (8L1)/Symbols/System/Library/Frameworks/QuickLook.framework/DisplayBundles/Image.qldisplay/Image (file not found).
warning: No copy of Image.qldisplay/Image found locally, reading from memory on remote device. This may slow down the debug session.
EDIT:
Веб-просмотр также не работает с локальными URL-адресами. PDF в порядке, но файлы office выдают сообщение «Невозможно прочитать документ, неверный формат файла». Документы iWorks выдают ту же ошибку, что и быстрый просмотр. Я думаю, что это где-то при сохранении и загрузке формата, я сохраняю их как NSDATA, но после этого у iPad нет намека на то, что это, например, документ Word (только расширение).