UIActivityViewController и пакет UIDocument

Резюме:

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

Фон:

Я использую подклассы UIDocument и FileWrappers, чтобы предоставить пакет документов для хранения метаданных, данных и предварительного просмотра миниатюр для моих документов. Я сделал необходимые заклинания UTI, чтобы пакеты документов работали локально.

Я добавил поддержку обмена через UIActivityViewController. Я отправляю документ, используя его fileURL. При тестировании с циклическим переключением моего пакета документов все работает хорошо: экспорт и импорт работают отлично... почти.

Проблема:

С вложениями Почты пакет документа прибывает в полусгладленное состояние (импорт больше не видит его как пакет документа). При проверке документа (на моем Mac в TextWrangler) все еще есть структура каталогов, и я могу видеть метаданные, данные, эскиз, но FileManager не видит его.

Я пытался отправить вложение почты обратно в мое приложение (через "Копировать в приложение") до отправки электронного письма, и это работает нормально.

Вопрос:

Делает ли Mail что-то необычное при перемещении пакета документов через почтовый сервер?

Я надеюсь, что в конечном итоге поддержу Open in Place и Files, так что я действительно не хочу разбираться в общих документах в BLOB-объекте данных и т. Д. Кто-нибудь знает, что здесь происходит и как с этим справиться, сохраняя при этом мой документ в пакете?

Обновление: я подтвердил, что Apple Mail архивирует пакет, но не меняет расширение. Таким образом, полученный файл является почтовым индексом оригинала. Как я могу убедиться, что Apple Mail видит это как пакет и не архивирует? И, если я не могу, как я могу узнать, что импортируемый файл - это zip без расширения zip?

1 ответ

Ответ:

Почта действительно архивирует пакет документов.

Согласно моим исследованиям, нам не нужно изменять подход "пакет документов" (то есть не иметь сплющенного специального типа экспорта). При импорте мы проверяем, является ли это каталогом. Если это не каталог, то мы пытаемся разархивировать его из исходного URL-адреса, а не просто копировать его. Следует отметить, что распаковка должна производиться через стороннюю библиотеку.

Хотелось бы, чтобы был встроенный API для обработки этого, но это, кажется, способ справиться с этим.

(Inelegant) пример кода:

// Check if directory
if let _ = try? FileManager.default.contentsOfDirectory(atPath: url.path) {
    // It is - try copying to the documents url
    do {
        try FileManager.default.copyItem(at: url, to: destination)
    } catch {
        self.delegate?.documentFileManagerDidFail(error: NSLocalizedString("Failed to copy file: \(error)", comment: "Document failure message"))
        return
    }
} else {
    // It's not - try unzipping to the documents url
    do {
        try FileManager.default.unzipItem(at: url, to: destination)
    } catch {
        self.delegate?.documentFileManagerDidFail(error: NSLocalizedString("Failed to unzip file: \(error)", comment: "Document failure message"))
        return
    }
}
Другие вопросы по тегам