使用不同的命令行参数/参数关闭并启动

时间:2015-05-31 15:11:09

标签: macos cocoa

我正在运行.app,我需要"重启"可以这么说。基本上我需要告诉它关闭,然后在关闭之后,它应该使用一些命令行参数启动我告诉的路径(这对自己来说)。这可能与可可?我陷入了我的应用程序关闭然后关闭的部分,然后我无法恢复。

我的代码在js-ctypes中,但这里是objc伪代码:

default_center = [NSDistributedNotificationCenter defaultCenter];
shared_workspace = [NSWorkspace sharedWorkspace];
notification_center = [[NSWorkspace sharedWorkspace] notificationCenter];
[notification_center addObserver:selector:name:object: ***, ***, NSWorkspaceDidLaunchApplicationNotification, NIL]

在我的观察者中,当它完成退出时它会响应它有代码启动。但是当我的应用程序关闭时,它永远不会到达观察者响应者。 在这里

由于

1 个答案:

答案 0 :(得分:1)

您没有提到任何原因导致您无法从第一个实例启动应用的第二个实例,而不是鸡和&退出后尝试重新启动的egg方法...我的AppWillTerminate函数中有这个代码,我的情况和你一样:

    [[NSWorkspace sharedWorkspace] launchApplicationAtURL:appUrl options:NSWorkspaceLaunchNewInstance configuration:nil error:&error];

(为了首先调用AppWillTerminate,我必须在调用[app quit]之前禁用SudTermination)

应用程序的plist文件中还有一些标记,例如“允许多个实例”或其他内容。

另外,知道这一点:如果您的应用程序是沙盒,这将无法正常工作,除非它是使用AppleStore给定ID或开发者ID应用程序ID签名的代码。此外,无论什么,当沙盒化时,它都不适用于X.7。

方法二,

是创建一个“帮助应用程序”。你的KillerApp经历了Quit过程,就在它死之前,它启动了“HelperApp”,这是一个很小的命令行工具,它等待KillerApp真正死掉,然后重新启动它。

在XCode中,HelperApp的代码是一个“命令行工具”,如下所示:

#import <Cocoa/Cocoa.h>


int main( int argc , char *argv[] ) {

NSAutoreleasePool*  pool = [[NSAutoreleasePool alloc] init];

pid_t parentPID = atoi(argv[2]);
ProcessSerialNumber psn;

while ( GetProcessForPID(parentPID, &psn) != procNotFound )
    sleep(1);

NSString*   appPath = [NSString stringWithCString:argv[1] encoding:NSUTF8StringEncoding];
BOOL        success = [[NSWorkspace sharedWorkspace] openFile:[appPath stringByExpandingTildeInPath]];

if ( ! success )
    NSLog(@"Error: could not relaunch application at %@", appPath);

[pool drain];

return (success) ? 0 : 1;
}

正如您所看到的,您可以使用KillerApp中的一些参数调用HelperApp ...如果您不需要沙盒,那就是它。

如果你需要沙盒,那么它当然会变得更加复杂。您需要创建一个“特权帮助工具”,谢天谢地,它有示例代码。

“SMJobBless”是Apple示例代码项目,它概述了如何执行此操作,但它有点奇怪 - 实际上并没有做任何事情。值得庆幸的是,有人接受了该项目,并从中创建了“SMJobBlessXPC”,这确实完成了这项工作,(当你开始工作时,你的KillerApp实际上可以与你的HelperApp进行通信)。缺点是您需要在代码签名方面准确维护两个应用程序的plist文件。