Posted at

打刻を忘れないために


はじめに

この記事は過去にIPU TOKYOで発表した内容を再編集したものです。

勤怠管理システムが導入され、打刻の習慣がない人は、打刻を忘れることがあると思います。

打刻忘れをしないために、壁紙を工夫したり、Slackの/remindコマンドを使う人もいるかもしれません。

ここでは、Macアプリケーションを作って、打刻忘れを防止します。


方針

Mac起動時に自動で勤怠管理システムのURLを開きます。

そして、Macのシステム終了時にも自動で勤怠管理システムのURLを開きます。


ステータスバーに常駐させたい

ステータスバーに常駐するアプリケーションとして作っていきます。

作り方は、過去に投稿した記事を参考にします。

AppDelegate.swiftを下記のように書き換えます。


AppDelegate.swift

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

let url = URL(string: "http://example.com/")
var cancelOnce = true

func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application

NSWorkspace.shared.open(url!)
}

func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}

func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
if cancelOnce {
cancelOnce = false
NSWorkspace.shared.open(url!)
return NSApplication.TerminateReply.terminateCancel
}

return NSApplication.TerminateReply.terminateNow
}
}


applicationDidFinishLaunchingで起動時、applicationShouldTerminateにシステム終了時にURLを開きます。

NSApplication.TerminateReply.terminateCancelを返すことでシステム終了を中断します。


問題発生

実行すると、システム終了時にURLが開かず、そのまま終了してしまいます。

どうやら、ステータスバーに常駐させるためにinfo.plistに追加したLSUIElementが原因のようです。

<key>LSUIElement</key>

<true/>

ということでこれがあるとfunc applicationShouldTerminateが実行されません。

ステータスバー常駐は諦めます。


完成

Dockにアイコンが表示されてしまいますが、info.plistに追加したLSUIElementを削除して完成です。

システム終了をするとシステム終了が中断され、URLが開きます。


まとめ

打刻になれるとシステム終了の中断が邪魔になります。