4

10.7.3 以降 (および 10.8 未満) で動作がおかしくなっていることに気付きました。

私のアプリは、デフォルトで NSStatusItem とドック アイコンを持つ小さなヘルパー アプリです。ユーザーは、StatusItem のみ、Dock アイコン、またはその両方を表示するかどうかを構成できます。これを再現するために、私はLSUIElement=YESInfo.plist に持っています。ユーザーがDock-Iconを表示するように構成した場合、私はやっています

TransformProcessType(& (ProcessSerialNumber){ 0, kCurrentProcess }, kProcessTransformToForegroundApplication);

アプリケーションでDidFinishLaunching.

これは 10.7.3 までは問題なく機能していました。10.7.3 以降、ドック アイコンが 2 回表示されることがあります (アプリのインスタンスは 1 つしか実行されていません)。この場合、アプリは正常に終了できますが、ドックの 2 番目のアイコンは応答しません。ドックを再起動すると、アイコンが消えます。これは主に、アプリが LoginItem であり、ログイン時に自動的に開始される場合に発生します。TransformProcessType(& (ProcessSerialNumber){ 0, kCurrentProcess }, kProcessTransformToForegroundApplication); 1秒以上遅らせて実行すると問題が解決するようです。ただし、アプリケーションが開始されたという即時のフィードバックがユーザーに得られないため、これは良い方法ではありません。

この問題と可能な回避策/解決策について何か知っている人はいますか? 一部のグーグル検索では、10.7.3 以降、Growl にもこの問題が発生しているように見えますが、解決策はありません。注:アプリが10.5および10.6と互換性がある必要があるため、ユーザーがドックアイコンを表示しないことを選択した場合、を設定LSUIElement=NOして使用kProcessTransformToUIElementApplicationしても機能しません。

4

1 に答える 1

3

ユーザーの設定を NSUserDefaults に保存して、2 つのことを行います。まず、アプリケーションの起動時に applicationDidFinishLaunching で確認します。

    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"ShowInDock"] boolValue]) {
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}  else {
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToUIElementApplication);
}

if は、ユーザー設定 (standardUserDefaults に保存されている) が yes か no かをチェックし、それに応じて設定します。

次に、ドック設定で表示を切り替える場合は、これを使用します。

- (IBAction)toggleShowInDock:(id)sender {
if ([showInDockPreference state] == NSOnState) {
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"ShowInDock"];
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}  else {
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@"ShowInDock"];
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToUIElementApplication);
    }
}

これを使用して二重アイコンの問題が発生したことはありません。それが役に立てば幸い。

于 2012-08-24T07:40:51.453 に答える