Mac - Spotlight(聚焦)

news2024/11/29 23:32:51

文章目录

    • 一、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:self
                                             selector:@selector(mdQueryNote:)
                                                 name:nil
                                               object: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:self
                                                           name:NSMetadataQueryDidFinishGatheringNotification
                                                         object:self.query];
           
           self.query=nil;
     
   }
   
}


部分打印结果如下

 mdQueryNote: NSMetadataQueryDidStartGatheringNotification
 mdQueryNote: NSMetadataQueryGatheringProgressNotification
 mdQueryNote: NSMetadataQueryGatheringProgressNotification
 mdQueryNote: NSMetadataQueryGatheringProgressNotification
 mdQueryNote: NSMetadataQueryGatheringProgressNotification
 mdQueryNote: NSMetadataQueryDidFinishGatheringNotification
 resultCount : 82980
 path : /usr/share/doc/cups/images/smiley.jpg
 path : 。。。/ipptool/color.jpg
 path : /System/Library/Desktop Pictures/Reflection 1.jpg
 path : /System/Library/Desktop Pictures/Reflection 2.jpg
 path : /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.coloradmin.cn/o/363736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拼多多订单查询

下载地址webcrawl最新版本下载、安装、运行教程使用场景场景一我有很多个拼多多的买家号&#xff0c;想通过一个订单编号&#xff0c;查询该订单的各种信息&#xff0c;如订单状态&#xff0c;收件信息&#xff0c;物流信息&#xff0c;售后信息&#xff0c;联系商家场景二有很…

unix高级编程-fork和execve

fork和vfork vfork是老的实现方法又很多问题 vfork #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <signal.h> #include <errno.h> #include <sys/stat.…

AQS-ReentrantLock

一、AQS 在 Lock 中&#xff0c;用到了一个同步队列 AQS&#xff0c;全称 AbstractQueuedSynchronizer&#xff0c;它是一个同步工具&#xff0c;也是 Lock 用来实现线程同步的核心组件。 1.AQS 的两种功能 独占和共享。 独占锁&#xff1a;每次只能有一个线程持有锁&#x…

Git 分支操作

1&#xff1a;什么是分支几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能&#xff0c;以免影响开发主线。 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作…

2023“Java基础-中级-高级”面试集结,已奉上我的膝盖

Java基础&#xff08;对象线程字符接口变量异常方法&#xff09; 面向对象和面向过程的区别&#xff1f; Java 语言有哪些特点&#xff1f; 关于 JVM JDK 和 JRE 最详细通俗的解答 Oracle JDK 和 OpenJDK 的对比 Java 和 C的区别&#xff1f; 什么是 Java 程序的主类&…

GLOG如何控制输出的小数点位数

1 问题 在小白的蹩脚翻译演绎型博文《GLOG从入门到入门》中&#xff0c;有位热心读者提问说&#xff1a;在保存日志时&#xff0c;浮点型变量的小数位数如何设置&#xff1f; 首先感谢这位“嘻嘻哈哈的地球人”赏光阅读了小白这不太通顺的博客文章&#xff0c;并提出了一个很…

红旗语音助手HMI设计流程之调研篇

红旗智能语音助手是基于红旗4.0智能化平台打造的场景设计研究成果。本篇文章&#xff0c;将会以红旗语音助手为例&#xff0c;带领小伙伴们了解一下HMI设计中的调研工作。在项目中&#xff0c;我们需要要通过多模态的调研手段&#xff0c;去分辨用户的哪些需求是真需求&#xf…

【C++】string类的基本使用

层楼终究误少年&#xff0c;自由早晚乱余生。你我山前没相见&#xff0c;山后别相逢… 文章目录一、编码&#xff08;ascll、unicode字符集、常用的utf-8编码规则、GBK&#xff09;1.详谈各种编码规则2.汉字在不同的编码规则中所占字节数二、string类的基本使用1.string类的本质…

Hive---Hive语法(一)

Hive语法&#xff08;一&#xff09; 文章目录Hive语法&#xff08;一&#xff09;Hive数据类型基本数据类型&#xff08;与SQL类似&#xff09;集合数据类型Hive数据结构数据库操作创建库使用库删除库表操作创建表指定分隔符默认分隔符&#xff08;可省略 row format&#xff…

逆向工具之 unidbg 执行 so

1、unidbg 入门 unidbg 是一款基于 unicorn 和 dynarmic 的逆向工具&#xff0c; 可以直接调用 Android 和 IOS 的 so 文件&#xff0c;无论是黑盒调用 so 层算法&#xff0c;还是白盒 trace 输出 so 层寄存器值变化都是一把利器&#xff5e; 尤其是动态 trace 方面堪比 ida tr…

零基础机器学习做游戏辅助第十四课--原神自动钓鱼(四)yolov5目标检测

一、yolo介绍 目标检测有两种实现,一种是one-stage,另一种是two-stage,它们的区别如名称所体现的,two-stage有一个region proposal过程,可以理解为网络会先生成目标候选区域,然后把所有的区域放进分类器分类,而one-stage会先把图片分割成一个个的image patch,然后每个im…

关于SqlServer高并发死锁现象的分析排查

问题描述 通过定期对生产环境SqlServer日志的梳理&#xff0c;发现经常会出现类似事务与另一个进程被死锁在资源上&#xff0c;并且已被选作死锁牺牲品&#xff0c;请重新运行该事务的异常&#xff0c;简单分析一下原因&#xff1a;在高并发场境下&#xff0c;多个事务同时对某…

Ubuntu 使用Nohup 部署/启动/关闭程序

目录 一、什么是nohup&#xff1f; 二、nohup能做什么&#xff1f; 三、nohup如何使用&#xff1f; 四、怎么查看/关闭使用nohup运行的程序&#xff1f; 命令 实例 一、什么是nohup&#xff1f; nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令&#xff0c…

【微信小程序】--WXML WXSS JS 逻辑交互介绍(四)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

Kotlin 34. recyclerView 案例:显示列表

Kotlin 案例1. recyclerView&#xff1a;显示列表 这里&#xff0c;我们将通过几个案例来介绍如何使用recyclerView。RecyclerView 是 ListView 的高级版本。 当我们有很长的项目列表需要显示的时候&#xff0c;我们就可以使用 RecyclerView。 它具有重用其视图的能力。 在 Re…

【C语言】-程序编译的环境和预处理详解-让你轻松理解程序是怎么运行的!!

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 程序的编译前言一、 程序的翻译环境和执行环境二、 详解翻译环境2.1编译环境2.1.1预编…

代码随想录算法训练营第七天 | 454.四数相加II 、 383. 赎金信、15. 三数之和、18. 四数之和 、总结

打卡第七天&#xff0c;还是哈希表。 今日任务 454.四数相加II383.赎金信15.三数之和18.四数之和总结 454.四数相加II 代码随想录 class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, ve…

单元测试面试秘籍分享

1. 什么是单元测试 “在计算机编程中&#xff0c;单元测试又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中&#xff0c;一个单元就是单个程序、函数、过程等&#xff1b;对于面向对象编程&#xff0c;最…

j-vxe-table 下拉搜索选择框数据加载过多导致前端崩溃问题

Jeeg-boot j-vxe-table 下拉搜索选择框数据加载过多导致前端崩溃问题 最近用到了Jeeg-boot j-vxe-table的组件&#xff0c;这组件时真J8难用&#xff0c;还好多BUG&#xff0c;想用个slot插槽也用不了&#xff0c;好像官方写了个基础就没怎么管了。&#x1f611; 问题&#xf…

google hacker语句

哎&#xff0c;我就是沾边&#xff0c;就是不打实战(&#xffe3;o&#xffe3;) . z Z 文章目录前言一、什么是谷歌Docker&#xff1f;二、受欢迎的谷歌docker语句谷歌docker的例子日志文件易受攻击的 Web 服务器打开 FTP 服务器SSH私钥电子邮件列表实时摄像机MP3、电影和 PDF…