2012-03-25 101 views
3

我有一个Cocoa应用程序(.app),我想从另一个Cocoa应用程序启动它,这里没有问题,但有什么方法可以启动第二个应用程序传递它的一些参数吗?也许在主函数中使用argv []数组?如何在可可应用程序之间传递参数

回答

3

我这样做是使用NSWorkspace启动应用程序和NSDistributedNotificationCenter来传递数据。这显然没有完全开发,但它的工作。文档中的一个警告 - 我用参数发送的字典(本例中只是一个字符串)不能在沙盒应用中使用(字典必须为零)。

这是在打开的其他应用程序的应用程序:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
ws = [NSWorkspace sharedWorkspace]; 
NSNotificationCenter *center = [ws notificationCenter]; 
[center addObserver:self selector:@selector(poster:) name:NSWorkspaceDidLaunchApplicationNotification object:nil]; 
[ws launchApplication:@"OtherApp.app"]; 

}

-(void)poster:(NSNotification *) aNote { 
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"theDataToSend" forKey:@"startup"]; 
[center postNotificationName:@"launchWithData" object:nil userInfo:dict]; 
NSLog(@"Posted notification"); 

}

这是在打开的应用程序:

-(void)awakeFromNib { 
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
[center addObserver:self selector:@selector(doStartup:) name:@"launchWithData" object:nil]; 

}

-(void)doStartup:(NSNotification *) aNote { 
NSLog(@"%@",aNote.userInfo); 

}

+0

请注意,欺骗分布式通知是微不足道的。任何进程都可以发布任何数据。不要依赖他们的任何安全。 – 2012-03-25 21:17:40

+0

感谢您的信息库尔特。你有什么建议以更安全的方式来做到这一点? – rdelmar 2012-03-25 21:21:28

+0

不幸的是,这不是一个容易解决的问题。没有别的东西几乎如此方便。也许尝试UNIX域套接字或命名管道。 XPC如果你可以要求10.7。您仍然必须确保与您交谈的其他应用程序是您认为的那个应用程序 - 实际上并没有任何解决方法。 – 2012-03-25 21:34:08

1

你如何启动第二个可可应用程序?

当我这样做时,我通常通过NSAppleScript使用AppleScript与其他应用程序进行通信。您也可以启动应用程序。当然,其他应用程序必须支持AppleScript。

如果您可以控制这两个应用程序,也可以使用分布式对象,但它更复杂。

如果您曾经需要使用命令行程序,那么NSTask很有用。

+0

您也可以使用自定义URL方案。 – paulmelnikow 2012-03-25 13:48:09

+0

好吧我使用的方法openURL你知道这是eaiser的方式来启动一个应用程序,它工作正常,我正在寻找你提到的两种方法,非常感谢。 – willyMon 2012-03-25 18:50:42