我执行文件提供扩展的iOS 11.文件提供iOS11 startProvidingItem不调用
Dispite在https://developer.apple.com/videos/play/wwdc2017/243/收看了会议并通过苹果的文档浏览,我似乎仍不能了解如何实现一些NSFileProviderExtension和NSFileProviderEnumerator对象的方法。
我成功实现了NSFileProviderItem,并将它们全部列在Navite iOS 11文件应用程序中。但是,在选择文件后,我无法触发任何基于文档的应用程序。
我重写了NSFileProviderExtension的所有方法。有些仍然是空的,但我放置了一个断点来检查它们何时被调用。
的NSFileProviderExtension看起来是这样的:
class FileProviderExtension: NSFileProviderExtension {
var db : [FileProviderItem] = [] //Used "as" a database
...
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
for i in db {
if i.itemIdentifier.rawValue == identifier.rawValue {
return i
}
}
throw NSError(domain: NSCocoaErrorDomain, code: NSNotFound, userInfo:[:])
}
override func urlForItem(withPersistentIdentifier identifier: NSFileProviderItemIdentifier) -> URL? {
guard let item = try? item(for: identifier) else {
return nil
}
// in this implementation, all paths are structured as <base storage directory>/<item identifier>/<item file name>
let manager = NSFileProviderManager.default
let perItemDirectory = manager.documentStorageURL.appendingPathComponent(identifier.rawValue, isDirectory: true)
return perItemDirectory.appendingPathComponent(item.filename, isDirectory:false)
}
// MARK: - Enumeration
func enumerator(for containerItemIdentifier: NSFileProviderItemIdentifier) throws -> NSFileProviderEnumerator {
var maybeEnumerator: NSFileProviderEnumerator? = nil
if (containerItemIdentifier == NSFileProviderItemIdentifier.rootContainer) {
maybeEnumerator = FileProviderEnumerator(enumeratedItemIdentifier: containerItemIdentifier)
self.db = CustomData.getData(pid: containerItemIdentifier)
} else if (containerItemIdentifier == NSFileProviderItemIdentifier.workingSet) {
// TODO: instantiate an enumerator for the working set
} else {
}
guard let enumerator = maybeEnumerator else {
throw NSError(domain: NSCocoaErrorDomain, code: NSFeatureUnsupportedError, userInfo:[:])
}
return enumerator
}
我enumerateItems看起来像这样:
class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
override func enumerateItems(for observer: NSFileProviderEnumerationObserver, startingAt page: NSFileProviderPage) {
let itens = CustomData.getData(pid: enumeratedItemIdentifier)
observer.didEnumerate(itens)
observer.finishEnumerating(upTo: nil)
}
静态函数CustomData.getData用于测试。它返回一个具有所需属性的NSFileProviderItem数组。正如会议中所解释的那样,它应该替换为数据库。
class CustomData {
static func getData(pid : NSFileProviderItemIdentifier) -> [FileProviderItem] {
return [
FileProviderItem(uid: "0", pid: pid, name: "garden", remoteUrl : "https://img2.10bestmedia.com/Images/Photos/338373/GettyImages-516844708_54_990x660.jpg"),
FileProviderItem(uid: "1", pid: pid, name: "car", remoteUrl : "https://static.pexels.com/photos/170811/pexels-photo-170811.jpeg"),
FileProviderItem(uid: "2", pid: pid, name: "cat", remoteUrl : "http://www.petmd.com/sites/default/files/what-does-it-mean-when-cat-wags-tail.jpg"),
FileProviderItem(uid: "3", pid: pid, name: "computer", remoteUrl : "http://mrslamarche.com/wp-content/uploads/2016/08/dell-xps-laptop-620.jpg")
]
}
}
问题是,当用户按下文档时,urlForItem被成功调用,但返回项目url时没有任何反应。
我在做什么错? 我在网上找不到任何例子。
干杯
-nls
请问您可以分享您的代码吗?B'Çoz我正在尝试实施文件提供商扩展程序,但我无法在iOS 11上显示项目文件应用程序 –
因此,您的应用程序将显示在iOS 11文件中,不显示任何内容。这是你的问题吗? – nfls
是不显示iOS 11文件应用程序中的任何内容,我已设置文件提供程序应用程序,并且我的应用程序不是基于文档的应用程序 –