Table of Contents
导言
现代移动用户期望能够即时获取信息。 将系统QQ级别搜索整合到您的iOS应用中会大大减少摩擦, 让用户可以在不打开您的应用软件的情况下找到内容。 [[FLT: 0]] Core Spotlight API [[[FLT: 1]] 是苹果公司为将应用内容索引到设备全球Spotlight搜索而构建的框架。 当用户从主屏幕或搜索视图中搜索时, 您的应用索引项目会同时出现 Mail, Messages, 和其他系统应用的结果。 文章提供了一份全面的、可制作的指南, 用于执行核心Spotlight, 涵盖从基本索引到深链接和性能调试的所有内容。
了解核心焦点及其惠益
核心焦点是一个轻量级的、方便隐私的索引系统。它完全生活在“device”上 — 除非您明确使用“CloudKit” ,否则任何数据都不会离开用户的电话。这使得个人内容,如笔记、联系人、文档或任何用户产生的数据,都非常理想。主要的好处包括:
- 增加的约定 – 用户发现可能忘记的内容,推动重复使用.
- 无缝导航[] – 调试搜索结果可以直接打开您的应用到相关的屏幕.
- offline capalic – 即使没有互联网连接,索引项目仍然可以搜索.
- Low执行成本 – API规模小,文件记载齐全,容易与现有数据模型融合.
核心焦点线与NSUserActivity[索引同时工作,但对于静态或经常更新的内容,直接CSSearchable项目索引会给予你更精细的控制.
先决条件和设置
在写入代码之前, 请确保您的工程配置正确 :
- 您的应用程序必须瞄准 iOS 9 或以后 (与iOS 9 一同启动的API).
- 启用 [[FLT: 0]] Xcode 中的 Core Spotlight [[FLT: 1] 能力 – 在 [[FLT: 2] 下签名 & amp; 能力 添加“ Core Spotlight” 权限。 导入框架时通常会自动包含此功能 。
- 导入核心焦点框架和移动核心服务(用于类型标识符):和]。
不需要额外的服务器配置或用户权限。 背景索引同步进行 。
创建和索引可搜索的项目
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文档强调索引应作为“火与忘”处理 — — 不同步等待主线上的完成回调。
测试核心焦点集成
调试焦点点效果可能很棘手, 因为它们并不总是立即出现。 遵循这个测试策略 :
- 模拟测试 – 使用iOS模拟器(iOS 15或以后). 索引后,等待几秒钟,然后拉下主屏幕进行搜索。请注意模拟器中的结果可能需要更长的时间。
- Device test — — 总是在物理设备上进行测试。 Spotlight 索引在真实硬件上表现得更积极。
- 重置索引 – 使用设置应用程序: 常规 – 焦点搜索 – 切换您的应用程序。 这样可以清除索引,并强制重新启动 。
- 验证删除 – 删除一个项目后,确保旧结果不再出现。有时系统缓存结果;给予最多30秒。
- 检查调试控制台 –通过通过通过]在Xcode的计数符中进行记录而启用 ].
一个有用的资源是WWDC 2015“引入核心焦点”,它涵盖了今天仍然适用的基本概念。
结论
核心焦点API是一个强大的、未充分利用的工具,可以改变用户与您的应用程序互动的方式。您通过在系统搜索索引中添加相关、最新的内容,提供了从搜索到内容的无摩擦路径 — — 增强接触和保留。 启动小:先将您最重要的内容索引,彻底测试,然后扩展以覆盖次要项目。 请记住保持您的索引清洁,始终使用独特的标识符,并优雅地处理用户活动的回调。您准备通过本文中概述的步骤,提供首个感觉本地化到iOS的经典搜索体验。