1

私が欲しいもの

終了時にヘルパー アプリ ユーザー エージェント (Info.plist の LSUIElement が True) をログイン項目に追加する必要があります。

問題

ヘルパー アプリ プロセスが終了する前に実行するコードを取得できません。私の「ログイン項目に追加」コードは正常に動作します。

バックグラウンド

  • 常に実行されるヘルパー アプリ ユーザー エージェント プロセスがあります。
  • 最初の起動時に、ログイン項目に自分自身を追加します
  • アプリが移動された場合、次回のログイン時に、ヘルパー アプリ プロセスが見つからないため、起動されません。

私が試したこと

NSApplication をサブクラス化し、terminate: または stop: をオーバーライドしてそこにコードを配置する必要があるのだろうかと思いますが、それはやり過ぎのようです。確かにもっと良い方法がありますか?

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 2011 年 6 月 2 日

さらに掘り下げた後、問題はプロセスが実際に終了しないことであり、OSによって強制終了されることがより一般的です。

これは、Activity Monitor でプロセスを「終了」することを選択した場合、またはコンピューターをシャットダウンした場合に、デリゲート メソッドの終了が呼び出されないことを意味します。

次の Applescript が実行されると、デリゲート メソッドが呼び出されます。

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

1 に答える 1

4

さらに掘り下げた後、問題は、プロセスが実際に終了することはなく、OSによって強制終了されることがより一般的であるということです。

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

また、Xcodeの[終了]ボタン(少なくとも3.xでは)は常に突然の終了と同じように機能するため、applicationWillTerminate:Xcodeからアプリを終了するときにメッセージが表示されることはありません。

ところで:

  • applicationWillTerminate:は通知メッセージであるため、その引数はNSApplicationオブジェクトではなく、NSNotificationオブジェクトです。
  • ありませんapplicationDidTerminate:。一瞬の反省がその理由を明らかにします。☺</li>
于 2011-02-06T19:55:37.917 に答える