Как запустить код, когда процесс агента пользователя завершается? - PullRequest
1 голос
/ 06 февраля 2011

Что я хочу

Я хочу, чтобы пользовательский агент приложения-помощника (LSUIElement в Info.plist - True) добавлял себя к элементам входа в систему при завершении.

Проблема

Не удается запустить какой-либо код до завершения процесса вспомогательного приложения. Мой код "добавить к элементам входа" работает нормально.

Фон

  • У меня есть процесс агента пользователя вспомогательного приложения, который выполняется постоянно
  • При первом запуске он добавляет себя к элементам входа
  • Если приложение было перемещено, при следующем входе в систему вспомогательный процесс приложения не может быть найден и поэтому не запускается

Что я пробовал

Интересно, должен ли я подкласс NSApplication и переопределить завершение: или остановить: и поместить туда свой код, но это кажется излишним. Конечно, есть лучший способ?

Я пробовал все эти разные вещи в делегате NSApp:

-(void)applicationWillTerminate:(NSApplication *)sender {
     [self addHelperAppToLoginItems]
}

-(void)applicationDidTerminate:(NSApplication *)sender {
     [self addHelperAppToLoginItems]
}

-(NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
     [self addHelperAppToLoginItems]
}

-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
     [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self 
                                                            selector:@selector(addHelperAppToLoginItems) 
                                                                name:NSWorkspaceDidTerminateApplicationNotification
                                                              object:nil];  

}

-(void)addHelperAppToLoginItems {
      // This code never gets called!
}

Почему методы делегата NSApplication не работают с процессом агента пользователя?

А как я могу заставить процесс проверки элементов входа в систему завершаться?

Я был бы очень благодарен за любую помощь. Спасибо!

ОБНОВЛЕНИЕ 1 6/2/11

После дальнейших раскопок проблема заключается в том, что процессы так и не завершаются, для них более распространенным является гибель ОС.

Это означает, что когда вы выбираете «Завершить» процесс в Activity Monitor или выключаете компьютер, методы завершения делегата не вызывают.

Когда запускается следующий Applescript, вызывается метод делегата:

tell application "System Events"
    tell application "LapsusHelperApp"
         quit
    end tell
end tell

1 Ответ

4 голосов
/ 06 февраля 2011

После некоторых дальнейших копаний проблема в том, что процессы никогда не завершаются, для них более распространенным является гибель ОС.

Это происходит из-за внезапного завершениявключен для вашего приложения.Это опция, поэтому просто удалите эту пару ключ-значение из вашего Info.plist, и вы затем начнете получать applicationWillTerminate: сообщений.

Кроме того, кнопка «Завершить» в Xcode (по крайней мере, в 3.x)всегда работает так же, как внезапное завершение, поэтому вы никогда не получите сообщение applicationWillTerminate: при завершении приложения из Xcode.

Кстати:

  • applicationWillTerminate:уведомляющее сообщение, поэтому его аргумент является объектом NSNotification, а не объектом NSApplication.
  • Нет applicationDidTerminate:.Мгновенное размышление покажет почему.101
...