Как мне заставить QuickLook показывать автономные файлы? - PullRequest
5 голосов
/ 12 августа 2011

Наше приложение для iPad может отображать документы и сохранять их в автономном режиме, когда это необходимо. У меня есть подкласс QLPreviewController с именем DocumentViewController (теперь он называется DVC) для их отображения.

Рабочий процесс приложения: - Пользователь щелкает по имени документа, и DVC нажимается, чтобы показать документ. - DVC загружает файл в автономном режиме и показывает его, когда закончите. (Таким образом, URL-адрес HTTP загружается, сохраняется в автономном режиме и возвращается автономный URL-адрес)

Странно то, что с автономным URL-адресом работают только PDF-файлы, а остальные сбои ... (хотя он работает и с онлайн-ссылками)

Я провел несколько тестов, и когда я помещаю file: // перед автономной ссылкой, приложение не падает, но DVC предоставляет мне некоторую информацию о файле (например, это документ Excel 97-2004).

Итак, некоторая информация передается, но я не могу понять, в чем проблема.

Вот несколько скриншотов, а затем немного кода.

enter image description here

Код: Обратите внимание, что 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 (только расширение).

Ответы [ 5 ]

3 голосов
/ 22 августа 2011

Мы наконец нашли решение!

Я был прав, что проблема была в сохранении документа.

Мне нужно было изменить метод сохранения в:

+ (NSURL *)saveDocumentFileWithDocument:(Document *)document
{
    NSData *data = [NSData dataWithContentsOfURL:document.documentURL options:NSDataReadingUncached error:nil];

    NSString *fullPath = [self documentFilePathWithDocument:document];

    if([[NSFileManager defaultManager] createFileAtPath:fullPath contents:data attributes:nil])
    {
        return [NSURL fileURLWithPath:fullPath];
    }
//OLD CODE
//   if([[NSKeyedArchiver archivedDataWithRootObject:data] writeToFile:fullPath atomically:YES])
//   {
//       return [NSURL fileURLWithPath:fullPath];
//   }

    return nil;
}

ТАК сохраняйте его с файловым менеджером, а не с архиватором ключей.

3 голосов
/ 15 августа 2011

Вы не опубликовали свой код загрузки, но я считаю, что проблема здесь. Файлы из страниц (расширение .pages) не являются реальными файлами, они являются связками , то есть каталогами, которые содержат файлы и отображаются как один элемент в Finder (найдите файл .pages в Finder, щелкните правой кнопкой мыши и выберите «Показать содержимое»). Загрузка файла .pages на самом деле похожа на загрузку каталога: от того, какой результат вы получите, зависит веб-сервер, но, скорее всего, это страница с ошибкой.

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

Результаты для файлов .ppt и .xls выглядят нормально для меня; Я думаю, что маловероятно, что iPad может просматривать документы MS Office вообще.

Редактировать: извинения, я только что прочитал, что iOS может просматривать документы MS Office. Возможно, документы каким-то образом повреждены во время загрузки? Вы пытались установить местоположение загрузки в папку документов приложения и включить общий доступ к файлам iTunes? Таким образом, вы можете загрузить некоторые документы, снять их со своего устройства и затем попытаться открыть их на своем ПК, чтобы проверить, работает ли это.

0 голосов
/ 21 ноября 2012

Если у кого-то из них есть такая же проблема, даже если вы сделали все предложения выше (У меня была такая же проблема, когда я скачал некоторые файлы с Google Drive.)

Попробуйте это!

Поставьте «x» в конце вашего расширения файла, чтобы он был распознан как новая версия формата. (он работает только для файлов 'doc' и 'ppt', но не для файлов 'xls') Да, я знаю, что это не подходящий способ решить эту проблему, но стоит попробовать.

Поверь, я все перепробовал!

Надеюсь, вы поможете.

0 голосов
/ 18 августа 2011

Прежде всего, используйте этот код, чтобы убедиться, что ваши документы там, потому что я думаю, что ошибка вызвана вашим путем документов.

NSFileManager *fileManager=[NSFileManager defaultManager];


        if([fileManager fileExistsAtPath:fullPath]){
            NSLog(@"%@  exsit! ",fullPath);
        }else{
            NSLog(@"%@  not exsit! ",fullPath);

        }
0 голосов
/ 17 августа 2011
  1. Проверяли ли вы одинаковый размер файлов как в сети, так и в автономном режиме? Возможно, загрузка файла не была завершена

  2. Попробуйте использовать URL-адреса документов MS Office с обычным объектом NSURL и открывать их в UIWebView. Это работает тогда (таким образом, мы знаем, является ли это документом или Вашим классом)?

  3. Попробуйте использовать fileURLWithPath: метод NSURL в getDocumentFileAsPathWithDocument: возможно, что возвращаемый URL-адрес является неправильным (хотя это не похоже на это из журналов, но не мешает попробовать)

...