【发布时间】:2009-11-17 22:01:59
【问题描述】:
我有一个应用程序 A,它可能需要也可能不需要生成一个应用程序 B,并将使用远程消息传递(通过 NSConnections 等)。
虽然我知道如果先启动 B 该怎么做,但我想知道:
什么是按需透明启动 B 的基于清洁可可的方法?
(对于那些熟悉 COM 的人,我实际上是在寻找 CoCreateInstance() 等效项)
【问题讨论】:
标签: objective-c cocoa macos ipc
我有一个应用程序 A,它可能需要也可能不需要生成一个应用程序 B,并将使用远程消息传递(通过 NSConnections 等)。
虽然我知道如果先启动 B 该怎么做,但我想知道:
什么是按需透明启动 B 的基于清洁可可的方法?
(对于那些熟悉 COM 的人,我实际上是在寻找 CoCreateInstance() 等效项)
【问题讨论】:
标签: objective-c cocoa macos ipc
如果这是一个 GUI 应用程序,您可以为 10.6 执行类似的操作:
NSArray * runningBs = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.example.B"];
if ([runningBs count] == 0) {
NSURL * bURL = [[NSWorkspace sharedWorkspace] URLForApplicationWithBundleIdentifier:@"com.example.B"];
NSRunningApplication * b = [[NSWorkspace sharedWorkspace] launchApplicationAtURL:bURL options:NSWorkspaceLaunchDefault configuration:nil error:nil];
}
对于 10.5:
使用-[NSWorkspace launchedApplications] 并遍历数组以查看是否找到B。
如果没有,请找到[NSWorkspace absolutePathForAppBundleWithIdentifier:],然后使用[NSWorkspace launchApplication:] 变体之一。
【讨论】:
NSWorkspace 是一个 AppKit 类。对于 10.5,使用 -[NSWorkspace launchedApplications] 并遍历数组以查看是否找到 B。如果找不到,请找到 [NSWorkspace absolutePathForAppBundleWithIdentifier:],然后使用 [NSWorkspace launchApplication:] 变体之一。
如果另一个应用程序是一个命令行应用程序或者可以像一个命令行应用程序一样运行,那么 NSTask 是最佳选择——您可以启动另一个程序并定义其标准输入、输出和错误流。如果这是一个 GUI 应用程序,您可以使用 Scripting Bridge 或 NSWorkspace + 使用您自己的通信协议与 NSConnection 等。
【讨论】: