例如,用户将我的应用程序放在他/她的桌面上。然后他/她将其复制(而不是移动)到/Application
文件夹中。
如果 at~/Desktop
已启动,如何防止重复启动 at ~/Application
?有什么简单的方法吗?
或者如果用户在 中启动一个/Application
,我可以检测到预启动的应用程序,然后立即切换到那个?
例如,用户将我的应用程序放在他/她的桌面上。然后他/她将其复制(而不是移动)到/Application
文件夹中。
如果 at~/Desktop
已启动,如何防止重复启动 at ~/Application
?有什么简单的方法吗?
或者如果用户在 中启动一个/Application
,我可以检测到预启动的应用程序,然后立即切换到那个?
如果您的应用程序检测到另一个实例已经在运行,那么获取所有正在运行的应用程序的列表并立即退出如何?
NSWorkspace
您可以通过和获取所有活动应用程序的列表runningApplications
:
NSWorkspace * ws = [NSWorkspace sharedWorkspace];
NSArray *allRunningApps = [ws runningApplications];
它将返回一个NSRunningApplication
实例数组,因此您所要做的就是通过该bundleIdentifier
方法检查列表,例如您的应用程序 ID。
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给了我很大的帮助,我给了他这个问题的声誉点。谢谢!
实际上只是在 NSTempDirectory 中创建一个文件,检查它,如果它在那里,你退出,或者提供一种删除文件的方法,这不是最简单的吗?这适用于进出沙盒。