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

  • 本文关键字:参数 启动 命令行 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]

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

谢谢

你没有提到任何你不能从第一个实例启动应用程序的第二个实例的原因,而不是鸡肉&尝试在你退出后重新开始的鸡蛋方法……我在我的AppWillTerminate函数中有这段代码,其中我有一个类似您的情况:

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

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

在应用程序的plist文件中也有一些标志,比如"允许多个实例"之类的。

同时,知道这一点:如果你的应用是沙盒的,这将不起作用,除非它的代码与苹果商店给定的id,或与开发者id应用程序id签名。此外,当沙箱化时,无论如何它都不能在X.7上工作。

方法两种,

是创建一个"Helper App"。你的KillerApp会经历退出过程,在它死亡之前,它会启动"帮助应用程序",这是一个很小的命令行工具,等待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"是苹果的示例代码项目,它概述了如何做到这一点,但它有点奇怪——它实际上什么也不做。值得庆幸的是,有人接受了这个项目,并从它创建了"SMJobBlessXPC",这确实完成了工作(当你让它工作时,你的KillerApp实际上可以与你的HelperApp进行通信)。缺点是,在代码签名方面,您需要准确地维护两个应用程序的plist文件。

相关内容

  • 没有找到相关文章

最新更新