Как индексировать и деиндексировать NSUserActivities из Spotlight

Я пытаюсь разобраться с NSUserActivitys и не совсем уверен, как правильно их использовать. Я правильно настроил свою NSUserActivity следующим образом:

let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
attributeSet.title = "Title"
attributeSet.contentDescription = "Description"    

let activity = NSUserActivity(activityType: ActivityType.activity.rawValue)
activity.persistentIdentifier = ActivityIdentifier.activity.rawValue
activity.title = "Title"
activity.requiredUserInfoKeys = ["Key"]
activity.userInfo = ["Key": data]
activity.isEligibleForSearch = true
activity.contentAttributeSet = attributeSet

self.userActivity = activity
self.userActivity!.becomeCurrent()

Теперь активность индексируется с помощью метода becomeCurrent(). Когда я нажимаю на действие в Spotlight, все работает нормально, и действие можно восстановить с помощью свойства userInfo.

Но как удалить действие из Spotlight после его использования (восстановления)? В этом сообщении пользователь рекомендует использовать либо deleteAllSavedUserActivities(completionHandler:), который работает но я не могу использовать, так как не хочу удалять все действия или deleteSavedUserActivities(withPersistentIdentifiers:completionHandler:), которые не работают. Для первого метода в документации указано следующее, однако второй метод не применяется:

Удаляет все действия пользователя, сохраненные Core Spotlight...

Вместо этого я мог бы индексировать действия с помощью Core Spotlight API следующим образом:

let item = CSSearchableItem(uniqueIdentifier: ActivityIdentifier.activity.rawValue, domainIdentifier: "DomainID", attributeSet: attributeSet)
CSSearchableIndex.default().indexSearchableItems([item]) { error in
    if error != nil {
        print(error!)
    } else {
        print("successfully indexed item")
    }
}

и удалите их методом deleteSearchableItems(withIdentifiers:completionHandler:). Проблема в том, что я должен установить relatedUniqueIdentifier моего attributeSet, а затем userInfo будет пустым, как только я попытаюсь восстановить активность (относительно публикации).

Итак, что мне делать, следует ли мне использовать как Core Spotlight, так и NSUserActivity и использовать CSSearchableItemAttributeSet для сохранения данных вместо использования userInfo (зачем Apple к этому? Зачем тогда им добавлять userInfo?) или я должен индексировать свою активность без Core Spotlight, но как в этом случае удалить активность из Spotlight?


person Prydwen    schedule 14.10.2019    source источник


Ответы (1)


Я понял только одну вещь: в документация Apple для свойство domainIdentifier CSSearchableAttributeSet звучит так, как будто вы должны использовать это свойство для удаления NSUserActivity

Укажите идентификатор домена, чтобы сгруппировать элементы и упростить удаление групп элементов из индекса. Например, чтобы удалить действие пользователя, вы можете установить это свойство в свойстве contentAttributeSet объекта NSUserActivity, а затем вызвать deleteSearchableItems(withDomainIdentifiers:completionHandler:) в методе default().

person Prydwen    schedule 23.10.2019