I want to make a preference for hiding the Dock icon and showing an NSStatusItem
.
I can create the StatusItem but I don't know how to remove the icon from Dock. :-/
Any ideas?
I want to make a preference for hiding the Dock icon and showing an NSStatusItem
.
I can create the StatusItem but I don't know how to remove the icon from Dock. :-/
Any ideas?
You can use what is called Activation Policy:
Objective-C
Swift 4
This should hide the dock icon.
See also
NSRunningApplicationActivationPolicy
.If you want to make it a user preference then you can't use UIElement. UIElement resides in the application bundle you shouldn't edit any of the files in the app bundle as this will invalidate the bundles signature.
The best solution I've found is based on this excellent article . My solution is based on the comment by Dan. In short, There's no way to do this with Cocoa, but it is possible with a tiny bit of Carbon code.
The article also suggests making a helper app that handles the dock icon exclusively. The main app then starts and kills this app depending on the users preferences. This approach strikes me as being more robust than using the Carbon code, but I haven't tried it yet.
Update for Swift: (Use both ways has been presented above, they have the same result)
I think you are looking for the
LSUIElement
in the Info.plistSee a short discussion here about turning it on/off
To do it while abiding to the Apple guidelines of not modifying application bundles and to guarantee that Mac App Store apps/(Lion apps ?) will not have their signature broken by info.plist modification you can set LSUIElement to 1 by default then when the application launches do :
to show it's dock icon, or bypass this if the user chose not to want the icon.
There is but one side effect, the application's menu is not shown until it losses and regains focus.
Source: Making a Checkbox Toggle The Dock Icon On and Off
Personally i prefer not setting any Info.plist option and use
TransformProcessType(&psn, kProcessTransformToForegroundApplication)
orTransformProcessType(&psn, kProcessTransformToUIElementApplication)
based on what is the user setting.In Xcode 4 it is shown as "Application is agent (UIElement)" and it is Boolean.
In your Info.plist control-click to an empty space and select "Add Row" from the menu Type "Application is agent (UIElement)" Set it YES.
TO make it optional I added the following line to my code (thanks Valexa!)