Cocoa:我可以防止重复启动同一个应用程序吗?

时间:2014-03-31 06:29:47

标签: objective-c macos cocoa bundle nsapplication

例如,用户将我的应用程序放在他/她的桌面上。然后他/她将其复制(而不是移动)到/Application文件夹。

如果已启动 ~/Desktop 的那个,那么如何防止重复启动 ~/Application ?有什么简单的方法吗?

或者,如果用户在/Application中启动了该应用,我可以检测预先启动的应用,然后立即切换到该应用?

3 个答案:

答案 0 :(得分:3)

如果您的应用检测到其他实例已在运行,那么如何获取所有正在运行的应用程序的列表并立即退出?

您可以通过NSWorkspacerunningApplications获取所有有效应用的列表:

NSWorkspace * ws = [NSWorkspace sharedWorkspace];
NSArray *allRunningApps = [ws runningApplications];

它会返回一组NSRunningApplication个实例,所以您只需检查列表,例如通过bundleIdentifier方法确认您应用的ID。

答案 1 :(得分:0)

cacau的答案给了我实现目标的灵感。这是我的代码(ARC):

- (BOOL)checkAppDuplicateAndBringToFrontWithBundle:(NSBundle *)bundle
{
    NSRunningApplication *app;
    NSArray *appArray;
    NSUInteger tmp;
    pid_t selfPid;
    BOOL ret = NO;

    selfPid = [[NSRunningApplication currentApplication] processIdentifier];
    appArray = [NSRunningApplication runningApplicationsWithBundleIdentifier:[bundle bundleIdentifier]];

    for (tmp = 0; tmp < [appArray count]; tmp++)
    {
        app = [appArray objectAtIndex:tmp];

        if ([app processIdentifier] == selfPid)
        {
            /* do nothing */
        }
        else
        {
            [[NSWorkspace sharedWorkspace] launchApplication:[[app bundleURL] path]];
            ret = YES;
        }
    }

    return ret;
}

它通过包标识符检查应用程序重复。当捆绑复制时,它将所有其他应用程序置于前面并返回YES。收到YES后,申请可以自行终止。

然而,由于cacau给了我很大的帮助,我给了他这个问题的声誉点。谢谢!

答案 2 :(得分:0)

实际上只是在NSTempDirectory中创建一个文件,检查它以及它是否在那里,你退出,或者提供删除文件的方法是不是最简单的? 这对于进入和离开沙箱都有效。