iosswift3swift4fileprovider-extension

Apple File Application perform "Move" action via file provider extension my extention display disable


enter image description here

enter image description here

In my file provider extension i want to perform move operation in my NoteProvider extension.

I can move any file via Drag operation above any folder it works properly But when i try to "Move" via Action display in bellow screen at that time screen2 display and other extension are enable but my NotProvider Extension was disable.

My code are FileProviderItem

class FileProviderItem: NSObject, NSFileProviderItem {

    public var id: String?
    public var name: String?
    var childItemCount : NSNumber?
    var documentSize: NSNumber?
    var creationDate : Date?
    var contentModificationDate : Date?
    var lastUsedDate: Date?
    var isDownloaded: Bool = false

    public var fTypeIdentifier: String?

    var pid : NSFileProviderItemIdentifier!

    var parentItemIdentifier: NSFileProviderItemIdentifier {
        return pid
    }

    var typeIdentifier: String {
        return fTypeIdentifier! // for folder =  "public.folder", for file  = file type UTI
    }

    var itemIdentifier: NSFileProviderItemIdentifier {
        return NSFileProviderItemIdentifier(self.id!)
    }

    var filename: String {
        return self.name!
    }

    override init() {

    }

    override func isEqual(_ object: Any?) -> Bool {
        if let obj = object as? FileProviderItem {
            if self.itemIdentifier == obj.itemIdentifier {
                return true
            }
        }
        return false
    }

    var capabilities: NSFileProviderItemCapabilities {
        return .allowsAll
    }
}

For FileProviderExtension

class FileProviderExtension: NSFileProviderExtension {

 override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
    // resolve the given identifier to a record in the model
    // db = Array of NSFileProviderItem
    for i in db {
        if i.itemIdentifier.rawValue == identifier.rawValue {
            return i
        }
    }

    // TODO: implement the actual lookup
    throw NSError(domain: NSCocoaErrorDomain, code: NSNotFound, userInfo:[:])
}

override func importDocument(at fileURL: URL, toParentItemIdentifier parentItemIdentifier: NSFileProviderItemIdentifier, completionHandler: @escaping (NSFileProviderItem?, Error?) -> Void) {

    print("importDocument :- \(fileURL) parentItemIdentifier = \(parentItemIdentifier)")
    completionHandler(nil, nil)
 }

 override func reparentItem(withIdentifier itemIdentifier: NSFileProviderItemIdentifier, toParentItemWithIdentifier parentItemIdentifier: NSFileProviderItemIdentifier, newName: String?, completionHandler: @escaping (NSFileProviderItem?, Error?) -> Void) {

        print("reparentItem :- \(itemIdentifier) parentItemIdentifier = \(parentItemIdentifier) newName = \(String(describing: newName))")

        guard let item = try? item(for: itemIdentifier) as? FileProviderItem else {
            completionHandler(nil, NSFileProviderError(.noSuchItem))
            return
        }

        item?.pid = NSFileProviderItemIdentifier(rawValue: parentItemIdentifier.rawValue)
        //item?.name = newName
        completionHandler(item, nil)

    }

}

NoteProvider(FileProvider) .plist file image enter image description here


Solution

  • return NSFileProviderItem instance in itemForIdentifier method for identifier NSFileProviderRootContainerItemIdentifier. If you return nil for root identifier, app wont be enabled in move operation.