NSService没有调用它的NSMessage

时间:2013-02-06 12:04:21

标签: objective-c macos cocoa finder

我正在尝试添加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>

一切似乎都很好,服务显示在服务菜单中,但是当我点击它时,没有任何反应,没有日志或其他任何内容,就像它根本没有被调用一样。

有人能指出我的错吗?因为我开始不拉头发了。(

1 个答案:

答案 0 :(得分:2)

您是否正在设置服务提供商实例?像这样(来自:Providing a Service):

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

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

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

您还要为NSPortName指定“Finder”。这可能不正确。来自Services Properties(强调我的):

  

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

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