Поставщик файлов iOS 11 - рабочий набор никогда не перечисляется
В настоящее время я работаю над расширением поставщика файлов iOS 11, чтобы перечислять файлы, удаленно хранящиеся в нашем сервисе. До сих пор я был в состоянии просмотреть мою кэшированную базу данных файлов, а также перечисления моего элемента в облаке.
Следующим моим шагом будет создание рабочего набора, но пока я не добился успеха в том, что система перечислила мой перечислитель рабочего набора. Перечислитель создается, но никогда не перечисляется, перечисляет ли он элементы или изменения.
Я работаю с локальной базой данных для своих предметов, отслеживаю lastUsedDate
, tagData
и favoriteRank
, Они еще не синхронизируются между устройствами, но это не должно мешать локальному устройству отображать эти элементы. Каждый раз, когда мое хост-приложение отображает файл, оно устанавливает его 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!")
}
}
Ничто действительно не нравится здесь. Здесь для примера он инициализирован фиктивными данными, но я также пытался использовать данные в реальном времени и ту же проблему.
Функция, запрашивающая перечислитель, реализована следующим образом: переопределить перечислитель func (для 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
}
}
Просто некоторые фиктивные данные, которые должны отображать мой элемент, по крайней мере, на последней вкладке.
Как описано ранее, я также пытался сделать это с моими локальными элементами, которые содержат реальные данные, и то же самое происходит, перечислитель создается, но не перечисляется.
Есть ли способ форсировать перечисление рабочего множества? Любая идея основана на моем описании того, что может отсутствовать?
Спасибо за ваше время и помощь.
1 ответ
Мне удалось заставить его работать, благодаря этому ответу на форуме Apple: https://forums.developer.apple.com/thread/100172?q=iOS11%20File%20Provider%20working%20set.
Чего не хватало, так это NSFileProviderSyncAnchor
для рабочего набора. Для моих фиктивных данных привязка синхронизации обеспечивает только Int64
жестко закодировано в 0, и рабочий набор теперь перечисляется один раз, что достаточно для моего фиктивного примера.
Теперь, чтобы заставить его работать с моими фактическими данными, мне нужно будет правильно отслеживать его каждый раз, когда я делаю изменения в файлах, принадлежащих рабочему набору, и сигнализирую об изменениях в рабочем наборе ".
Надеюсь, что это кому-то поможет, так как это не тривиально и не очень хорошо задокументировано.