2

我目前正在开发 iOS 11 File Provider 扩展来枚举我们的服务远程存储的文件。到目前为止,我已经能够浏览缓存的文件数据库,以及我的项目的云枚举。

我的下一步是创建工作集,但到目前为止,我还没有发现让系统使用我的工作集枚举器进行枚举的任何成功。枚举器被创建,但从不枚举,无论是枚举项目还是更改。

lastUsedDate我为我的项目使用本地数据库,跟踪 .tagDatafavoriteRank. 它们尚未跨设备同步,但这不应阻止本地设备显示这些项目。每次我的主机应用程序显示一个文件时,它都会设置它的lastUsedDateand 调用signalEnumerator(for: myItemIdentifier)and signalEnumerator(for: .workingSet)

我的NSFileProviderExtension子类实现了setTagData(...)setFavoriteRank(...)setLastUsedDate(...)一样。

我有一个专门的类来枚举工作集,如下所示:

class WorkingSetEnumerator: NSObject, NSFileProviderEnumerator {
    let items: [NSFileProviderItem]
    // Initialise with the workings set items, might not be correct but should work as first step
    init(items: [NSFileProviderItem]) { 
        self.items = items
        super.init()
    }

    func invalidate() {
        // Empty since it is a "dummy" implementation
    }

    func enumerateItems(for observer: NSFileProviderEnumerationObserver, startingPage page: NSFileProviderPage) {
        observer.didEnumerate(self.items)
        observer.finishEnumerating(upTo: nil)
    }

    func enumerateChanges(for observer: NSFileProviderChangesObserver, from anchor: NSFileProviderSyncAnchor) {
         //TODO: Implement!
         fatalError("Not Implemented, yet!")
    }
}

这里没有什么特别的。为了举例,它在这里用虚拟数据初始化,但我也尝试过使用实时数据和同样的问题。

请求枚举器的函数实现如下: override func enumerator(for containerItemIdentifier: NSFileProviderItemIdentifier) throws -> NSFileProviderEnumerator {

    if containerItemIdentifier == .rootDirectory {
        // return a folder enumerator on the root
    } else if containerItemIdentifier == .workingSet {
        let items = [DummyItem()]
        return WorkingSetEnumerator(items: items)
    } else {
        // return Folder or File enumerator based on the item
    }
}

这是我的 DummyItem 的实现:

class DummyFileItem: NSObject, NSFileProviderItem {
    var parentItemIdentifier: NSFileProviderItemIdentifier {
        return NSFileProviderItemIdentifier.rootContainer
    }

    var itemIdentifier: NSFileProviderItemIdentifier {
        return NSFileProviderItemIdentifier("Dummy")
    }

    var filename: String {
        return "Dummy"
    }

    var typeIdentifier: String {
        return "public.folder"
    }

    var isShared: Bool {
        return true
    }

    var isTrashed: Bool {
        return false
    }

    var lastUsedDate: Date? {
        return Date()
    }

    var favoriteRank: NSNumber? {
        return NSNumber(value: NSFileProviderFavoriteRankUnranked)
    }

    var tagData: Data? {
        return nil
    }

    var documentSize: NSNumber? {
        return NSNumber(value: 0)
    }

    var childItemCount: NSNumber? {
        return NSNumber(value: 0)
    }

    var isDownloading: Bool {
        return false
    }

    var isDownloaded: Bool {
        return true
    }

    var downloadingError: Error? {
        return nil
    }

    var isUploaded: Bool {
        return true
    }

    var isUploading: Bool {
        return false
    }

    var uploadingError: Error? {
        return nil
    }

    var isMostRecentVersionDownloaded: Bool {
        return true
    }

    var isSharedByCurrentUser: Bool {
        return true
    }
}

只是一些虚拟数据,至少应该在最近的标签中显示我的项目。

如前所述,我还尝试使用包含真实数据的本地项目,同样的情况是,创建了枚举器但未枚举。

有没有办法强制枚举工作集?根据我对可能缺少的内容的描述有什么想法吗?

感谢您的时间和帮助。

4

1 回答 1

1

由于Apple论坛上的这个答案,我设法使它工作:https ://forums.developer.apple.com/thread/100172?q=iOS11%20File%20Provider%20working%20set 。

缺少的是NSFileProviderSyncAnchor工作集。对于我的虚拟数据,同步锚只提供Int64硬编码为 0,并且工作集现在被枚举一次,这对于我的虚拟示例来说已经足够了。

现在为了让它在我的实际数据上工作,每次我对属于工作集的文件进行更改时,我都需要正确地跟踪它,并向工作集发出更改信号。

希望这会对某人有所帮助,因为这不是微不足道的,也不是很好的记录。

于 2018-09-06T09:24:31.890 回答