Creating a macOS Statusbar Application

In this post we will create a macOS statusbar application. In order to follow this tutorial you will need following items:

  • A device that is capable of running macOS Big Sur
  • Xcode (I am using Version 13.2.1 (13C100))

Create Project

  • Open Xcode and create new project.
  • Select App under macOS platform
  • Enter your product name (Statusbar)
  • Select Team if you have one or let Xcode generate one (My developer account)
  • Enter an organization identifier (Reverse domain — dev.gokhun)
  • Select SwiftUI as interface and Swift as language
  • Uncheck core data and tests for now

Add Statusbar

In order to add statusbar and menu items we need to add NSApplicationDelegate to our application.

Right click to Statusbar folder in project navigator and create a new swift file:

Open StatusbarApp.swift file and fill with followings:

NSApplicationDelegateAdaptorwill let us use AppKit in our SwiftUI based application. Since our application will be in statusbar we will not use WindowGroup. Instead we will use Settings which will give us a preferences menu bar item.

Return to AppDelegate.swift file and override applicationDidFinishLaunching method to add statusbar item:

Finally we need to add a property to our target. Open Xcode and select the top item in Project navigator. Then select TARGETS menu and navigate to Info tab.

Add Application is agent (UIElement) YES as seen in screen shot above. This makes our application run in background and do not populate the menu bar (File, edit, view … items near apple logo).

At this stage we should have a star with a single menu item in our statusbar.

Open Windows

In order to make our statusbar application more useful let’s open some windows from statusbar items programmatically. We will create NSWindow instances by clicking statusbar menu items. In these windows we will use SwiftUI elements.

First create a SwiftUI view with following content:

Add following function to AppDelegate.swift file:

To call this function we will add a selector to our statusbar item:

Finally our AppDelegate.swift file looks like this:

Here is the final result:

To summarize:

  • We have used an adapter to add AppKit to our SwiftUI application.
  • We have used another adapter to call SwiftUI view from AppKit NSWindow.
  • We have set application target property to run it in background

Source code for this application can be found in GitHub

Originally published at https://gokhun.dev on December 27, 2021.

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store