xyk blog

最近は iOS 開発の記事が多めです。

メニューバーに常駐する masOS アプリを作る

検証環境:
Xcode 12.4
Swift 5.3.2

メニューバーに常駐する簡単な masOS アプリを作ってみる。

f:id:xyk:20210223123827p:plain

  • まず Xcode のプロジェクト作成から macOS -> App テンプレートを選択する。
    AppDelegate.swift ファイルに以下コードを書く。
    NSMenu と NSMenuItem でメニューを作成、それを NSStatusItem にセットする。
import Cocoa

@main
class AppDelegate: NSObject, NSApplicationDelegate {
    
    // NSStatusItem.variableLength でメニューバーの横幅が可変となる。 variableLength: -1.0, squareLength: -2.0
    let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
    
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let menu = NSMenu()
        menu.addItem(NSMenuItem(title: "menu1", action: #selector(menu1), keyEquivalent: ""))
        menu.addItem(NSMenuItem(title: "menu2", action: #selector(menu2), keyEquivalent: ""))
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(title: "quit", action: #selector(quit), keyEquivalent: "q"))
        statusItem.menu = menu
        
        statusItem.button?.title = "Sample"
    }
    
    @objc func menu1(_ sender: NSMenuItem) {
        print("click menu1")
    }
    
    @objc func menu2(_ sender: NSMenuItem) {
        print("click menu2")
    }
    
    @objc func quit(_ sender: NSMenuItem) {
        print("quit")
        NSApplication.shared.terminate(self)
    }
}
  • Main.storyboard を開き、WindowController を選択し、Is Initial Controllerのチェックを外しておく。
    これで空のウインドウが表示されなくなる。

  • info.plist を開き、プラスボタンで1行追加する。そして
    Key にApplication is agent (UIElement)を選択し、ValueYESとする。
    Source Code として開くと以下の xml が追加されている。

<key>LSUIElement</key>
<true/>

これで Dock 内にこのアプリケーションが表示されなくなる。