单实例应用程序 - 激活窗口 - 可可

时间:2014-02-25 16:19:34

标签: objective-c macos cocoa

我有两个可可应用程序。 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实例在运行。我们怎样才能做到这一点?

3 个答案:

答案 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启动的