我有两个可可应用程序。 Application1调用Application2(abc.app),如下所示 -
if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(launchApplicationAtURL:options:configuration:error:)])
return nil != [[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL fileURLWithPath:@"abc.app" isDirectory:NO] options:NSWorkspaceLaunchDefault configuration:nil error:NULL];
这应该打开Application2(abc.app)。现在如果应用程序1再次调用应用程序2,我想激活abc.app(如果在dock中最小化)。我想确保有单个abc.app实例在运行。我们怎样才能做到这一点?
答案 0 :(得分:2)
不太确定你的问题。默认情况下,Mac OS X仅启动应用程序的一个实例。 (除非您在磁盘上有多个可执行文件的物理副本,但即使对于这种情况,也有一个Info.plist键,如果已经运行了具有相同软件包ID的应用程序,则禁止启动应用程序。)
此外,默认情况下,如果没有打开其他窗口,NSWorkspace应该将应用程序带到前面并解除折叠(它的行为就像你在Finder中再次双击它一样,或者点击它的停靠栏图标时已经运行了),它将调用第二个应用程序的'重新打开应用程序'处理程序。
如果没有这样做,你可以尝试从'reopen'委托方法中明确地解除主窗口的崩溃,或者如果你不希望这种情况发生(但为什么不呢?) ,您可以考虑在两个应用程序之间发送Apple事件。
此外,您可以通过查看runningApplications并查找具有相同软件包ID的条目来检查第二个应用程序是否已在运行。
答案 1 :(得分:1)
您可以检查第二个应用程序是否正在运行,并检查它是否为NSRunningApplication
类的活动应用程序(最前面)。
// check if abc.app is running
NSArray *apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.youApplication.abc"];
if ([apps count] == 0)
{
// not running, launch it
[[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL fileURLWithPath:@"abc.app" isDirectory:NO] options:NSWorkspaceLaunchDefault configuration:nil error:NULL];
}
// check if abc.app is frontmost
NSArray *apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.youApplication.abc"];
if ([apps count])
{
// abc.app is running, check if active
if (![(NSRunningApplication*)[apps objectAtIndex:0] isActive])
{
// not active, activate it
[(NSRunningApplication*)[apps objectAtIndex:0] activateWithOptions: NSApplicationActivateAllWindows];
}
}
答案 2 :(得分:0)
你不能从App1。您可以使用here
等通知检查您的App2是否是从App2启动的