2 // TimeSignalNotifier.swift
5 // Created by Hori,Masaki on 2017/01/21.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
13 static let fire = #selector(TimeSignalNotifier.fire(_:))
16 final class TimeSignalNotifier: NSObject {
18 let udController: NSUserDefaultsController = NSUserDefaultsController.shared
25 bind(NSBindingName(#keyPath(notifyTimeBeforeTimeSignal)),
27 withKeyPath: "values.notifyTimeBeforeTimeSignal")
32 unbind(NSBindingName(#keyPath(notifyTimeBeforeTimeSignal)))
35 @objc dynamic var notifyTimeBeforeTimeSignal: Int = 0 {
37 didSet { registerTimer() }
41 @objc func fire(_ timer: Timer) {
43 defer { registerTimer() }
45 guard UserDefaults.standard[.notifyTimeSignal] else { return }
48 let cal = Calendar.current
49 let minutes = cal.component(.minute, from: now)
51 if (59 - minutes) > notifyTimeBeforeTimeSignal { return }
53 let notification = NSUserNotification()
54 let hour = cal.component(.hour, from: now)
55 let format = NSLocalizedString("It is soon %zd o'clock.", comment: "It is soon %zd o'clock.")
56 notification.title = String(format: format, hour + 1)
57 notification.informativeText = notification.title
59 if UserDefaults.standard[.playNotifyTimeSignalSound] {
61 notification.soundName = NSUserNotificationDefaultSoundName
65 NSUserNotificationCenter.default.deliver(notification)
68 private func registerTimer() {
73 let cal = Calendar.current
74 var comp = cal.dateComponents([.year, .month, .day, .hour], from: now)
75 let minutes = cal.component(.minute, from: now)
76 if minutes + notifyTimeBeforeTimeSignal >= 60 {
78 comp.hour = comp.hour.map { $0 + 1 }
81 comp.minute = 60 - notifyTimeBeforeTimeSignal
82 guard let notifyDate = cal.date(from: comp) else {
84 print("Can not create notify date")
88 timer = Timer.scheduledTimer(timeInterval: notifyDate.timeIntervalSinceNow,