阅读服务实施指南。如果您想要一个工作示例代码,请参阅我制作的这个项目。如指南中所述,您需要做的是安装服务处理程序:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[NSApp setServicesProvider:self];
NSUpdateDynamicServices();
}
- (void)handleServices:(NSPasteboard *)pboard
userData:(NSString *)userData
error:(NSString **)error {
if([[pboard types] containsObject:NSFilenamesPboardType]){
NSArray* fileArray=[pboard propertyListForType:NSFilenamesPboardType];
// do something...
}
}
并在您的广告中宣传Info.plist
:
<key>NSServices</key>
<array>
<dict>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>Service Handling Demo</string>
</dict>
<key>NSMessage</key>
<string>handleServices</string> <!-- This specifies the selector -->
<key>NSPortName</key>
<string>services</string> <!-- This is the name of the app -->
<key>NSSendTypes</key>
<array>
<string>NSFilenamesPboardType</string>
</array>
</dict>
</array>
就这么简单!您可能需要手动打开 System Preferences.app 的键盘快捷键部分中的服务条目。如果您想自动打开它,您可以写入pbs.plist
inside Library/Preferences/
,但这不是记录的做事方式。
问题是当您右键单击 Finder 窗口中的空白区域时,Finder 不会显示此服务项目。除了注入代码之外,你不能用它做任何事情。这是Finder对服务系统的支持所固有的。如果你想改变这种行为,你需要在 Finder.app 中注入代码。这并不难。在 Snow Leopard 上,使用 OSAX 加载技巧是标准的,例如在此博客文章中描述。然后,您可以使用 Objective-C 运行时函数来修补右键单击 Finder 的行为,方法是更改此 Apple 文档中描述的方法。(不过,我不知道 Finder 使用哪种方法来响应右键单击事件。)
相反,如果您可以单击 Finder 窗口工具栏上的按钮而不是右键单击,则可以添加一个按钮,如在此实用程序cd-to 中。这使用了将应用程序图标放置到 Finder 工具栏的功能。该应用程序本身只是通过 Apple 事件读取最前面的 Finder 窗口的路径,并为此打开一个终端窗口。我认为你可以调整这个应用程序的代码来做你想做的事。
以下是主观的东西:
老实说,如果您只想创建一个新文件,则不必使用 Objective-C 编写 Finder 服务。Automator 可以用 shell 脚本和/或 Applescript 做同样的事情。
如果您想在 Mac 上有效地管理文件,周围已经有很多很棒的实用程序:例如尝试Butler或启动栏或Quicksilver。