And*_*nez 5 spotlight ios ios9 ios-searchapi nsuseractivity
我试图让我的NSUserActivity被iOS中Spotlight中的私有索引编入索引.我已经按照Apple的索引活动和导航点指南中的所有步骤进行了操作,但我的活动似乎根本没有被聚光灯索引.
指南说:
为了保证活动及其元数据被编入索引,您必须拥有对活动的强引用,直到将其添加到索引中.有两种方法可以执行此操作:第一种方法是将活动分配给创建活动的控制器对象中的属性.第二种方法是使用UIResponder对象的userActivity属性.
我选择了第一个选项(在我的视图控制器中创建一个属性来保存NSUserActivity).
var lastSearchedUserActivity: NSUserActivity?
Run Code Online (Sandbox Code Playgroud)
这个想法是,当用户搜索某些内容时,他的最后一个查询将在设备上编入索引.我有以下方法准备用户活动和(据称)索引它:
func prepareLastSearchedUserActivity(tags: [String], server: Server) {
if Settings.applicationIndexedUserActivitiesAsShortcutTypes.contains(.LastSearched) {
print("Get ready to index. and tags \(tags.reduce("") { "\($0) \($1)" })")
let activity = NSUserActivity(activityType: ShortcutType.LastSearched.rawValue)
activity.title = server.serverName
activity.userInfo = ["tags": tags, "server name": server.serverName]
let attributeSet = CSSearchableItemAttributeSet()
attributeSet.contentDescription = tags.reduce("") { "\($0) \($1)" }
attributeSet.relatedUniqueIdentifier = ShortcutType.LastSearched.rawValue
activity.contentAttributeSet = attributeSet
activity.keywords = Set(tags)
activity.eligibleForSearch = true
activity.eligibleForHandoff = false
activity.becomeCurrent()
self.lastSearchedUserActivity = activity
//self.lastSearchedUserActivity?.becomeCurrent()
}
}
Run Code Online (Sandbox Code Playgroud)
调用此方法时没有问题,但活动无法搜索:我尝试使用title分配给它来搜索Spotlight ,以及keywords.活动永远不会出现.
我尝试了很多解决方案,包括:
eligibleForSearch在创建活动后直接移动呼叫.Apple的指南没有直接说明这一点,但是提供的链接中的代码片段似乎暗示将此行设置为true应该自动将索引添加到索引中.
Apple并没有说becomeCurrent()应该调用它,而是会为你调用它(怎么样?不知道).无论你能看到什么,我都试着自己打电话.在将其分配给我的财产后,我也尝试过调用它.没有骰子.Apple确实说当调用becomeCurrent()具有eligibleForSearchas 的活动时,true它将被添加到索引中.
我甚至userActivity直接使用视图控制器的属性来创建和配置活动.因为我正在使用提供的属性,所以它不应该尽早解除分配.
据我所知,我正在做他们指南中Apple所做的一切.我完全迷失了.
我在iPhone 6S +上进行测试,因此可以使用Spotlight索引.控制台也不会打印与Spotlight相关的任何内容.
我只是将活动的委托设置为self并实现了该userActivityWillSave方法.
根据NSUserActivityDelegate文档,关于userActivityWillSave:
通知代理将保存用户活动以继续或保留.
因此调用此委托方法,但索引项无处可寻.这是更新的代码:
func prepareLastSearchedUserActivity(tags: [String], server: Server) {
if Settings.applicationIndexedUserActivitiesAsShortcutTypes.contains(.LastSearched) {
print("Get ready to index. and tags \(tags.reduce("") { "\($0) \($1)" })")
let activity = NSUserActivity(activityType: ShortcutType.LastSearched.rawValue)
activity.title = server.serverName
activity.userInfo = ["tags": tags, "server name": server.serverName]
activity.delegate = self
let attributeSet = CSSearchableItemAttributeSet()
attributeSet.contentDescription = tags.reduce("") { "\($0) \($1)" }
attributeSet.relatedUniqueIdentifier = ShortcutType.LastSearched.rawValue
activity.contentAttributeSet = attributeSet
activity.keywords = Set(tags)
activity.eligibleForSearch = true
activity.eligibleForHandoff = false
self.lastSearchedUserActivity = activity
activity.becomeCurrent()
//self.lastSearchedUserActivity?.becomeCurrent()
}
}
func userActivityWillSave(userActivity: NSUserActivity) {
print("Yep it will save")
}
Run Code Online (Sandbox Code Playgroud)
原来设置relatedUniqueIdentifier属性集导致userInfo字典被丢弃.
我评论了这一行:
attributeSet.relatedUniqueIdentifier = ShortcutType.LastSearched.rawValue
Run Code Online (Sandbox Code Playgroud)
它现在按预期工作.虽然我需要找到另一种方法从索引中删除我的用户活动.
如果您必须为您的活动使用唯一标识符,则需要先使用Core Spotlight将其编入索引,然后为NSUserActivity自己编制索引.如果您首先尝试relatedUniqueIdentifier在Spotlight中使用不使用它,NSUserActivity则不会将其编入索引.这是我的问题.
从类参考中的relatedUniqueIdentifier属性文档CSSearchableItemAttributeSet:
如果您同时使用NSUserActivity和Core Spotlight API索引相同的项目,请在活动中设置此属性以指定与活动相关的Core Spotlight项目的唯一标识符,并避免在Spotlight中显示重复的结果.
如果与活动相关的唯一标识符尚未使用Core Spotlight编制索引,则不会对活动编制索引.
| 归档时间: |
|
| 查看次数: |
812 次 |
| 最近记录: |