Relaunch agent (#165)

* Check on foreground

* Better processing.

* Update icons for agent too

* Add force launch.

* Force launch.
This commit is contained in:
Max Goedjen
2020-11-11 17:00:15 -08:00
committed by GitHub
parent 59ec40c611
commit 1f0100ff2d
8 changed files with 46 additions and 8 deletions

View File

@@ -28,9 +28,19 @@ struct Secretive: App {
.onAppear {
if !hasRunSetup {
showingSetup = true
} else if agentStatusChecker.running && justUpdatedChecker.justUpdated {
// Relaunch the agent, since it'll be running from earlier update still
_ = LaunchAgentController().install()
} else {
if agentStatusChecker.running && justUpdatedChecker.justUpdated {
// Relaunch the agent, since it'll be running from earlier update still
_ = LaunchAgentController().install()
}
}
}
.onReceive(NotificationCenter.default.publisher(for: NSApplication.willBecomeActiveNotification)) { _ in
agentStatusChecker.check()
if hasRunSetup && !agentStatusChecker.running {
// We've run setup, we didn't just update, launchd is just not doing it's thing.
// Force a launch directly.
LaunchAgentController().forceLaunch()
}
}
}

View File

@@ -15,11 +15,24 @@ class AgentStatusChecker: ObservableObject, AgentStatusCheckerProtocol {
}
func check() {
running = secretAgentProcess != nil
running = instanceSecretAgentProcess != nil
}
var secretAgentProcess: NSRunningApplication? {
NSRunningApplication.runningApplications(withBundleIdentifier: Constants.secretAgentAppID).first
// All processes, including ones from older versions, etc
var secretAgentProcesses: [NSRunningApplication] {
NSRunningApplication.runningApplications(withBundleIdentifier: Constants.secretAgentAppID)
}
// The process corresponding to this instance of Secretive
var instanceSecretAgentProcess: NSRunningApplication? {
let agents = secretAgentProcesses
for agent in agents {
guard let url = agent.bundleURL else { continue }
if url.absoluteString.hasPrefix(Bundle.main.bundleURL.absoluteString) {
return agent
}
}
return nil
}
}

View File

@@ -1,13 +1,28 @@
import Foundation
import ServiceManagement
import AppKit
import OSLog
struct LaunchAgentController {
func install() -> Bool {
Logger().debug("Installing agent")
_ = setEnabled(false)
return setEnabled(true)
}
func forceLaunch() {
Logger().debug("Agent is not running, attempting to force launch")
let url = Bundle.main.bundleURL.appendingPathComponent("Contents/Library/LoginItems/SecretAgent.app")
NSWorkspace.shared.openApplication(at: url, configuration: NSWorkspace.OpenConfiguration()) { app, error in
if let error = error {
Logger().error("Error force launching \(error.localizedDescription)")
} else {
Logger().debug("Agent force launched")
}
}
}
private func setEnabled(_ enabled: Bool) -> Bool {
SMLoginItemSetEnabled("com.maxgoedjen.Secretive.SecretAgent" as CFString, enabled)
}