Core Spotlight Userinfo всегда пуст

Я использую комбинацию CoreSpotlight api и NSUserActivity api для индексации содержимого приложения. Все идет хорошо, пока я не коснусь результата поиска. Пользовательская информация, переданная с userActivity в методе continueUserActivity, содержит только один элемент i.e kCSSearchableItemActivityIdentifier. Мои другие пользовательские клавиши равны нулю.

Вот мой код для индексирования элементов.

class MyTestViewController:UIViewController{
 viewDidLoad(){
 searchHandler = SearchHandler()
 searchHandler.index(items)
 }
 }
 class SearchHandler{
 var activity: NSUserActivity!
 func index(items:[Item]){
 for item in items{
 let attributeSet = getSearchItemAttribute(item)
 if let attributeSet = attributeSet{
 let searchableItem = CSSearchableItem(uniqueIdentifier: item.uniqueId, domainIdentifier:itemType.groupId(), attributeSet: attributeSet)
 searchableItem.expirationDate = item.expirationDate
 addToSpotlight([searchableItem])
 }
 activity = NSUserActivity(activityType: searchPrivacy.activity())
 activity.delegate = delegate
 //meta data
 activity.title = item.title
 var userInfoDic = [NSObject:AnyObject]()
 userInfoDic["indexItemType"] = itemType.rawValue
 userInfoDic["address"] = item.title
 activity.userInfo = userInfoDic
 if item.expirationDate != nil { activity.expirationDate = item.expirationDate! }
 if item.keywords != nil { activity.keywords = item.keywords! }
 activity.contentAttributeSet = attributeSet
 //eligibility
 activity.eligibleForHandoff = false
 activity.eligibleForSearch = true
 activity.eligibleForPublicIndexing = true
 activity.requiredUserInfoKeys = Set(["indexItemType","address"])
 activity.becomeCurrent()
 }
 }
 private func getSearchItemAttribute(item:Item) ->CSSearchableItemAttributeSet?{
 if item.contentType != nil { // add an entry to core spot light
 let attributeSet = CSSearchableItemAttributeSet(itemContentType: item.contentType!)
 attributeSet.relatedUniqueIdentifier = item.uniqueId
 HALog.i("item.uniqueId= \(item.uniqueId)")
 attributeSet.title = item.title
 attributeSet.thumbnailData = item.thumbnailData
 attributeSet.thumbnailURL = item.thumbnailUrl
 attributeSet.rating = item.ratings
 attributeSet.ratingDescription = item.ratingDescription
 attributeSet.contentDescription = item.contentDescription
 return attributeSet
 }
 return nil
}
private func addToSpotlight(searchableItems:[CSSearchableItem]) {
 CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems) { (error) -> Void in
 if let error = error {
 HALog.e("Deindexing error: \(error.localizedDescription)")
 } else {
 HALog.i("Search item successfully indexed!")
 }
 }
 }
}

Всякий раз, когда я пытаюсь получить доступ к indexItemType или адресным ключам в userInfo, он всегда равен нулю.

Я пробовал все решения из этих потоков:

Ничто из вышеизложенного не разрешило мою проблему. В настоящее время я использую Xcode 7 с iOS 9.

2 ответа

Если вы используете CSSearchableIndex, вы получите только атрибут kCSSearchableItemActivityIdentifier в userInfo. Чтобы установить и получить пользовательские свойства в userInfo, вы должны установить userActivity как currentCurrent.

Завершите свой вызов для CSSearchableIndex и посмотрите, работает ли он (вы также должны убедиться, что ваш объект nsuseractivity является сильным свойством в вашем представлении/модели, поскольку он может быть освобожден до того, как он сможет сохранить userInfo).

Информация о нитке ниже помогла мне:

https://forums.developer.apple.com/thread/9690


У меня была такая же проблема, и я искал столько ответов, не работающих на меня... к счастью, я получил свое решение в ios-9-tutorial-series-search-api

Я рекомендую вам прочитать все содержание выше. Я дам вам два альтернативных решения:

  • используйте NSUserActivity вместо CSSearchableItem: когда вы выполнили настройку данных, вызовите userActivity.becomeCurrent, тогда ваши данные могут быть найдены в центре внимания (всего две вещи: у меня нет устройства iOS 9, так что только протестирован в устройстве IOS 10, и в статье, упомянутой выше, сказано NSUserActivity is limited to one activity per navigation point, но у меня нет такой проблемы...)

  • используйте CSSearchableItem, установите uniqueIdentifier в строку JSON, которая содержит вашу пользовательскую информацию.

ПРИМЕЧАНИЕ. Не индексируйте CSSearchableItem и вызывайте userActivity.becomeCurrent оба, иначе вы получите два результата прожектора. Один из них - com.apple.corespotlightitem, другой - ваш пользовательский activityType

licensed under cc by-sa 3.0 with attribution.