iOS 11 文件提供程序 - 永远不会枚举工作集

标签 ios ios11 fileprovider-extension

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

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

我为我的项目使用本地数据库,跟踪 lastUsedDatetagDatafavoriteRank。它们尚未跨设备同步,但这不应阻止本地设备显示这些项目。 每次我的主机应用程序显示文件时,它都会设置其 lastUsedDate 并调用 signalEnumerator(for: myItemIdentifier)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) 抛出 -> 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
    }
}

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

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

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

感谢您的宝贵时间和帮助。

最佳答案

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

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

现在要使其适用于我的实际数据,我需要在每次对属于工作集的文件进行更改并向工作集发出更改信号时正确地跟踪它。'

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

关于iOS 11 文件提供程序 - 永远不会枚举工作集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52166719/

相关文章:

objective-c - iPad 将图像显示得很大 - 但不应该

ios - 在 iOS 13 中,当用户在应用切换器中向上滑动我的应用时,我会收到哪些事件?

cookies - iOS 11 Cookie更改-寻求技术说明

ios - FileProviderExtension workingSet 枚举器未调用

ios - 禁止在 UIDocumentBrowserViewController 中导出或共享文档

ios - 在 iOS 中导入文件 : UIDocumentPicker vs UIDocumentBrowser

ios - 以编程方式进行 VOIP 通话期间的扬声器/普通麦克风 iOS 10 swift

iphone - viewDidUnload ,viewWillDisappear 未在 tabBarContoller 中调用

ios - 滚动时缩小大标题(不是 UITableViewController)iOS 11

xcode - 有没有办法为 Xcode 获取 iOS 11 的开发人员磁盘镜像?