我注意到10.7.3和更高版本(也低于10.8)的一些奇怪的行为。
我的应用程序是一个小助手应用程序,默认情况下有一个NSStatusItem和一个停靠图标。如果用户只想显示StatusItem、Dock图标或两者,则可以进行配置。为了实现这一点,我在Info.plist中使用了LSUIElement=YES。如果用户已将Dock-Icon配置为显示我正在执行的操作
TransformProcessType(& (ProcessSerialNumber){ 0, kCurrentProcess }, kProcessTransformToForegroundApplication);
在applicationDidFinishLaunching中。
这在10.7.3之前运行得很好。从10.7.3开始,停靠图标有时会显示两次(尽管只有一个应用程序实例在运行)。在这种情况下,应用程序可以正常终止,但第二个图标在dock中保持无响应。重新启动驳接会使图标消失。如果应用程序是LoginItem并在登录时自动启动,则主要会发生这种情况。延迟1秒或更长时间执行TransformProcessType(& (ProcessSerialNumber){ 0, kCurrentProcess }, kProcessTransformToForegroundApplication);似乎可以解决这个问题。然而,这不是一个好的方法,因为用户没有得到即时的反馈,应用程序已经启动。
有没有人知道这个问题和可能的变通方法/解决方案?一些谷歌搜索显示,从10.7.3开始,Growl似乎也有这个问题,但没有任何解决方案。注意:设置LSUIElement=NO和使用kProcessTransformToUIElementApplication,如果用户已经选择不显示停靠图标对我不起作用,因为应用程序需要与10.5和10.6兼容。
发布于 2012-08-24 15:40:51
我将用户的首选项保存到NSUserDefaults,这样我可以做两件事:首先,在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,并相应地设置它。
其次,如果他们在dock首选项中切换显示,我使用以下命令:
- (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);
}
}使用这个我从来没有遇到过双重图标的问题。希望能有所帮助。
https://stackoverflow.com/questions/12025586
复制相似问题