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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 46 additions and 8 deletions

View File

@ -31,13 +31,13 @@
"size" : "128x128" "size" : "128x128"
}, },
{ {
"filename" : "Icon 2@1x.png", "filename" : "Mac Icon.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "1x", "scale" : "1x",
"size" : "256x256" "size" : "256x256"
}, },
{ {
"filename" : "Icon 2@2x.png", "filename" : "Mac Icon@0.25x.png",
"idiom" : "mac", "idiom" : "mac",
"scale" : "2x", "scale" : "2x",
"size" : "256x256" "size" : "256x256"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -28,9 +28,19 @@ struct Secretive: App {
.onAppear { .onAppear {
if !hasRunSetup { if !hasRunSetup {
showingSetup = true showingSetup = true
} else if agentStatusChecker.running && justUpdatedChecker.justUpdated { } else {
// Relaunch the agent, since it'll be running from earlier update still if agentStatusChecker.running && justUpdatedChecker.justUpdated {
_ = LaunchAgentController().install() // 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() { func check() {
running = secretAgentProcess != nil running = instanceSecretAgentProcess != nil
} }
var secretAgentProcess: NSRunningApplication? { // All processes, including ones from older versions, etc
NSRunningApplication.runningApplications(withBundleIdentifier: Constants.secretAgentAppID).first 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 Foundation
import ServiceManagement import ServiceManagement
import AppKit
import OSLog
struct LaunchAgentController { struct LaunchAgentController {
func install() -> Bool { func install() -> Bool {
Logger().debug("Installing agent")
_ = setEnabled(false) _ = setEnabled(false)
return setEnabled(true) 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 { private func setEnabled(_ enabled: Bool) -> Bool {
SMLoginItemSetEnabled("com.maxgoedjen.Secretive.SecretAgent" as CFString, enabled) SMLoginItemSetEnabled("com.maxgoedjen.Secretive.SecretAgent" as CFString, enabled)
} }