0

更新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 是否设置不正确或此模型的其他内容?任何帮助表示赞赏。谢谢

4

2 回答 2

0

我遇到了同样的问题,并且能够通过删除派生数据来解决这个问题。

我认为发生的事情是我试图通过创建一个虚拟应用程序来测试某些东西,并且我为服务使用了相同的消息名称。通过从虚拟应用程序中删除派生数据,一切都开始工作了。

您应该能够在此路径的某个目录中找到派生数据:

~/Library/Developer/Xcode/DerivedData/

删除旧的东西,它可能会为你解决它。

于 2013-11-04T14:09:50.217 回答
0

好吧。IRC 上有人指出我的方法定义缺少一些东西:

- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*) error:(NSString**)err

它缺少一个变量定义(这会完全弄乱选择器匹配)。所以应该是这样的:

- (void)shareFile:(NSPasteboard*)pboard userData:(NSString*)***udata*** error:(NSString**)err

一旦我改变了它,选择器终于开始被调用=)

于 2012-11-19T18:32:08.717 回答