手动关闭后从/应用程序启动后保持程序活动

时间:2016-01-24 01:45:08

标签: macos plist launchctl

我写了一个plist文件。目的是保持程序活着,这是正常的。我发现的问题如下。 如果我关闭应用程序并从/ Applications文件夹启动它,我创建的helper.plist将不再有效。 现在我知道我可以运行一个卸载并加载launchtctl的脚本。但是这会使用帮助器的bundleId第二次启动我的程序。

如果我手动关闭应用程序或者这不可能,有没有办法将程序重新附加到帮助程序? 或者我是否必须编写一个只运行脚本并在其中包含真实程序的包装器应用程序? 有没有更聪明的解决方案如何轻松完成?我在下面附上了plist

<?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>Label</key>
    <string>com.test.helper</string>
    <key>Program</key>
    <string>/Applications/test.app/Contents/MacOS/test</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <false/>
    </dict>
</dict>
</plist>

1 个答案:

答案 0 :(得分:0)

我最终编写了一个包装函数,如果它没有运行,除了启动程序之外没有其他功能。

func applicationDidFinishLaunching(aNotification: NSNotification) {
    print("starting app")
    //check if application is running. if so terminate
    let apps = NSWorkspace.sharedWorkspace().runningApplications
    for app in apps{
        if let bundle = app.bundleIdentifier{
            if(bundle.hasPrefix("com.CostumApp.main")){
                print("already running")
                //activating gui
                showFront()
                NSApplication.sharedApplication().terminate(self)
            }
        }
    }
    //checks if the plist file exists and start reset deamon
    let daemon = checkDeamon()
    if(daemon){
        let helper = getUserLibrary() + "/LaunchAgents/com.CostumApp.helper.plist"
        callShell("/bin/launchctl", arguments: ["unload","-w",helper])
        callShell("/bin/launchctl", arguments: ["load","-w",helper])
        NSApplication.sharedApplication().terminate(self)
    }else{
        print("no helper file")
        NSApplication.sharedApplication().terminate(self)
    }
}