NSFileProvider importDocument предоставляет fileURL пустого файла при сохранении нового документа из приложений MSOffice.

Я пытаюсь создать новый документ в 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. Тот же код для файлов, сохраненных из PSDFKit, Files или Photos, работает отлично. С другой стороны, Word правильно сохраняет файлы в других файловых провайдерах, таких как Dropbox, поэтому проблемы быть не должно.

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

Что я делаю неправильно, кроме как ожидаю, что расширение приложения для iOS будет работать?


person abjurato    schedule 02.05.2018    source источник


Ответы (1)


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

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

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

person Morris Hsieh    schedule 07.01.2019