我正在尝试使用ServiceManagement
在登录时自动启动应用。主应用程序(login-Item.app
)将登录程序注册到登录项列表,启动程序启动主应用程序(2个单独的目标)。这就是我所拥有的:
主要应用:
func applicationDidFinishLaunching(_ notification: Notification) {
let helperBundleId = "abc.loginItem-launcher"
let ret = SMLoginItemSetEnabled(helperBundleId as CFString, true)
//'ret' is true at this point
来自发射器:
func applicationDidFinishLaunching(_ aNotification: Notification) {
var alreadyRunning:Bool = false
for app in NSWorkspace.shared().runningApplications{
if app.bundleIdentifier == "abc.login-item"{
alreadyRunning = true
break;
}
}
if !alreadyRunning {
let path = Bundle.main.bundlePath
let index = path.index(path.endIndex, offsetBy:-22)
var newPath = path.substring(to: index)
newPath += "login-item.app"
NSWorkspace.shared().launchApplication(newPath)
}
NSApp.terminate(nil)
}
如果单独运行,启动程序会成功启动主应用程序。其他配置(如构建阶段)都按照教程的建议完成,包括this一个。我还启用了沙箱选项,我使用我的开发标识对应用程序进行签名,然后从Application文件夹运行应用程序。它按预期工作,但在我退出并重新登录时不会启动。
答案 0 :(得分:0)
首先,建议实施一个启用/禁用功能的复选框。
在macOS中,使用Cocoa Bindings非常容易。实现此方法并将其绑定到复选框的value
。
let helperBundleIdentifier = "abc.loginItem-launcher"
@available(OSX, deprecated: 10.10) // necessary to suppress the deprecated warning.
dynamic var startAtLogin : Bool {
get {
guard let jobDicts = SMCopyAllJobDictionaries( kSMDomainUserLaunchd ).takeRetainedValue() as NSArray as? [[String:Any]] else { return false }
return jobDicts.filter { $0["Label"] as! String == helperBundleIdentifier }.isEmpty == false
} set {
if !SMLoginItemSetEnabled(helperBundleIdentifier as CFString, newValue) {
print("SMLoginItemSetEnabled failed.")
}
}
}
要解决您的问题,请启动Console.app并查看system.log。如果有多个条目无法解析服务指定的CFBundleIdentifier ... 关于应用程序的软件包标识符,请确保/ Applications中的应用程序是唯一的副本。删除档案中的所有其他内容。
在帮助应用程序中这段代码
var alreadyRunning:Bool = false
for app in NSWorkspace.shared().runningApplications{
if app.bundleIdentifier == "abc.login-item"{
alreadyRunning = true
break
}
}
if !alreadyRunning {
可以减少 - 谢谢Swift -
if NSRunningApplication.runningApplications(withBundleIdentifier: "abc.login-item").isEmpty { ...