2011-02-06 2 views
1

То, что я хочуКак запустить код при завершении процесса пользовательского агента?

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

Проблема

Я не могу получить код для запуска до завершения процесса приложения помощника завершается. Код "add to login items" работает нормально.

фон

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

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

Интересно, должен ли я подкласс 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 не работает с процессом агента пользователя?

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

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

UPDATE 1 6/2/11

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

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

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

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

Если вы хотите добавить свое приложение в элементы входа при запуске, почему вы делаете это в 'applicationWillTerminate:'? –

ответ

3

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

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

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

Кстати:

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

Спасибо, Питер, но после добавления логического ключа 'NSSupportsSuddenTermination' со значением' NO' для моего вспомогательного приложения Info.plist, очистки и перестройки он все равно не получает уведомления 'applicationWillTerminate:'. Я даже попытался вызвать '[[NSProcessInfo processInfo] disableSuddenTermination]' при запуске и до сих пор не радует. Любые идеи, почему это может быть? –

+0

Кстати, то, что вы предложили, отлично подходит для приложения Cocoa, где ключ LSUIElement отсутствует или отсутствует в файле info.plist. Но мой вспомогательный процесс приложения должен быть пользовательским агентом, поэтому я использую 'LSUIElement'' YES' и с этим параметром, я не могу получить даже простой проект Xcode для запуска 'applicationWillTerminate:' –

+0

Нет необходимости явно указывать отключить внезапное завершение; как я уже сказал, это вариант, означающий, что он по умолчанию отключен. Вам нужно было бы явно включить его. Если вы используете команду «Завершить» Xcode, это убьет ваше приложение независимо от внезапного завершения. Activity Monitor сделает это, только если вы выберете «Force Quit». Как вы обычно уходите от своего приложения, кроме выхода из системы? Apple Event из другого процесса (например, системные настройки)? Отправка NSApp 'terminate:'? Некоторые другие средства? –

Смежные вопросы