2016-06-30 10 views
4

메인 Swift 앱에 하위 앱이 있습니다. 나는 그것을 만들 때 주 앱의 Resources 폴더에 자동으로 복사되도록 만들었습니다. 그렇게하면 기본 앱에서 하위 애플리케이션의 인스턴스를 시작할 수 있기를 원합니다.NSTask : posix_spawn을 실행할 수 없습니다 : 앱 실행시 오류 13

문제는 디버깅/답변 찾기가 어렵다는 오류가 발생했습니다. 내가 무엇을 검색,보고 할 생각이 없다

[56490:7218926] Couldn't posix_spawn: error 13 

:

let args = ["--args", "-admin_url", site.url, "-login", site.login, "-pass", site.password] 
    let helperPath = (NSBundle.mainBundle().pathForResource("App Helper", ofType: "app"))! 
    let task = NSTask.init() 
    task.launchPath = helperPath 
    task.arguments = args 
    task.launch() 

그리고 오류 :

여기 내 코드입니다. 내가 뭘 잘못하고 있는지 모르겠다. 문제가 하위 응용 프로그램 자체와 관련된 것인지 궁금합니다. 그 하위 애플 리케이션은 지금 비어 있습니다. 나는 Application is AgentYES으로 설정했습니다. 그리고 MainMenu.xib에서 Visible at launch 옵션을 no로 설정했습니다. 하위 응용 프로그램은 백그라운드에서 일부 작업을 수행해야하며 UI가 전혀 필요하지 않습니다.

감사합니다.

+0

'오류 13'은 '사용 권한이 거부되었습니다.'오류입니다. '헬퍼 패스'란 무엇입니까? '/ usr/bin'이 아닌 경우이 오류가 발생합니다. – Dershowitz123

답변

0

.app 파일은 실행 가능 바이너리가 아닙니다. 아이콘이 있고 실행 파일을 열 수있는 기본 열기 동작이있는 등 특별한 기능을 가진 폴더입니다. .app 파일을 마우스 오른쪽 단추로 클릭하고 Show Package Contents을 클릭하고

을 클릭하면이 파일을 볼 수 있습니다. [open][1] -a와 응용 프로그램을 열거 나 이에 대한 NSTask을 사용하지 마십시오 YourApp.app/Contents/MacOS/YourApp

let helperPath = (NSBundle.mainBundle().pathForResource("App Helper", ofType: "app"))! 

let task = NSTask() 
task.launchPath = "/usr/bin/open" 
task.arguments = ["-a", helperPath, --args", "-admin_url", site.url, "-login", site.login, "-pass", site.password] 

task.launch() 
+0

정말로 그렇게하지 마십시오. NSWorkspace가 올바른 방법입니다. – Julien

+1

@Julien 어떻게 오셨습니까? 전에 들어 본 적이 없어요. 차이점이 뭐야? – Alexander

1

에서 발견 된 실제 실행 파일을 열어 사용 NSWorkspace :

let helperAppURL = NSBundle.mainBundle().URLForResource("App Helper", 
             withExtension:"app")! 

_ = try? NSWorkspace.sharedWorkspace().openURL(helperAppURL, 
     options:[.Default], 
    configuration:[NSWorkspaceLaunchConfigurationArguments : 
      ["--args", "-admin_url", site.url, "-login", 
      site.login, "-pass", site.password]]) 

위의 코드에서 간결하게하기 위해 openURL() 명령의 결과를 무시했지만 실제로는 작업을 나타내는 NSRunningApplication의 인스턴스를 반환 할 수 있습니다.

실행중인 도우미 응용 프로그램의 인스턴스를 추적하려면 적절한 종류의 컬렉션 클래스에서이 NSRunningApplication에 대한 참조를 유지하고 시간이되면 terminate() 메서드를 호출하십시오.

+0

제대로 작동합니다. 감사합니다. 그러나 나는 그것이 내가해야 할 일과 양립 할 수 있는지 확신하지 못한다. 난 애플 리케이션 도우미의 여러 인스턴스를 시작할 수 있어야합니다 (이것은 믿을 만하다고 생각합니다), 주어진 하나를 프로그래밍 방식으로 종료합니다. 태스크는'terminate()'메소드를 가지고 있습니다. openURL()과 같은 것을 할 수 있습니까? – Link14

+0

예,'openURL (_ : options : configuration :)'과 비슷한 것을 할 수 있어야합니다. 답변을 업데이트하는 중 ... – NSGod