iCloud Drive не может удалить файл, созданный на другом устройстве

Я пытаюсь использовать iCloud Drive для хранения резервных копий данных моего приложения, используя один файл для каждой резервной копии, если это уместно, это простые файлы XML с настраиваемым расширением. Создание и загрузка файлов работают нормально, но поскольку я сейчас пытаюсь позволить пользователю вручную удалять резервные копии, я обнаружил, что не могу удалить файл программно, но могу сделать это, если перейду на iCloud Drive из приложения на iOS или из папки в Finder на macOS.

Чтобы сохранить файлы, я сначала получаю корень для контейнера с помощью

FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")

и создайте папку Document, если она не существует, так как я хочу, чтобы пользователь мог просматривать и редактировать файлы после создания файла локально во временном каталоге, который я загружаю с помощью

let file = FileManager.default
if file.fileExists(atPath: remotePath.path) {
    try? file.removeItem(at: remotePath)
}

try? file.setUbiquitous(true, itemAt: localPath, destinationURL: remotePath)

где remotePath — это ранее полученный путь с добавленным именем файла. Чтобы загрузить файлы, я использую NSMetadataQuery и получаю путь к каждому файлу с NSMetadataItemURLKey для каждого возвращаемого элемента, который работает нормально, но когда я пытаюсь

try? FileManager.default.removeItem(at: retrievedPath)

это работает, если это же устройство создало файл, но если он создан с другого, он всегда терпит неудачу, и ошибка говорит, что файл не существует по указанному пути.

Я удалил код обработки ошибок для ясности, но я протестировал это поведение, проверив выданную ошибку.

Как я могу удалить любой файл даже с других устройств, я пропустил какие-то шаги?


person Marco Boschi    schedule 27.04.2017    source источник


Ответы (1)


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

Чтобы правильно удалить файл, вы должны имитировать поведение UIDocument и использовать NSFileCoordinator в фоновой очереди, обратитесь к ответу, указанному ранее, для деталей реализации.

person Marco Boschi    schedule 28.04.2017