更新1:越来越近
IRC 上有人提到我的 NSPortName 应该是我的应用程序,而不是 Finder。我改变了这个,现在我在选择上下文菜单时在我的应用程序中看到一条日志消息:
Cannot find service provider for selector shareFile:userData:error: or shareFile:: for service shareFile
考虑到我确实注册了这样一个对象,这似乎很奇怪。
我正在尝试为 Finder 设置一个 NSService 上下文菜单,以在某些文件上触发我的应用程序。
这些文件的扩展名是 *.acxx,操作只是分享。注意:我已将捆绑包的所有引用更改为针对此发布的通用引用:com.mycompany.myproject。
我的 infoPlist 的 NSServices 部分如下所示:(注意我也为 *.acxx 设置了文档类型/UTI)
<key>NSServices</key>
<array>
<dict>
<key>NSRequiredContext</key>
<dict>
<key>NSTextContent</key>
<array>
<string>URL</string>
<string>FilePath</string>
</array>
</dict>
<key>NSSendFileTypes</key>
<array>
<string>com.mycompany.myproject.acxx</string>
</array>
<key>NSPortName</key>
<string>Finder</string>
<key>NSMessage</key>
<string>shareFile</string>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>Share with myproject</string>
</dict>
</dict>
</array>
我的代码中有一个对象设置,定义了以下方法:
- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*) error:(NSString**)err
我在我的代码中的其他地方注册了这个:
// Register services
if (self.shareSvcMgr == nil)
{
self.shareSvcMgr = [[ACAShareServiceManager alloc] init];
}
[NSApp setServicesProvider:self.shareSvcMgr];
NSUpdateDynamicServices();
现在,当我运行应用程序并确保它已使用 pbs 注册时,它看起来很好:
/System/Library/CoreServices/pbs -debug en|grep -i myproj
NSBundleIdentifier = "com.mycompany.myproject";
NSBundlePath = "/Users/me/Library/Developer/Xcode/DerivedData/myproject-gihhiqhnzhwqbchflymzyafwxvws/Build/Products/Debug/myproject.app";
default = "Share with myproject";
"com.mycompany.myproject.acxx"
因此,当我转到 Finder 并单击 *.acxx 文件时,果然在 Finder -> Services 中,我的菜单项 Share with myproject 出现了。
问题:
一切都很好,花花公子对吗?好吧,没有。当我单击“与我的项目共享”时,没有任何反应。我在 shareFile 方法中设置了断点,程序正在运行,但什么也没发生,它永远不会被命中,等等。
我读过我可以使用 -NSDebugServices 调试 Finder,但我似乎无法让它正常工作。我已经执行了:
/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder -NSDebugServices com.mycompany.myproject
这似乎启动了一个过程,但我没有尝试与之交互的 Finder 窗口。
我不确定下一步该去哪里。当然,这个想法是在发送 Share 时将文件名或文件内容传递给我的应用程序,然后我可以从那里做需要的事情。
SendFileTypes 是否设置不正确或此模型的其他内容?任何帮助表示赞赏。谢谢