diff --git a/examples/SMAppServiceExample/src/main.swift b/examples/SMAppServiceExample/src/main.swift index bb2a0489..3d2cd319 100644 --- a/examples/SMAppServiceExample/src/main.swift +++ b/examples/SMAppServiceExample/src/main.swift @@ -1,41 +1,58 @@ import Foundation import ServiceManagement -let daemonPlistNames = [ - "org.pqrs.Karabiner-VirtualHIDDevice-Daemon.plist" -] +enum Subcommand: String { + case register = "register" + case unregister = "unregister" + case status = "status" +} + +func registerService(_ service: SMAppService) { + do { + try service.register() + print("Successfully registered \(service)") + } catch { + // Note: + // When calling `SMAppService.daemon.register`, if user approval has not been granted, an `Operation not permitted` error will be returned. + // To call `register` for all agents and daemons, the loop continues even if an error occurs. + // Therefore, only log output will be performed here. + print("Unable to register \(error)") + } +} + +func unregisterService(_ service: SMAppService) { + do { + try service.unregister() + print("Successfully unregistered \(service)") + } catch { + print("Unable to unregister \(error)") + } +} RunLoop.main.perform { - for argument in CommandLine.arguments { - if argument == "register" { - for daemonPlistName in daemonPlistNames { - let s = SMAppService.daemon(plistName: daemonPlistName) - do { - try s.register() - print("Successfully registered \(s)") - } catch { - print("Unable to register \(error)") - exit(1) - } + let services: [SMAppService] = [ + SMAppService.daemon( + plistName: "org.pqrs.service.daemon.Karabiner-VirtualHIDDevice-Daemon.plist") + ] + + if CommandLine.arguments.count > 1 { + let subcommand = CommandLine.arguments[1] + + switch Subcommand(rawValue: subcommand) { + case .register: + for s in services { + registerService(s) } exit(0) - } else if argument == "unregister" { - for daemonPlistName in daemonPlistNames { - let s = SMAppService.daemon(plistName: daemonPlistName) - do { - try s.unregister() - print("Successfully unregistered \(s)") - } catch { - print("Unable to unregister \(error)") - exit(1) - } + case .unregister: + for s in services { + unregisterService(s) } exit(0) - } else if argument == "status" { - for daemonPlistName in daemonPlistNames { - let s = SMAppService.daemon(plistName: daemonPlistName) + case .status: + for s in services { switch s.status { case .notRegistered: print("\(s) notRegistered") @@ -51,11 +68,21 @@ RunLoop.main.perform { } exit(0) + + default: + print("Unknown subcommand \(subcommand)") + exit(1) } } print("Usage:") - print(" SMAppServiceExample register|unregister|status") + print(" SMAppServiceExample subcommand") + print("") + print("Subcommands:") + print(" \(Subcommand.register.rawValue)") + print(" \(Subcommand.unregister.rawValue)") + print(" \(Subcommand.status.rawValue)") + exit(0) } diff --git a/files/LaunchDaemons/org.pqrs.Karabiner-VirtualHIDDevice-Daemon.plist b/files/LaunchDaemons/org.pqrs.service.daemon.Karabiner-VirtualHIDDevice-Daemon.plist similarity index 100% rename from files/LaunchDaemons/org.pqrs.Karabiner-VirtualHIDDevice-Daemon.plist rename to files/LaunchDaemons/org.pqrs.service.daemon.Karabiner-VirtualHIDDevice-Daemon.plist