【问题标题】:Close and launch with different command line parameters/arguments使用不同的命令行参数/参数关闭和启动
【发布时间】:2015-05-31 15:11:09
【问题描述】:

我正在运行一个 .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]

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

谢谢

【问题讨论】:

  • 你的源代码是什么样的?您是否收到返回值错误?
  • 谢谢@donjuedo,我添加了我的伪代码,我是从 jsctypes 做的,所以 API 人员更容易理解我做了 objc 伪代码。
  • 哦,您是说您希望您的应用程序自行关闭并重新启动。我有这个权利吗?
  • 是的,没错@donjuedo

标签: macos cocoa


【解决方案1】:

您没有提到无法从第一个实例启动应用程序的第二个实例的任何原因,而不是在您退出后尝试重新启动的鸡和蛋方法......我有这段代码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 会经历 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 通信)。缺点是需要在代码签名方面准确维护两个app的plist文件。

【讨论】:

  • 我遇到的问题是,当我的应用程序“保留在 Dock 中”时,有时我会在 Dock 中看到两个 Dock 图标 :(
  • 谢谢@zeppenwofl!您是否有 Firefox 错误的一些暂存器代码,以便您可以重现 :) 事情是第一个退出,但由于应用程序已停靠,第二个实例制作了一个新图标 :(
  • 好的,我明白你在说什么了。是的,这有点烦人......关于其他选项,请告诉我:你需要沙盒还是不需要?
  • 好的,我在原来的答案中添加了“方法二”......至于“Firefox Addons”,那一定是某种插件?我对这些一无所知,所以我在这一点上被淘汰了,我只能给你上面我在常规 os x 应用程序中使用的两个/三个方法......对不起。
  • 没有问题。我检查了: Firefox 在我的 X.8 上没有沙盒 要检查您的系统,启动 Ffx,打开“活动监视器”,在“查看”菜单中检查“沙盒”...如果没有装箱,方法 2a 应该适合你。
猜你喜欢
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2018-04-25
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多