Почему не приложение:openFile: вызывается, когда приложение уже запущено?

Я хотел бы обрабатывать события открытия, когда пользователь дважды щелкает файл, созданный моим приложением, или перетаскивает такой файл на значок док-станции.

Поэтому я реализовал NSApplicationDelegate"s application:openFile: а также application:openFiles: методы, которые работают, как ожидается, когда приложение не запущено.

Однако, если приложение уже запущено, когда происходит событие открытия, приложение становится сфокусированным, но вышеупомянутые методы никогда не вызываются (точки прерывания внутри них не достигаются) и файлы не открываются.

Я также пытался реализовать application:openURLs:, Этот метод имеет такое же поведение: он не вызывается, если приложение уже запущено, когда происходит событие.

Нужно ли мне реализовывать разные функции для обработки открываемых файлов, когда приложение уже запущено, или мне нужно что-то еще сделать / установить, чтобы существующие функции вызывались в таких обстоятельствах?

2 ответа

Решение

Это не упоминается в документации, но в соответствии с этим ответом application:openFile: работает то что NSApplication вперед odoc Apple Events своему делегату.

Вооружившись этими знаниями, я смог найти в приложении следующий старый вызов Carbon:

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

Я предполагаю, что этот существующий обработчик событий использовал Apple Event раньше NSApplication был шанс разобраться с этим. Тем не менее, когда приложение еще не запущено, NSApplication обрабатывает событие до того, как будет вызвана строка выше, устанавливающая обработчик события, отсюда и другое поведение.

Удаление этого старого кода из сборки вызвало NSApplicationDelegate методы, которые будут вызваны, таким образом решая проблему.

Работает ли следующий метод?

- (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.
Другие вопросы по тегам