2

次の問題があります。UI、ペン先などを備えた Cocoa アプリがあります。バックグラウンドまたはフォアグラウンドでアプリケーションを起動できる必要があります。つまり、前者には NSApplicationActivationPolicyProhibited 、後者には NSApplicationActivationPolicyRegular が必要です。さて...どのように起動するかの決定は、アプリの起動に渡される引数に依存します。したがって、コードは多かれ少なかれ次のようになります。

   shouldBeBackground = // read this from argument - argv
if (shouldBeBackground) {
    [NSApp setActivationPolicy:NSApplicationActivationPolicyProhibited];
} else {
    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
    [NSApp activateIgnoringOtherApps:YES];
     // later on I do the makeKeyAndOrderFront:
}

問題は Info.plist にあります。LSBackgroundOnly を 1 にすると、すべてが期待どおりに機能します。しかし、それを 0 に設定すると (またはキーを設定しないと)、アプリの起動時にドックにアプリのアイコンが数ミリ秒間表示され、少し点滅します。これは、アプリがデフォルトのポリシーで初期化されており (アイコンが表示され始めている)、バックグラウンドに切り替えるのが遅すぎるためだと思います。これは以下でも説明されています: Cocoa - プログラムでフォアグラウンド/バックグラウンドに移動

ココアまたはアプリを起動する前でも、引数を読み取って前の IF を実行する場所はわかっています (たとえば、MyOwnPrincipalClass +initialize をフックできます)。 Cocoa の起動時にデフォルトが設定されます。だからうまくいかない。

私が見つけた唯一の解決策は、IF を先頭 (ココアを初期化する前) に配置し、引数に応じて、Info.plist (LSBackgroundOnly フラグ) を記述/変更することです。これはうまくいくかもしれませんが、それは本当のハックです。よりクリーンなソリューションを見つけたいと思います。

ところで、逆の場合: 常にバックグラウンドで起動してからフォアグラウンドにすると、フォアグラウンドに移動するとアプリのメニューバーが自動的に表示されないため、最悪の結果になります: 別のアプリに切り替えて、に戻る必要があります。表示させてください....インターネットで検索しましたが、実際には既知のバグ/制限のようです。

BTW2: 2 つの異なるバイナリを使用することもできません。

あなたが私に与えることができるどんな助けにも感謝します,

4

1 に答える 1

1

起動時に常にバックグラウンド アプリとして起動するだけです。次に、起動時にフォアグラウンド アプリにしたい場合は、plist 値をプログラムで変更し、プログラムでアプリケーションを再起動できます (アプリを終了する前に NSTask を送信してアプリを起動します)。アプリを終了するときは、バックグラウンド モードであることを確認してください。十分に単純に思えます。

于 2013-01-19T15:56:47.080 に答える