Apps Crash on Ventura
Before Ventura, if I wanted some app to launch when a user logged in, I used this code:
private func setAutoStart() {
let shouldEnable = Defaults[.autoLaunchWhenLogin]
if !SMLoginItemSetEnabled("com.parussoft.Stand-Reminder-Launcher" as CFString, shouldEnable) {
fatalError()
}
}
However, in macOS Ventura, SMLoginItemSetEnabled(_:_:)
global function is deprecated, and what's more, it takes no effects so it returns false and fatalError()
is executed. So every app of mine that used auto launch when logged in crashed on macOS Ventura.
How to Solve
To solve the issue is easy, we must update the code and use the new API in macOS Ventura and later.
private func setAutoStart() {
let shouldEnable = Defaults[.autoLaunchWhenLogin]
if #available(macOS 13.0, *) {
if shouldEnable {
try? SMAppService().register()
} else {
try? SMAppService().unregister()
}
} else {
if !SMLoginItemSetEnabled("com.parussoft.Stand-Reminder-Launcher" as CFString, shouldEnable) {
fatalError()
}
}
}
Other Related Issues
In Ventura, you may find that many versions of the same app that created login items all launched when you logged in. Once I had 3 "Stand Reminder" and 2 "Poster 2" in different versions auto launched when I logged in.
I found that the extra apps were debug versions that I had tested with Xcode. So there must be some relations with the new API.
Workaround
You can simply manually remove the debug version apps to solve the issue. But this method takes to much time as you always have new debug versions.
Or you can stop this feature on debug versions after you fully tested it.
private func setAutoStart() {
#if !DEBUG
let shouldEnable = Defaults[.autoLaunchWhenLogin]
if #available(macOS 13.0, *) {
if shouldEnable {
try? SMAppService().register()
} else {
try? SMAppService().unregister()
}
} else {
if !SMLoginItemSetEnabled("com.parussoft.Stand-Reminder-Launcher" as CFString, shouldEnable) {
fatalError()
}
}
#endif
}