我正在尝试添加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>
一切似乎都很好,服务显示在服务菜单中,但是当我点击它时,没有任何反应,没有日志或其他任何内容,就像它根本没有被调用一样。
有人能指出我的错吗?因为我开始不拉头发了。(
答案 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”(并且不应,原因显而易见),那么您的应用将永远不会被该服务调用。