我试图让我的 NSUserActivity 被 iOS 中 Spotlight 中的私有索引索引。我已按照Apple 的索引活动和导航点指南中的所有步骤操作,但我的活动似乎根本没有被聚光灯索引。
该指南说:
为了保证活动及其元数据被索引,您必须持有对该活动的强引用,直到它被添加到索引中。有两种方法可以做到这一点: 第一种方法是将活动分配给创建活动的控制器对象中的属性。第二种方法是使用 UIResponder 对象的 userActivity 属性。
我选择了第一个选项(在我的视图控制器中创建一个属性来保存 NSUserActivity)。
var lastSearchedUserActivity: NSUserActivity?
这个想法是,当用户搜索某些东西时,他的最后一个查询会在设备上被索引。我有以下方法可以准备用户活动并(据说)对其进行索引:
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()
}
}
调用此方法没有问题,但该活动不可搜索:我已尝试使用title
分配给它的 Spotlight 进行搜索,而keywords
. 该活动从未出现。
我尝试了很多解决方案,包括:
创建活动后直接移动
eligibleForSearch
呼叫。Apple 的指南没有直接说明这一点,但提供的链接中的代码片段似乎暗示将这一行设置为true
应该自动将活动添加到索引中。苹果并没有说
becomeCurrent()
应该调用它,而是说它会为你调用(如何?不知道)。不管你看到什么,我都试着自己打电话。在将其分配给我的财产后,我也尝试调用它。没有骰子。苹果确实说过,当调用becomeCurrent()
具有eligibleForSearch
as的活动时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")
}