2014-03-31 3 views
3

예를 들어 사용자가 내 응용 프로그램을 바탕 화면에 둡니다. 그런 다음 그는 (이동하는 대신) /Application 폴더로 복사했습니다. ~/Desktop의 하나가 출시 된 경우코코아 : 동일한 응용 프로그램이 중복 실행되는 것을 방지 할 수 있습니까?

는 어떻게 ~/Application에서 하나의 중복 발사를 방지 할 수 있습니까? 어떤 간단한 방법?

사용자가 /Application에있는 앱을 실행하면 미리 실행 된 앱을 감지하고 바로 그 앱으로 전환 할 수 있습니까?

+3

마하 포트를 등록하십시오. 나는 얼마 전에 이것에 대한 요지를 썼다. https://gist.github.com/CodaFi/5639819 – CodaFi

+0

OS X가 실제로 시나리오 1에서 두 번째 인스턴스를 시작한다는 사실에 놀랐다. – cacau

답변

3

실행중인 모든 응용 프로그램의 목록을 가져오고 이미 실행중인 다른 인스턴스가 있음을 앱에서 감지하면 즉시 종료 하시겠습니까?

당신은 NSWorkspacerunningApplications를 통해 모든 활성 응용 프로그램의 목록을 얻을 수 있습니다

: 그것은 당신이해야 할 것 모두가, 예를 들어에 대한 목록을 확인 그래서 NSRunningApplication 인스턴스의 배열을 반환합니다

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

앱의 ID는 bundleIdentifier 방법을 통해 확인하십시오.

+0

하하! 실제로 "중복 확인"부분을 해결했습니다. 그러나 나는 여전히 "이전 것을 앞쪽으로 가져 가라"는 부분을 공부하고있었습니다. 나는 해결책을 발견했다. (http://stackoverflow.com/questions/2333078/how-to-launch-application-and-bring-it-to-front-using-cocoa-api), "-activateWithOptions "나를 위해 일하지 않았다. –

+0

나는 나의 질문에 더 적합한 또 다른 해결책을 발견했다. 그러나 아직도, 고맙습니다. –

+0

당신을 환영합니다! – cacau

0

카카오의 대답은 내 목표를 달성하기 위해 영감을주었습니다. 다음은 내 코드 (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를 받으면 응용 프로그램을 종료 할 수 있습니다.

그러나 카카오가 중요한 도움을 주었기 때문에 나는이 질문의 명성을 줬다. 고맙습니다!

0

NSTempDirectory에서 파일을 실제로 만들면 그 파일을 확인하는 것이 가장 간단하지 않겠습니까? 그렇다면 파일을 검사하거나 종료하거나 파일을 삭제할 방법을 제공 하시겠습니까? 이 작업은 샌드 박스를 실행하거나 실행하는 데 모두 효과적입니다.

+0

하지만 좀 이상한 소리가납니다. 우리는 Cocoa에서 더 복잡한 검사를 수행 할 가능성이 더 큽니다. – cacau