Objective c 单实例应用程序-激活窗口-Cocoa

Objective c 单实例应用程序-激活窗口-Cocoa,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我有两个可可应用程序。Application1调用Application2(abc.app),如下所示- if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(launchApplicationAtURL:options:configuration:error:)]) return nil != [[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL

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

您不能从App1开始。您可以检查您的App2是否是从App2启动的,并带有类似“您不能从App1启动”的通知。您可以检查您的App2是否从App2启动,并带有类似于“不太确定您的问题”的通知。默认情况下,Mac OS X只启动应用程序的一个实例。(除非磁盘上有多个可执行文件的物理副本,但即使在这种情况下,如果一个具有相同bundle ID的应用程序已经在运行,Info.plist密钥也会禁止启动该应用程序)

此外,默认情况下,如果应用程序没有打开其他窗口,NSWorkspace应将其置于前端并取消折叠(其行为应类似于您在Finder中再次双击它,或在它已运行时单击其停靠图标),并且它将调用第二个应用程序的“重新打开应用程序”处理程序

如果它不这样做,您可以尝试从“重新打开”委托方法显式取消折叠主窗口,或者如果您不希望这种情况普遍发生(但为什么不呢?),您可以考虑在两个应用程序之间发送Apple事件


此外,您还可以通过查看正在运行的应用程序并查找具有相同bundle ID的条目来检查第二个应用程序是否已经在运行。

不太确定您的问题。默认情况下,Mac OS X只启动应用程序的一个实例。(除非磁盘上有多个可执行文件的物理副本,但即使在这种情况下,如果一个具有相同bundle ID的应用程序已经在运行,Info.plist密钥也会禁止启动该应用程序)

此外,默认情况下,如果应用程序没有打开其他窗口,NSWorkspace应将其置于前端并取消折叠(其行为应类似于您在Finder中再次双击它,或在它已运行时单击其停靠图标),并且它将调用第二个应用程序的“重新打开应用程序”处理程序

如果它不这样做,您可以尝试从“重新打开”委托方法显式取消折叠主窗口,或者如果您不希望这种情况普遍发生(但为什么不呢?),您可以考虑在两个应用程序之间发送Apple事件


此外,您还可以通过查看正在运行的应用程序并查找具有相同捆绑包ID的条目来检查第二个应用程序是否已在运行。

您可以检查第二个应用程序是否正在运行,并检查它是否是具有
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];
    }
}

您可以使用
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];
    }
}