2

我正在尝试添加一个 Finder 服务,在我希望该服务完成其工作之前,一切看起来都很好。

这是我的 AppDelegate.m 中的方法:

-(void)uploadFromPasteboard:(NSPasteboard *)pboard userData:(NSString *)udata error:(NSString **)err
{
    NSString *filename = [pboard stringForType:NSURLPboardType];
    dbg(@"file: %@", filename);
}

plist配置:

<key>NSServices</key>
<array>
    <dict>
        <key>NSRequiredContext</key>
        <dict/>
        <key>NSMenuItem</key>
        <dict>
            <key>default</key>
            <string>Upload File</string>
        </dict>
        <key>NSMessage</key>
        <string>uploadFromPasteboard</string>
        <key>NSPortName</key>
        <string>Finder</string>
        <key>NSSendTypes</key>
        <array>
            <string>NSURLPboardType</string>
        </array>
        <key>NSReturnTypes</key>
        <array/>
    </dict>
</array>

一切似乎都很好,该服务显示在服务菜单中,但是当我单击它时,什么也没有发生,没有日志或其他任何东西,就像根本没有调用它一样。

有人能指出我怎么了,因为我开始几乎不拔头发了:(

4

1 回答 1

2

你在设置你的服务提供者实例吗?像这样(来自:提供服务):

EncryptoClass* encryptor = [[EncryptoClass alloc] init];
[NSApp setServicesProvider:encryptor];

仅在您的应用程序委托类中使用此方法是不够的。在标准应用程序设置中,在您的应用程序委托中使用它可能就足够了:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [NSApp setServicesProvider: self];
}

您还为NSPortName. 这可能是不正确的。来自服务属性(强调我的):

NSPortName 是应用程序应该侦听服务请求的端口的名称。它的值取决于服务提供者应用程序的注册方式。在大多数情况下,这是应用程序名称。对于用作服务的 Automator 工作流,此属性将被忽略。

我对文档的阅读是,名称在 NSPortName 中的应用程序是用于处理服务请求的应用程序。如果您的应用程序的名称不是“Finder”(出于显而易见的原因,它不应该是),那么您的应用程序将永远不会被服务调用。

于 2013-02-06T13:08:03.470 回答