2016-06-30 15 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」は、「許可が拒否されました」のエラーです。あなたの 'helperPath'は何ですか? '/ usr/bin'以外であれば、このエラーが発生します。 – Dershowitz123

答えて

0

.appファイルはexectuableバイナリではありません。それらは特別な機能を持つフォルダです(アイコンを持ち、実行可能ファイルを開くデフォルトのオープンアクションを持つなど)。.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

これは正常に動作します、ありがとうございます。しかし、私はそれが私がする必要があるものと互換性があるかどうかはわかりません。私は、アプリケーションヘルパーのいくつかのインスタンスを起動することができる必要があります(これは私が信じている)と、プログラムで与えられた1つを終了します。タスクには 'terminate()'メソッドがあります。 'openURL()'と同等のことをすることはできますか? – Link14

+0

はい、あなたは 'openURL(_:options:configuration:)'と同様のことができるはずです。回答を更新中... – NSGod

関連する問題