导言

现代移动用户期望能够即时获取信息。 将系统QQ级别搜索整合到您的iOS应用中会大大减少摩擦, 让用户可以在不打开您的应用软件的情况下找到内容。 [[FLT: 0]] Core Spotlight API [[[FLT: 1]] 是苹果公司为将应用内容索引到设备全球Spotlight搜索而构建的框架。 当用户从主屏幕或搜索视图中搜索时, 您的应用索引项目会同时出现 Mail, Messages, 和其他系统应用的结果。 文章提供了一份全面的、可制作的指南, 用于执行核心Spotlight, 涵盖从基本索引到深链接和性能调试的所有内容。

了解核心焦点及其惠益

核心焦点是一个轻量级的、方便隐私的索引系统。它完全生活在“device”上 — 除非您明确使用“CloudKit” ,否则任何数据都不会离开用户的电话。这使得个人内容,如笔记、联系人、文档或任何用户产生的数据,都非常理想。主要的好处包括:

  • 增加的约定 – 用户发现可能忘记的内容,推动重复使用.
  • 无缝导航[] – 调试搜索结果可以直接打开您的应用到相关的屏幕.
  • offline capalic – 即使没有互联网连接,索引项目仍然可以搜索.
  • Low执行成本 – API规模小,文件记载齐全,容易与现有数据模型融合.

核心焦点线与NSUserActivity[索引同时工作,但对于静态或经常更新的内容,直接CSSearchable项目索引会给予你更精细的控制.

先决条件和设置

在写入代码之前, 请确保您的工程配置正确 :

  1. 您的应用程序必须瞄准 iOS 9 或以后 (与iOS 9 一同启动的API).
  2. 启用 [[FLT: 0]] Xcode 中的 Core Spotlight [[FLT: 1] 能力 – 在 [[FLT: 2] 下签名 & amp; 能力 添加“ Core Spotlight” 权限。 导入框架时通常会自动包含此功能 。
  3. 导入核心焦点框架和移动核心服务(用于类型标识符):和]。

不需要额外的服务器配置或用户权限。 背景索引同步进行 。

创建和索引可搜索的项目

Core Spotlight的核心是对象。每个项目由:

  • A 独有的标识符(例如] – 后用于处理选择或更新.
  • 备选 域标识 – 分组相关项目(例如]])。
  • a 属性集(]]] –描述具有属性的内容有:,,,等,等等.

以下是一个完整的Swift示例,该示例将一个音符索引:

import CoreSpotlight
import MobileCoreServices

func indexNote(note: Note) {
 let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)
 attributeSet.title = note.title
 attributeSet.contentDescription = note.body
 attributeSet.keywords = [note.title] + note.tags
 if let imageData = note.thumbnail?.pngData() {
 attributeSet.thumbnailData = imageData
 }

 let item = CSSearchableItem(
 uniqueIdentifier: "com.yourapp.note.\(note.id)",
 domainIdentifier: "com.yourapp.notes",
 attributeSet: attributeSet
 )
 // Optionally set expiration date (default is one month)
 // item.expirationDate = Date.distantFuture

 CSSearchableIndex.default().indexSearchableItems([item]) { error in
 if let error = error {
 print("Indexing error: \(error.localizedDescription)")
 } else {
 print("Note indexed successfully.")
 }
 }
}

属性集属性

软件继承],并提供数十种财产。

  • – 突出出现的简短、描述性案文。
  • ] – 标题下显示一个较长的片段.
  • – 的组合,用于替代搜索术语.
  • 或] –视觉预览.
  • ] – 将项目连接在一起(例如,父子关系笔记).

对于媒体内容,使用类型 特定属性,如 、 或 ]。

更新和删除索引内容

当您的应用程序的内容发生变化时, 您必须同步索引。 使用相同的 [[FLT: 23] ] 方法 :

更新项目

调用 ,使用相同的独有标识符 – API自动替换旧条目.

删除项目

使用或]删除陈旧内容:

CSSearchableIndex.default().deleteSearchableItems(withIdentifiers: ["com.yourapp.note.123"]) { error in
 // handle
}

批量操作是高效的: 将数组传递给 [FLT: 28] 或 [[FLT: 29]]]。 对于一个完整的重置, 请使用 [[FLT: 30] (非常需要) 。

处理用户活动和深链接

当用户点击 Spotlight 结果时, 您的应用程序会通过 ] 的续写收到一个呼叫。 在您的 或 ] 中执行以下代表方法 :

func application(_ application: UIApplication,
 continue userActivity: NSUserActivity,
 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

 if userActivity.activityType == CSSearchableItemActionType {
 if let userInfo = userActivity.userInfo,
 let identifier = userInfo[CSSearchableItemActivityIdentifier] as? String {
 // Navigate to the item with this identifier
 navigateToContent(identifier: identifier)
 return true
 }
 }
 return false
}

恢复国家

对于更平滑的经验, 也执行 [[FLT: 35]] 以显示装入状态。 在 scene based apps (iOS 13+) 中, 使用 [[FLT: 36] ] 方法 [[FLT: 37] ]。

与NSUSER活动深度链接

核心焦点灯还和机制工作。如果您已经通过 索引活动,可以添加 旗帜。但是,对于标题和描述的精细控制,请直接使用。

有效编制索引的最佳做法

遵循这些准则,确保您索引的内容仍然具有相关性和绩效:

1. 仅具有意义的内容索引

不要将每一个小数据都索引。 专注于项目用户可能会搜索:最近的文件、高值的页面或书签内容。

2. 确定适当的过期日期

默认情况下, 各个项目在一个月后过期。 对于静态内容, 设置 [[FLT: 42]]。 对于时间敏感数据( 如事件提醒) , 请使用一个现实的日期 。

3. 明智地使用域标识符

域标识符允许您同时删除一组中的所有项目。例如,如果用户删除文件夹,请拨打 。

4. 提供有意义的关键词

包含同义词、 常见的拼写和替代名称。 避免过度拼写; 5–10 井选择关键词足够了 。

5. 避免重复索引内容

如果项目重复(例如不同域中相同的标题),用户会看到混淆的结果. Deduducle in the apple.

6. 批量操作,用于批量更新

当同步许多项目(例如云恢复后)时, 将它们分批为50–100的阵列, 以避免阻断主线程。 使用一个阵列, 而不是多个单调 。

性能和电池考虑

核心焦点运行一个低优先级背景过程。但执行不力可能会消耗电池或降低系统性能:

  • Limit reindex 频率 –只有在数据实际变化时才重新index,而不是每次应用启动时.
  • 热力大操作[ –使用]和](可在 上查阅)进行原子更新.
  • Avoid重图像 — ]] 应该是小的(如64×64点,JPEG压缩). 大图像会增加内存压力.
  • 使用默认索引 —]几乎足以满足所有应用程序的需要。 很少需要创建自定义索引 。

苹果公司的Core Spotlight文档强调索引应作为“火与忘”处理 — — 不同步等待主线上的完成回调。

测试核心焦点集成

调试焦点点效果可能很棘手, 因为它们并不总是立即出现。 遵循这个测试策略 :

  1. 模拟测试 – 使用iOS模拟器(iOS 15或以后). 索引后,等待几秒钟,然后拉下主屏幕进行搜索。请注意模拟器中的结果可能需要更长的时间。
  2. Device test — — 总是在物理设备上进行测试。 Spotlight 索引在真实硬件上表现得更积极。
  3. 重置索引 – 使用设置应用程序: 常规 – 焦点搜索 – 切换您的应用程序。 这样可以清除索引,并强制重新启动 。
  4. 验证删除 – 删除一个项目后,确保旧结果不再出现。有时系统缓存结果;给予最多30秒。
  5. 检查调试控制台 –通过通过通过]在Xcode的计数符中进行记录而启用 ].

一个有用的资源是WWDC 2015“引入核心焦点”,它涵盖了今天仍然适用的基本概念。

结论

核心焦点API是一个强大的、未充分利用的工具,可以改变用户与您的应用程序互动的方式。您通过在系统搜索索引中添加相关、最新的内容,提供了从搜索到内容的无摩擦路径 — — 增强接触和保留。 启动小:先将您最重要的内容索引,彻底测试,然后扩展以覆盖次要项目。 请记住保持您的索引清洁,始终使用独特的标识符,并优雅地处理用户活动的回调。您准备通过本文中概述的步骤,提供首个感觉本地化到iOS的经典搜索体验。

欲进一步阅读,请查阅官方 核心焦点框架参考App搜索编程指南.