Mac - Spotlight(聚焦)

news/2024/3/28 21:33:00/文章来源:https://blog.csdn.net/lovechris00/article/details/114257660

文章目录

    • 一、Mac 中 Spotlight 的使用
      • 1、调用/打开 Spotlight
      • 2、执行搜索
      • 3、Spotlight 设置
    • 二、Mac 上的 Spotlight 开发
      • 1、关于 Spotlight
      • 2、使用 NSMetadataQuery 搜索示例
    • 三、mds 和 fsevents
    • 四、命令行访问 Spotlight
    • 五、Core Spotlight Framework
    • 六、Spotlight 插件
    • 相关资料


一、Mac 中 Spotlight 的使用

可见官方 《macOS 使用手册》:在 Mac 上使用“聚焦”搜索
https://support.apple.com/zh-cn/guide/mac-help/mchlp1008/mac

本文基于 macOS 11.2


1、调用/打开 Spotlight

一般在菜单栏右上角会有 放大镜图标, 点击图标将在屏幕正中出现搜索窗口,如下:

在这里插入图片描述


如果菜单右上角没有,也可以在 系统偏好设置 – 程序坞与菜单栏 中,勾选设置显示

在这里插入图片描述


2、执行搜索

在输入框中输入内容,就会出现相关搜索结果:
在这里插入图片描述


以下是使用 Alfred(v4.0.5) 的搜索结果
在这里插入图片描述


3、Spotlight 设置

你可以在 系统偏好设置 – 聚焦 中设置搜索结果(搜索结果的文件类型) 和 隐私 (不希望搜索结果展示的文件夹)
在这里插入图片描述


在这里插入图片描述


二、Mac 上的 Spotlight 开发

1、关于 Spotlight

官网对 Spotlight 的介绍如下:

Search for files and other items on the local device, and index your app’s content for searching.

Spotlight 用于搜索本地的文件或其他项目,也可以给你的应用内容添加 index 来搜索。


Spotlight 主要由 Foundation 框架的下面元素实现:

  • Queries

    • NSMetadataQuery
      A query that you perform against Spotlight metadata.
    • NSMetadataQueryDelegate
      An interface that enables the delegate of a metadata query to provide substitute results or attributes.
  • Items

    • NSMetadataItem The metadata associated with a file.

其他相关API

  • HISearchWindow ( Carbon framework.)
  • MDQuery (CoreServices 中的 metadata framework )

Spotlight 的历史和兼容性

  • Spotlight 是在 macOS Tiger(10.4) 时引入的。
  • 在Leopard中,Spotlight已经无缝地整合进了Finder。
  • 从iOS 3.0开始,Spotlight被移植到了iOS。在iOS中,用户用手指滑向主屏幕画面左侧就可以打开类似的窗口。

2、使用 NSMetadataQuery 搜索示例

以下代码简单示例搜索 UTI 为 public.jpeg 类型的文件:


@interface AppDelegate ()@property (nonatomic, strong) NSMetadataQuery *query;@end@implementation AppDelegate- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {// Insert code here to initialize your application[self getSoftwaresFromMetaData];
}- (void)getSoftwaresFromMetaData{self.query = [[NSMetadataQuery alloc] init];self.query.searchScopes = [NSArray arrayWithObject:NSMetadataQueryLocalComputerScope];NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"kMDItemContentType == 'public.jpeg'"];[self.query setPredicate:searchPredicate];[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(mdQueryNote:)name:nilobject:self.query];// 按照文件显示名正序排列NSSortDescriptor *sortKeys = [[NSSortDescriptor alloc] initWithKey:(id)kMDItemPath ascending:YES];[self.query setSortDescriptors:[NSArray arrayWithObject:sortKeys]];[self.query startQuery];
}- (void)mdQueryNote:(NSNotification *)note {NSLog(@"mdQueryNote: %@", [note name]);if ([[note name] isEqualToString:NSMetadataQueryDidFinishGatheringNotification]) {[self.query stopQuery];NSLog(@"resultCount : %ld",self.query.resultCount);NSUInteger i=0;for (i=0; i < [self.query resultCount]; i++) {NSMetadataItem *theResult = [self.query resultAtIndex:i];NSString *path = [theResult valueForAttribute:NSMetadataItemPathKey];NSLog(@"path : %@", path);}[[NSNotificationCenter defaultCenter] removeObserver:selfname:NSMetadataQueryDidFinishGatheringNotificationobject:self.query];self.query=nil;}}

部分打印结果如下

 mdQueryNote: NSMetadataQueryDidStartGatheringNotificationmdQueryNote: NSMetadataQueryGatheringProgressNotificationmdQueryNote: NSMetadataQueryGatheringProgressNotificationmdQueryNote: NSMetadataQueryGatheringProgressNotificationmdQueryNote: NSMetadataQueryGatheringProgressNotificationmdQueryNote: NSMetadataQueryDidFinishGatheringNotificationresultCount : 82980path : /usr/share/doc/cups/images/smiley.jpgpath : 。。。/ipptool/color.jpgpath : /System/Library/Desktop Pictures/Reflection 1.jpgpath : /System/Library/Desktop Pictures/Reflection 2.jpgpath : /System/Library/Desktop Pictures/Reflection 3.jpg...

关于 UTI 可参考文章:https://blog.csdn.net/lovechris00/article/details/113091912?spm=1001.2014.3001.5502
如果想搜索 app 类型文件,将 public.jpeg 替换为 com.apple.application-bundle 即可。


三、mds 和 fsevents

Spotlight 背后的核心力量是一个索引服务器 mds,mds在 MetaData 框架中,而这个框架是 CoreServices.framework 的一部分。


mds 文件路径:
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Support/mds


  • mds是一个没有GUI的后台服务程序。
  • 每当有任何文件操作(创建、修改和删除)发生时,内核都会通知这个后台服务程序。这个通知机制称为 fsevents
  • 当mds收到通知时,mds会通过工作进程 mdworker 将各种元数据信息导入数据库。
  • mdworker进程可以加载一个具体的 Spotlight Importer (Spotlight导入器)从文件中提取元数据信息。

  • 系统提供的导入器位于/System/Library/Spotlight目录;
    用户提供的导入器位于/Library/Spotlight目录。
  • 和QuickLook类似,这些导入器都是实现了固定API的插件(在Xcode中选择MetaData Importer项目模板时可以创建出API框架)。

系统Spotlight


用户Spotlight


四、命令行访问 Spotlight

在命令行可以通过以下命令访问Spotlight:

  • mdutil:管理元数据数据库
  • mdfind:发出spotlight查询
  • mdimport:配置和测试spotlight插件
  • mdls:列出文件的元数据属性
  • mdcheckschema:验证元数据的布局(译者注:这个工具在10.8中移除了)
  • mddiagnose:Lion引入的新功能,这个工具能对spotlight子系统(mds和mdworker)以及系统上的附加数据进行完整的诊断。

另外一个文档稀少的特性是通过在一些路径创建特定的文件控制Spotlight(即mds)的行为。
例如,在一个目录中创建一个.metadata_never_index隐藏文件可以防止这个目录被索引(最初是为可移动媒体设计的)。


使用示例

$ mdfind -name "a.png"  # 根据文件名查找$ mdfind "kMDItemContentType = 'public.jpeg'"  # 根据 uti 查找

五、Core Spotlight Framework

根据官网对于 Core Spotlight 框架的描述:

Index your app so users can search the content from Spotlight and Safari.

主要是用于 给你的应用中的内容添加索引,来让 Spotlight 和 Safari 更好的调用。

使用可参考:https://blog.csdn.net/mengxiangyue/article/details/46585159


六、Spotlight 插件

  • 让 Mac 上的 Spotlight 更强大:Flashlight 拓展插件
    https://sspai.com/post/27734
  • Spotlight 插件 SpotlightFinder(开源)
    https://github.com/jcavar/SpotlightFinder

相关资料

  • 《macOS 使用手册》:在 Mac 上使用“聚焦”搜索
    https://support.apple.com/zh-cn/guide/mac-help/mchlp1008/mac
  • Spotlight
    https://developer.apple.com/documentation/foundation/spotlight?language=objc
  • Framework:Core Spotlight
    https://developer.apple.com/documentation/corespotlight?language=objc
  • Human Interface Guidelines:Search and Spotlight
    https://developer.apple.com/design/human-interface-guidelines/macos/system-capabilities/search-and-spotlight/

伊织 2021-03-01

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72300.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS预处理器sass和less

文章目录CSS预处理器什么是CSS预处理器Sass和LESS背景介绍Sass背景介绍LESS的背景介绍Sass安装Sass下载Ruby安装文件安装Ruby安装Sass编译Sass命令行编译命令行编译配置选项四种编译排版演示nested 编译排版格式expanded 编译排版格式compact 编译排版格式compressed 编译排版格…

登录逻辑漏洞整理集合

目录一、任意用户注册1.未验证邮箱/手机号2、不安全验证邮箱/手机号3.批量注册4.个人信息伪造5.前端验证审核绕过6.用户名覆盖二、任意用户登录1、万能密码2、验证码、密码回显3、登录检测不安全三、任意账号重置1、重置账号名2、验证码3、MVC数据对象自动绑定4、Unicode字符处…

独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐

如果有关注我的 Twitter 的朋友应该看到了&#xff0c;我上周末研究了两天 AI 画图&#xff0c;现在用 Ai 做图太强了&#xff0c;上周又升级 Stable Diffusion 玩了一下&#xff0c;和我去年试的时候相比强大了好多&#xff0c;而且插件LoRA模型玩法都还在快速迭代&#xff0c…

强化学习DQN之俄罗斯方块

强化学习DQN之俄罗斯方块强化学习DQN之俄罗斯方块算法流程文件目录结构模型结构游戏环境训练代码测试代码结果展示强化学习DQN之俄罗斯方块 算法流程 本项目目的是训练一个基于深度强化学习的俄罗斯方块。具体来说&#xff0c;这个代码通过以下步骤实现训练&#xff1a; 首先…

车机开发【Android SystemUI 架构音量控制详解】

SystemUI介绍 SystemUI摘要 在Android系统中SystemUI是以应用的形式运行在Android系统当中&#xff0c;即编译SystemUI模块会生产APK文件&#xff0c;源代码路径在frameworks/base/packages/SystemUI/&#xff0c;安装路径system/priv-app/-SystemUI。 什么是SystemUI 在前…

使用带有 Moveit 的深度相机来避免碰撞

文章目录 什么是深度相机?如何将 Kinect 深度相机添加到您的环境中在 Rviz 中可视化深度相机数据在取放场景中使用深度相机将深度相机与您的 Moveit 设置一起使用有很多优势。机器人可以避免未知环境中的碰撞,甚至可以对周围的变化做出反应。然而,将深度相机连接到您的设置并…

FlinkSQL行级权限解决方案及源码

FlinkSQL的行级权限解决方案及源码&#xff0c;支持面向用户级别的行级数据访问控制&#xff0c;即特定用户只能访问授权过的行&#xff0c;隐藏未授权的行数据。此方案是实时领域Flink的解决方案&#xff0c;类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…

数据分片(mycat)

1. 数据分片概念&#xff1a; 1.1. 分库分表 什么是分库分表&#xff1a; 将存放在一台数据库服务器中的数据&#xff0c;按照特定方式&#xff08;指的是程序开发的算法&#xff09;进行拆分&#xff0c;分散存放到多台数据库服务器中&#xff0c;以达到分散单台服务器负载的…

第51篇-某彩网登录参数分析-webpack【2023-02-21】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析一、前言 今天我们看一个webpack的网站 aHR0cHM6Ly8xMGNhaTUwMC5jYy9sb2dpbg==二、网站分析 首先…

网络协议(一)应用层(自定制协议、HTTP协议)

目录 应用层&#xff1a;负责应用程序之间的数据沟通 一、自定制协议&#xff08;私有协议&#xff09; 二、HTTP协议 1&#xff09;、请求行解析&#xff1a;GET /index.html HTTP/1.1 第一部分&#xff1a;请求方法&#xff1a;多种多样&#xff0c;描述不同的请求目的 …

大数据知识图谱项目——基于知识图谱的医疗知识问答系统(详细讲解及源码)

基于知识图谱的医疗知识问答系统 一、项目概述 本项目基于医疗方面知识的问答&#xff0c;通过搭建一个医疗领域知识图谱&#xff0c;并以该知识图谱完成自动问答与分析服务。本项目以neo4j作为存储&#xff0c;基于传统规则的方式完成了知识问答&#xff0c;并最终以关键词执…

Verilog 学习第五节(串口发送部分)

小梅哥串口部分学习part1 串口通信发送原理串口通信发送的Verilog设计与调试串口发送应用之发送数据串口发送应用之采用状态机实现多字节数据发送串口通信发送原理 1&#xff1a;串口通信模块设计的目的是用来发送数据的&#xff0c;因此需要有一个数据输入端口 2&#xff1a;…

Qt中修改界面类的类名时需要注意的几个修改点

有些时候因为一些原因&#xff0c;需要修改Qt中创建的界面类&#xff0c;需要特别注意几个修改点。 比如将test类修改为test2类 修改test.h名称为test2.h文件&#xff1b;修改test.cpp名称为test2.cpp文件&#xff1b;修改test.ui名称为test2.ui文件&#xff1b;修改pro文件中…

多层感知机的区间随机初始化方法

摘要&#xff1a; 训练是构建神经网络模型的一个关键环节&#xff0c;该过程对网络中的参数不断进行微调&#xff0c;优化模型在训练数据集上的损失函数。参数初始化是训练之前的一个重要步骤&#xff0c;决定了训练过程的起点&#xff0c;对模型训练的收敛速度和收敛结果有重要…

Java基础43 异常(Exception)

异常&#xff08;Exception&#xff09;Exception1.1 异常的概念1.2 异常体系图&#xff08;☆&#xff09;1.3 异常处理分类1.3.1 运行时异常&#xff08;☆&#xff09;1.3.2 编译时异常&#xff08;☆&#xff09;1.4 异常处理&#xff08;☆&#xff09;1.4.1 try-catch异常…

【Git】Git下载安装与使用(一)

目录 1. 前言 1.1 什么是Git 1.2 使用Git能做什么 2. Git概述 2.1 Git简介 2.2 Git下载与安装 3. Git代码托管服务 3.1 常用的Git代码托管服务 3.2 码云代码托管服务 1. 前言 1.1 什么是Git Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码…

Cookies与Session会话技术详解

引言:日常生活中&#xff0c;人和人之间沟通交流&#xff0c;涉及到一个词----会话&#xff0c;软件中一样存在会话&#xff0c;如&#xff1a;网购登录&#xff0c;访问公司OA系统也是不断的会话&#xff0c;软件中如何管理浏览器客户端和服务端之间会话过程中的会话数据呢&am…

盘点四种自动化测试模型实例及优缺点

一&#xff0c;线性测试 1.概念&#xff1a; 通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。 &#xff08;操作&#xff0c;重复操作&#xff0c;数据&#xff09;都混合在一起。 2.优点&#xff1a; 每个脚本相对独立&#xff0…

【java】java sftp传输 ,java smb传输访问共享文件夹 集成springboot

文章目录java的sftp传输sftp注意事项java smb传输smb注意事项tips: 集成springboot与不集成springboot区别不大&#xff0c;springboot中无非是引入一个maven依赖 加一个Component注解 &#xff0c; 默认是单例&#xff1b; 复制代码前 请先认真看注意事项 java的sftp传输 依赖…

网络安全态势感知研究综述

摘要&#xff1a;随着物联网、云计算和数字化的迅速发展&#xff0c;传统网络安全防护技术无法应对复杂的网络威胁。网络安全态势感知能够全面的对网络中各种活动进行辨识、理解和预测。首先分别对态势感知和网络安全态势感知的定义进行了归纳整理&#xff0c;介绍了网络安全态…