loading SMAppService LoginWindow agent

I have an app that I would like to register a launchd agent at the login window.

my plist looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>RunAtLoad</key>
	<true/>
	<key>LimitLoadToSessionType</key>
	<array>
		<string>LoginWindow</string>
	</array>
	<key>AssociatedBundleIdentifiers</key>
	<string>com.myapp</string>
	<key>Label</key>
	<string>com.myapp.login-window</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/myapp.app/Contents/MacOS/myapp-agent</string>
		<string>--login-window-agent</string>
	</array>
</dict>
</plist>

If I manually copy the com.myapp.loginwindow.plist to /Library/LaunchAgents and load it manually it works as I'd expect

If I use SMAppService though it does not work:

let service = SMAppService.agent(plistName: "com.myapp.login-window.plist")

do {
    try service.register()
} catch let error {
    print(error.localizedDescription)
}  

I get:

The operation couldn’t be completed. Service cannot load in requested session.

That makes sense as I'm not at the login window when I run that routine.

However checking service.status() (with formatting) I get

LaunchAgent(com.myapp.login-window.plist) status: Enabled

which would suggest that it's loaded, yet when I log out or reboot and I'm at the login window the agent is not running. Indeed the agent does not appear in launchctl list

I'm not sure what else to check to see what's going on.

I've tested loading LaunchAgents and LaunchDaemons in other contexts using the ServiceManagement framework and these all work as I'd expect once approved. It's just the LoginWindow agent that is having issues.

Add a Comment

Accepted Reply

I have an app that I would like to register a launchd agent at the login window.

I suspect that the SMAppService API wasn’t designed to do this. I encourage you to file a bug describing your requirements and your experiences and requesting direct support for your case. Please post your bug number, just for the record.

If you’d like me to dig into this in more depth you should feel free to also open DTS tech support incident but, honestly, I doubt that I’ll be able to find a workaround for this (well, other than to not use SMAppService and continue with the code you’re currently using).

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

  • Thanks. Feedback submitted - FB12074856

    For the time being I have a line in my postinstall which will copy the login window launch agent into place from the app bundle. For the other agents and daemons it installs, SMAppService works so I'll use that where possible and wait to see if the login window agent behaviour is a bug or a dropped feature (I'm hoping for bug).

Add a Comment

Replies

I have an app that I would like to register a launchd agent at the login window.

I suspect that the SMAppService API wasn’t designed to do this. I encourage you to file a bug describing your requirements and your experiences and requesting direct support for your case. Please post your bug number, just for the record.

If you’d like me to dig into this in more depth you should feel free to also open DTS tech support incident but, honestly, I doubt that I’ll be able to find a workaround for this (well, other than to not use SMAppService and continue with the code you’re currently using).

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

  • Thanks. Feedback submitted - FB12074856

    For the time being I have a line in my postinstall which will copy the login window launch agent into place from the app bundle. For the other agents and daemons it installs, SMAppService works so I'll use that where possible and wait to see if the login window agent behaviour is a bug or a dropped feature (I'm hoping for bug).

Add a Comment