为什么 application:openFile: 在应用程序已经 运行 时调用?

Why isn't application:openFile: called when the application is already running?

我想在用户双击我的应用程序创建的文件或将此类文件拖到停靠栏图标时处理打开事件。

因此,我实现了 NSApplicationDelegateapplication:openFile: and application:openFiles: 方法,当应用程序不是 运行.

时,这些方法可以正常工作

但是,如果在打开事件发生时应用程序已经 运行,应用程序将获得焦点,但不会调用上述方法(不会命中其中的断点)并且不会打开文件。

我也尝试实施 application:openURLs:。此方法具有相同的行为:如果事件发生时应用程序已经 运行,则不会调用它。

当应用程序已经 运行 时,我是否需要实现不同的函数来处理打开的文件,或者我是否还需要 do/set 才能调用现有函数那些情况?

下面的方法行得通吗?

- (void)application:(NSApplication *)application 
       openURLs:(NSArray<NSURL *> *)urls;

If your delegate implements this method, AppKit does not call the
application:openFile: or application:openFiles: methods.

这在 the documentation, but according to this answer 中没有提到,application:openFile: 的工作方式是 NSApplicationodoc Apple Events 转发给它的代表。

有了这些知识,我能够在应用程序中找到以下旧的 Carbon 调用:

osError = AEInstallEventHandler(kCoreEventClass,
                                kAEOpenDocuments,
                                g_OpenDocumentsUPP,
                                0L,
                                false);

我假设这个现有的事件处理程序在 NSApplication 有机会处理它之前消耗了 Apple 事件。但是,当应用程序尚未 运行 时,NSApplication 在调用上述设置事件处理程序的行之前处理事件,因此行为不同。

从构建中删除此旧代码导致调用 NSApplicationDelegate 方法,从而解决了问题。