« ^ »

SwiftでmacOSのメニューバーに常駐するプログラムを実装する

所要時間: 約 1分

macOSの常駐プログラムを実装する必要が出てきた。考えてみると、これまでmacOS用常駐プログラムは実装したことがなかった。 そこで今回は簡単な常駐プログラムをSwiftで実装することにした。

要求仕様

常駐プログラムの実装に慣れることが目的であるため、できるかぎり簡単な仕様にする。

  • 起動するとメニューバーに"Sample"と表示し常駐する。
  • メニューバーの"Sample"をクリックすると、下部に"Quit"というメニューアイテムが表示される。
  • "Quit"というメニューアイテムをクリックすると常駐プロセスが終了する。

実装

実装していく。

Storyboardでメニューを作成する

https://res.cloudinary.com/symdon/image/upload/v1651847094/blog.symdon.info/1651837268/screenshot_2022-05-06_23.23.33_yuym8h.png

アプリケーションを実装する

Sample/Sample/AppDelegate.swift::

import Cocoa

@main
class AppDelegate: NSObject, NSApplicationDelegate {
    @IBOutlet weak var menu: NSMenu!

    let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        self.statusItem.title = "sample"
        self.statusItem.highlightMode = true
        self.statusItem.menu = menu

        let quitItem = NSMenuItem()
        quitItem.title = "Quit"
        quitItem.action = #selector(AppDelegate.quit(_:))

        self.menu.addItem(quitItem)
    }

    func applicationWillTerminate(_ aNotification: Notification) {
    }

    func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {
        return true
    }

    @objc func quit(_ sender: Any) {
        NSApplication.shared.terminate(self)

    }
}

常駐プログラムの設定

Sample/Sample/Info.plist::

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>LSUIElement</key>
	<true/>
</dict>
</plist>

完成

完成した。

https://res.cloudinary.com/symdon/image/upload/v1651847238/blog.symdon.info/1651837268/screenshot_2022-05-06_23.27.00_j2l6ya.png

一度やってしまえばどうってことはないが、慣れてないといろいろとハマる。