手动关闭并从 /Applications 启动后保持程序活动
Keeping Program alive after manual close and start from /Applications
我写了一个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>
我最终编写了一个包装函数,如果它不是 运行,它除了启动程序外没有其他功能。
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)
}
}
我写了一个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>
我最终编写了一个包装函数,如果它不是 运行,它除了启动程序外没有其他功能。
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)
}
}