NSUserActivity未被Spotlight

时间:2016-01-31 00:37:15

标签: ios ios9 spotlight nsuseractivity ios-searchapi

我正试图让我的NSUserActivity被iOS中Spotlight中的私有索引编入索引。我已经按照Apple's Index Activities and Navigation Points指南中的所有步骤进行了操作,但我的活动似乎根本没有被聚光灯索引。

指南说:

  

为了保证活动及其元数据被编入索引,您必须这样做   保持对活动的强烈引用,直到它被添加到   指数。有两种方法可以做到这一点:第一种方法是分配   对创建的控制器对象中的属性的活动   活动。第二种方法是使用的userActivity属性   UIResponder对象。

我选择了第一个选项(在我的视图控制器中创建一个属性来保存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()
    }
}

此方法在没有问题的情况下被调用,但活动无法搜索:我尝试使用分配给它的titlekeywords在Spotlight中进行搜索。活动永远不会出现。

我尝试了很多解决方案,包括:

  • 在创建活动后直接移动eligibleForSearch来电。 Apple的指南没有直接说明这一点,但提供的链接中的代码片段似乎暗示将此行设置为true会自动将活动添加到索引中。

  • Apple没有说应该调用becomeCurrent(),而是会为你调用它(怎么样?不知道)。无论你能看到什么,我都试着自己打电话。在将其分配给我的财产后,我也尝试过调用它。没有骰子。 Apple确实称,在becomeCurrent()作为eligibleForSearch的活动上调用true时,它会被添加到索引中。

  • 我甚至直接使用视图控制器的userActivity属性来创建和配置活动。因为我正在使用提供的属性,所以不应该提前解除分配。

据我所知,我正在做他们指南中Apple所做的一切。我完全迷失了。

我正在测试iPhone 6S +,因此可以使用Spotlight索引。控制台也不会打印与Spotlight相关的任何内容。

更新

我只是将活动的代理人设置为self并实施了userActivityWillSave方法。

根据NSUserActivityDelegate documentation,约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")
}

1 个答案:

答案 0 :(得分:6)

设置属性集中的relatedUniqueIdentifier会导致userInfo字典被丢弃。

我评论了这一行:

attributeSet.relatedUniqueIdentifier = ShortcutType.LastSearched.rawValue

它现在按预期工作。虽然我需要找到另一种方法从索引中删除我的用户活动。

更新:更多信息

如果您必须为您的活动使用唯一标识符,则需要先使用Core Spotlight将其编入索引,然后将NSUserActivity本身编入索引。如果您首先尝试使用relatedUniqueIdentifier而不在Spotlight中使用NSUserActivity,则不会将Command + B编入索引。这就是我的问题。

来自relatedUniqueIdentifier property documentation in the CSSearchableItemAttributeSet Class Reference

  

如果您同时使用NSUserActivity和Core Spotlight API进行索引   在同一项目中,在活动中设置此属性以指定唯一   活动所针对的Core Spotlight项的标识符   相关,并避免在Spotlight中显示重复的结果。

     

如果与活动相关的唯一标识符没有   已经使用Core Spotlight索引,活动将不会   索引。