2011-02-06 47 views
1

私はユーザーエージェントプロセスが終了したときにコードを実行するにはどうすればよいですか?

たい私は、終了のログイン項目に自分自身を追加する(Info.plistの中LSUIElementが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のデリゲートメソッドは、ユーザー・エージェント・プロセスでは動作しないのですか?

また、終了時にログイン項目を確認するプロセスを取得するにはどうすればよいですか?

私はどんな助けでも非常に感謝しています。ありがとう!さらにいくつかの掘削後

UPDATE 1 6/2/11

、問題は、彼らがOSによって殺さすることがより一般的ですが、プロセスが実際に終了し得ることは決してないということではありません。

これは、アクティビティモニタでプロセスを「終了」するか、コンピュータをシャットダウンすると、デリゲートの終了メソッドが呼び出されないことを意味します。以下のAppleScriptがデリゲートメソッドが呼び出されるか、実行されると

:さらにいくつかの掘削後

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

起動時にログイン項目にアプリケーションを追加する場合は、なぜ「applicationWillTerminate:」で実行していますか? –

答えて

3

、問題はプロセスが実際に終了し得ることは決してないということ以上である彼らが取得するために、それはより一般的ですOSによって殺された。

これは、アプリケーションで突然終了が有効になっているためです。これはオプトインのため、Info.plistからそのキーと値のペアを削除するだけで、applicationWillTerminate:のメッセージが届くようになります。

また、Xcodeの終了ボタン(少なくとも3。x)は突然の終了と同じように動作しますので、Xcodeからアプリを終了するときにはapplicationWillTerminate:というメッセージは表示されません。ところで

:引数がNSNotificationオブジェクトではなく、NSApplicationのオブジェクトであるよう

  • applicationWillTerminate:は、通知メッセージです。
  • applicationDidTerminate:はありません。瞬間の反省がなぜそれを明らかにするでしょう。 ☺
+0

Thanks、Peter、しかし、NSSupportsSuddenTermination'の値を 'NO'というブールキーをInfo.plistヘルパーアプリに追加して、クリーニングと再構築を行っても、まだ' applicationWillTerminate: '通知を受け取っていないようです。起動時に '[[NSProcessInfo processInfo] disableSuddenTermination]'を呼び出そうとしましたが、まだ喜んでいません。これがなぜ起こるのでしょうか? –

+0

ちなみに、 'LSUIElement'キーがNOである、またはinfo.plistに存在しないCocoaアプリケーションでは、あなたが提案したことはうまくいきます。しかし、私のヘルパーアプリケーションプロセスはユーザエージェントでなければならないので、私は 'LSUIElement'を' YES'としています。この設定で 'applicationWillTerminate:'を実行する簡単なXcodeプロジェクトも得られません。 –

+0

明示的に突然終了を無効にする。私が言ったように、それはオプトインで、デフォルトでは無効になっています。明示的に有効にする必要があります。 XcodeのTerminateコマンドを使用すると、突然終了してもアプリケーションが終了します。アクティビティモニターは、「強制終了」を選択した場合にのみ実行されます。ログアウトの他に、あなたはいつもあなたのアプリをやめていますか?他のプロセスのAppleイベント(「システム環境設定」など)? NSAppの 'terminate:'を送信しますか?他の手段? –

関連する問題