我正在使用CoreSpotlight api和NSUserActivity
api的组合来索引应用内容。一切顺利,直到我点击搜索结果。在continueUserActivity方法中使用userActivity传递的userInfo只包含一个项目,即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!")
}
}
}
}
每当我尝试访问userInfo中的indexItemType或地址键时,它总是为空。
我已尝试过这些主题的所有解决方案:
http://helpprogramming.xyz/question/31328032/ios-9-nsuseractivity-userinfo-property-showing-null
以上都没有解决我的问题。 我目前正在使用Xcode 7和iOS 9。
答案 0 :(得分:1)
如果您使用CSSearchableIndex,那么您将只在userInfo中收到kCSSearchableItemActivityIdentifier。要在userInfo中设置和检索自定义属性,只应将userActivity设置为becomeCurrent。
请求您调用CSSearchableIndex并查看它是否有效(您还应该确保您的nsuseractivity对象是您的视图/模型的强属性,因为它可以在它有机会保存userInfo之前取消分配)。
以下帖子中的信息帮助了我:
答案 1 :(得分:1)
我在这里有同样的问题,我搜索了很多不适合我的答案...... 幸运的是,我在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
设置为包含自定义userInfo的JSON字符串。
注意:不要索引CSSearchableItem并同时调用userActivity.becomeCurrent
,否则您将获得两个聚光灯结果。其中一个是com.apple.corespotlightitem
,另一个是您的自定义activityType