NSFileProvider importDocument предоставляет fileURL пустого файла при сохранении нового документа из приложений MSOffice - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать новый документ в Word.app и сохранить его в своем приложении через расширение FileProvider. Моя реализация соответствующего метода:

    override func importDocument(at fileURL: URL,
                                 toParentItemIdentifier parentItemIdentifier: NSFileProviderItemIdentifier,
                                 completionHandler: @escaping (NSFileProviderItem?, Error?) -> Void)
    {

        let internalUrl = NSFileProviderManager.default.documentStorageURL.appendingPathComponent(fileURL.lastPathComponent, isDirectory: false)

        guard fileURL.startAccessingSecurityScopedResource() else { fatalError() }
        try! FileManager.default.copyItem(at: fileURL, to: internalUrl) // breakpoint here
        fileURL.stopAccessingSecurityScopedResource()

        // update local db, whatever

        completionHandler(TemporaryItem(forImporting: internalUrl, into: parentItemIdentifier), nil)
    }

Очевидно, что когда я ставлю точку останова и проверяю атрибуты файла с помощью команды po FileManager.default.attributesOfItem(forPath: fileURL.path), значение для NSFileSize равно 0. Команда po FileManager.default.contents(atPath: fileURL.path) возвращает мне 0-байтовые данные с указателем 0x000000000000bad0. Файл, записываемый в internalUrl, также пуст.

Самое странное, что такая ситуация возникает только с приложениями MS Word, Excel и PowerPoint. Тот же код для файлов, сохраненных из PSPDFKit, файлов или фотографий работает отлично. С другой стороны, Word правильно сохраняет файлы другим провайдерам файлов, таким как Dropbox, поэтому проблема не должна возникать.

Я пытался сделать это с помощью файлового координатора, но это не помогло. Я проверил, что у каждого startAccessingSecurityScopedResource () есть свой stopAccessingSecurityScopedResource (). Я тестировал на двух устройствах iOS11.3 - то же самое поведение. Я даже нашел другое приложение с открытым исходным кодом , которое выполняет те же операции.

Что я делаю не так, за исключением того, что ожидается расширение приложения для iOS?

1 Ответ

0 голосов
/ 07 января 2019

Поскольку приложение Word будет несколько раз запускать importDocument ...

При первом вызове importDocument он пытается создать пустой файл с расширением поставщика файлов. Вот почему размер импортируемого файла равен 0.

Если вы справитесь с этим, приложение Word получит путь к сохраненному файлу и обновит файл. И тогда он вызовет следующий itemChangedAtURL: api с только что полученным путем к файлу.

...