4

自分で NSApplications を起動する方法を学んだとき、使用したコード ( hereおよびhereに基づく) は

[NSApp activateIgnoringOtherApps:YES];

これにより、起動時にアプリが強制的に前面に表示されます。

他のほとんどのアプリが何をするのか知りたいです。バイナリとアプリバンドルの両方からプログラムを直接実行できるようにしたいのですが、これをビルドするために Xcode を使用していません (生のビルド)。だから、いわば自然に行動したい。

ドキュメントには Finder issues と書かれてNOいますが、なぜ Finder なのですか? これは、プロセスの外ではなく、プロセス内から実行されるメソッドではないでしょうか。(私はその選択を制御できません。) そして、Dock やその他の可能性のあるエントリ ポイントについてはどうでしょうか。

10.8 を逆アセンブルして動作を確認するところまで行きましたNSApplicationMain()が、32 ビット バージョンからわかる限り、この「軽い起動」がこのセレクターを発行しない限り、このセレクターは呼び出されません。

この質問に対する答えはありますか?ありがとう...そして、これが紛らわしい場合は申し訳ありません。できるだけわかりやすく言葉にしてみました。

4

1 に答える 1

14

通常、アプリはまったく呼び出しません-activateIgnoringOtherApps:。そして、一般的に言えば、すべきではありません。NSApplicationMain()これは時期尚早であり、実際のアプリの起動とはかなりかけ離れています。

アプリは通常、Launch Services によって起動されます (これは、Finder、Dock、および で使用されるものであり/usr/bin/open、ユーザーのアプリまたはユーザーが処理するドキュメントを開く可能性のある他のアプリでも使用されます)。大まかに何が起こるかというと、Launch Services がそれを呼び出したアプリを非アクティブ化して別のものを開くと、起動されたアプリで Cocoa の内部が次のようなことを行います (ただし、必ずしも同じである必要はありません) [NSApp activateIgnoringOtherApps:NO]。このように、起動されたアプリは、これら 2 つのイベントの間に他に何もアクティブ化されなかった場合にのみアクティブ化されます。その間隔が長く (何かが遅いため)、その間にユーザーが別の何かに切り替えた場合、切り替え先からフォーカスを奪いたくありません。

[NSApp activateIgnoringOtherApps:YES]Launch Services による現在のアプリの自動非アクティブ化を含まないコンテキストでアプリをアクティブ化するためのユーザー リクエストに応答してのみ呼び出す必要があります。たとえば、(-[NSApplication setActivationPolicy:]または deprecatedを使用してTransformProcessType()) GUI アプリに変換するコマンドライン プログラムがある場合、そのツールを実行しているユーザーは、そのツールをアクティブにしたいことを意味します。ただし、ターミナルはアクティブであり、プログラムを実行しただけで自発的に非アクティブ化されることはありません。したがって、プログラムフォーカスを盗む必要があります。

プログラムがバンドルされたアプリの場合、/usr/bin/openバンドル内の実行可能ファイルを直接実行するのではなく、コマンド ラインから実行する必要があります。次に、呼び出す必要はまったくなく-activateIgnoringOtherApps:、どの値を渡すかという問題は議論の余地があります。

于 2014-08-14T22:56:46.120 に答える