I am having trouble getting my NSFileProviderExtension working with iOS 11 and the Files app. I have it enumerating fine and I implemented providePlaceholder exactly as prescribed in the documentation. The problem is the NSFileProviderManager.writePlaceholder always fails. I am trying to implement startProvidingItem(at url: completionHandler:) but seems I need to get past providing the placeholder first.
Here is the code and the accompanying debug output:
override func providePlaceholder(at url: URL, completionHandler: @escaping (Error?) -> Void) {
NSLog("providePlaceholder: url = %@", url.absoluteString)
guard let identifier = persistentIdentifierForItem(at: url) else {
completionHandler(NSFileProviderError(.noSuchItem))
return
}
do {
NSLog("persistentIdentifier = %@", identifier.rawValue)
let fileProviderItem = try item(for: identifier)
NSLog("fileProviderItem = %@", fileProviderItem.description)
let placeholderURL = NSFileProviderManager.placeholderURL(for: url)
NSLog("placeholderURL = %@", placeholderURL.absoluteString)
try NSFileProviderManager.writePlaceholder(at: placeholderURL,
withMetadata: fileProviderItem)
completionHandler(nil)
}
catch let error {
NSLog("writePlaceholder error = %@", error.localizedDescription)
completionHandler(error)
}
}providePlaceholder: url = file:///private/var/mobile/Containers/Shared/AppGroup/90C5A58C-5F25-4CE8-8596-52933CD64B66/File%20Provider%20Storage/0/file%200.png
persistentIdentifier = 0
fileProviderItem = filename = file 0.png itemIdentifier = NSFileProviderItemIdentifier(_rawValue: 0) parentItemIdentifier = NSFileProviderItemIdentifier(_rawValue: NSFileProviderRootContainerItemIdentifier) capablities = NSFileProviderItemCapabilities(rawValue: 63) typeIdentifier = public.png
placeholderURL = file:///private/var/mobile/Containers/Shared/AppGroup/90C5A58C-5F25-4CE8-8596-52933CD64B66/File%20Provider%20Storage/0/.file%200.png.icloud
writePlaceholder error = The folder “.file 0.png.icloud” doesn’t exist.