2015-09-25 4 views
4

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

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

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 его всегда равна нулю.

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

  1. iOS 9 - NSUserActivity userinfo property showing null

  2. http://helpprogramming.xyz/question/31328032/ios-9-nsuseractivity-userinfo-property-showing-null

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

+0

Немногие ответы здесь .. Кажется, мы можем получить только идентификатор в соответствии с яблоками ... https://forums.developer.apple.com/message/ 56576 # 56576 – Rajesh

ответ

1

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

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

Информационный на резьбе ниже помог мне:

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

0

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

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

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

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

Примечание: Не указателю CSSearchableItem и вызвать userActivity.becomeCurrent как, в противном случае вы получили два результата внимания. Один из них - com.apple.corespotlightitem, другой - это ваша таможня activityType

Смежные вопросы