我正在尝试构建一个独立的系统服务(带有.service扩展名的应用程序,保存到〜/ Library / Services /)以替换Mac OS X中用户选择的文本。
我想用Xcode和而不是 Automator构建它,因为我比Applescript更习惯于Objective-C。
我在互联网上找到了几个例子,例如: this以及Apple's documentation。我已经适当地配置了Xcode项目并且没有问题地构建。但是,当我安装我的服务并尝试使用它时,没有任何反应。
执行服务方法本身:我放置代码以在其方法体内显示NSAlert并显示。但是,所选文本不会被替换。
知道可能遗漏的是什么吗?这是实现服务的方法:
- (void) fixPath:(NSPasteboard*) pboard
userData:(NSString*) userData
error:(NSString**) error
{
// Make sure the pasteboard contains a string.
if (![pboard canReadObjectForClasses:@[[NSString class]] options:@{}])
{
*error = NSLocalizedString(@"Error: the pasteboard doesn't contain a string.", nil);
return;
}
NSString* pasteboardString = [pboard stringForType:NSPasteboardTypeString];
//NSAlert* alert = [[NSAlert alloc] init];
//[alert setMessageText:@"WORKING!"];
//[alert runModal];
// ^ This alert is displayed when selecting the service in the context menu
pasteboardString = @"NEW TEXT";
NSArray* types = [NSArray arrayWithObject:NSStringPboardType];
[pboard clearContents];
[pboard declareTypes:types owner:nil];
// Set new text:
[pboard writeObjects:[NSArray arrayWithObject:pasteboardString]];
// Alternatively:
[pboard setString:pasteboardString forType:NSStringPboardType];
// (neither works)
return;
}
答案 0 :(得分:3)
仔细阅读Apple's documentation后,我找到了答案:我的服务应用程序的plist文件缺少服务部分下的密钥:
<key>NSReturnTypes</key>
<array>
<string>NSStringPboardType</string>
</array>
我只有相反的NSSendTypes
密钥,它允许您将数据从客户端应用程序发送到服务。需要这一个来发送修改后的文本(在另一个方向)。
这很奇怪,因为Apple的文档似乎暗示自10.6(Snow Leopard)以来不再需要指定这两个。
答案 1 :(得分:1)
对于(希望)有用的控制台喷出,在终端类型中:
defaults write -g ViewBridgeLogging -bool YES
注意:也适用于服务和扩展。