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

标签 macos cocoa

我正在运行一个 .app,可以这么说,我需要“重新启动”它。基本上我需要告诉它关闭,然后关闭后,它应该使用一些命令行参数启动我告诉的路径(它本身)。 cocoa 可以做到这一点吗?我卡在我的应用程序关闭然后关闭的部分,然后我无法将其恢复。

我的代码在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] 之前禁用SuddenTermination)

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

另外,请了解这一点:如果您的应用程序是沙盒的,则除非它是使用 AppleStore 给定 ID 或开发人员 ID 应用程序 ID 进行代码签名的,否则这将不起作用。而且,无论如何,当沙盒化时,它都无法在 X.7 上运行。

方法二,

是创建一个“Helper App”。你的 KillerApp 会经历退出过程,在它死掉之前,它会启动“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 文件。

关于macos - 使用不同的命令行参数/参数关闭和启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30558987/

相关文章:

c - 自旋锁实现 (OSSpinLock)

objective-c - 在回调函数中使用 ExtAudioFileWriteAsync()。无法运行

macos - 如何在 Mac OS X 中删除文件上的 "extended attributes"?

objective-c - 配置 log4Cocoa

iphone - 什么情况下[ [ UIApplication sharedApplication ] keyWindow ]会返回nil?

cocoa - 绑定(bind)到 NSMutableDictionary 和默认值

linux - 将文件从300个差异文件夹移动到新的单个文件夹中

python - 在 PyObjC 中,如何在使用 runModalForWindow_ 后让工作表结束?

macos - WKWebView禁用右键菜单

eclipse - 将 Maven 安装添加到 Elipse