Search code examples
iosicloud-drive

iCloud Drive cannot remove file created from other device


I'm trying to adopt iCloud Drive to store backups of the data of my application using a single file for each backup, if it's relevant they're simple XML files with a custom extension. File creation and upload are working fine but as I'm now trying to let the user manually delete backups I found out that I cannot delete the file programmatically but I can do it if I go to iCloud Drive from the app on iOS or the folder in Finder on macOS.

To save the files I first retrieve the root for the container with

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

and create the Document folder if it doesn't exists as I want the user to be able to view and edit the files, after creating the file locally in the temporary directory I upload it with

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

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

where remotePath is the path retrieved before with the file name appended. To load the files I use a NSMetadataQuery and get the path of each file with NSMetadataItemURLKey on each returned item, which is working fine but when I attempt to

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

it works if the same device created the file but if it is from another one it always fail and the error says that the file does not exists at the specified path.

I've removed error handling code for clarity but I've tested this behaviour inspecting the thrown error.

How can I delete any file even from other devices, am I missing some steps?


Solution

  • I was indeed missing something, after reading this question, in particular this answer, I found out that even if the NSMetadataQuery returns the path correctly is possible that the file has not been downloaded to the the device, hence the error.

    To correctly delete a file you have to mimic the behaviour of UIDocument and use a NSFileCoordinator on a background queue, refer to the answer referenced before for implementation details.