Файловое приложение Apple выполняет действие "Переместить" через расширение провайдера файлов.

введите описание изображения здесь

введите описание изображения здесь

В моем расширении провайдера файлов я хочу выполнить операцию перемещения в моем расширении 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 файл изображения введите описание изображения здесь

1 ответ

Решение

Вернуть экземпляр NSFileProviderItem в метод itemForIdentifier для идентификатора NSFileProviderRootContainerItemIdentifier. Если вы вернете nil для корневого идентификатора, приложение не будет включено в операции перемещения.

Другие вопросы по тегам