I think the most flexible way is that you should take your main window control by yourself instead of the storyboard.
When Application did finish launching, you can show main window or not according to your application policy as below:
switch AppDefaults.shared.applicationRunMode {
case .menuAndDock:
_ = ApplicationMode.toggleDock(show: true)
MainWindowController.shared.window?.makeKeyAndOrderFront(nil)
case .menuOnly:
_ = ApplicationMode.toggleDock(show: false)
_ = MainWindowController.shared.window
default:
MainWindowController.shared.window?.makeKeyAndOrderFront(nil)
}
What the toggleDock
method does is change the way your application shows.
func toggleDock(show: Bool) -> Bool {
// Get transform state.
let transformState = show
? ProcessApplicationTransformState(kProcessTransformToForegroundApplication)
: ProcessApplicationTransformState(kProcessTransformToUIElementApplication)
// Show / hide dock icon.
var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess))
let transformStatus: OSStatus = TransformProcessType(&psn, transformState)
return transformStatus == 0
}
UIElement
in the info.plist
only enables your Cocoa Application the ability to hide UI.