Swift:SMLoginItemSetEnabled()在登录时不启动

时间:2017-01-09 17:25:32

标签: swift

我正在尝试使用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文件夹运行应用程序。它按预期工作,但在我退出并重新登录时不会启动。

1 个答案:

答案 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 { ...