Apple文件应用程序执行"移动"通过文件提供程序扩展的操作我的扩展显示禁用

时间:2018-02-07 09:21:18

标签: ios swift3 swift4 fileprovider-extension

enter image description here

enter image description here

在我的文件提供程序扩展中,我想在 NoteProvider 扩展名中执行移动操作。

我可以通过拖动操作将任何文件移动到任何正常工作的文件夹上但是当我尝试"移动"在此时屏幕2显示和其他扩展程序中的操作显示在屏幕上显示,但我的 NotProvider 扩展程序已禁用。

我的代码是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
    }
}

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文件图像 enter image description here

1 个答案:

答案 0 :(得分:2)

在标识符 NSFileProviderRootContainerItemIdentifier itemForIdentifier 方法中返回 NSFileProviderItem 实例。如果您为根标识符返回nil,则不会在移动操作中启用应用程序。