【问题标题】:NSUserActivity vs. Core Spotlight deep linkNSUserActivity 与 Core Spotlight 深层链接
【发布时间】:2018-12-31 12:21:09
【问题描述】:

我同时使用 NSUserActivity 和 Core Spotlight 来索引我的应用中的内容。 我使用 Core Spotlight 的原因是因为我想在用户访问(打开)它之前索引这个内容。

我面临的问题是在 AppDelegate 方法中: func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool

基本上userActivity ONLY 在我的 viewController 中执行此操作时包含正确的信息:

userActivity = myUserActivity

但如果我这样做,它就不起作用:

CSSearchableIndex.default().indexSearchableItems(searchableItems).

通过使用第二种方法(Core Spotlight),我可以在 Spotlight 搜索中看到我的所有结果,但是当我点击该项目时,我在 AppDelegate 方法中没有任何信息。

最糟糕的是:

po userActivity.activityType "com.apple.corespotlightitem"

如果我打印activityType,而不是我自己的,我会得到这个......

有什么建议吗?

【问题讨论】:

  • 从您的问题中不清楚,您希望看到什么。无论如何,在调用 indexSearchableItems 时,如果您将 searchableItem.identifier 设置为某个唯一值,您可以稍后从 userActivity.userInfo?["kCSSearchableItemActivityIdentifier"] 中检索此值。 “com.apple.corespotlightitem”的活动类型正确且符合预期。

标签: ios swift xcode corespotlight nsuseractivity


【解决方案1】:

当您的应用从 CoreSpotlight 结果启动时,您会收到 CSSearchableItemActionType。

您需要通过检索 CSSearchableItemActivityIdentifier 来处理此类操作 - 此值将与您在将可搜索项目提交到索引时提供的标识符相匹配。

类似:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    if userActivity.activityType == CSSearchableItemActionType {
        guard let selectedItem = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String else {
            return
        }
        // Do something with selectedItem
    }
}

【讨论】:

  • 天哪,那座末日金字塔。使用逗号运算符、可选链接和Optional.map/Optional.flatMap!
  • 就是这样!我没有正确理解它,并且平等地对待 Core Spotlight 和 userActivity。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2021-08-01
  • 2016-10-14
  • 1970-01-01
  • 2022-12-03
  • 2018-05-01
相关资源
最近更新 更多