2016-06-30 10 views
4

Ich habe eine Sub-App in meiner Swift App. Ich habe es so gemacht, dass es beim Erstellen automatisch in den Ressourcen-Ordner der Haupt-App kopiert wird. Auf diese Weise möchte ich eine Instanz der Sub-App von der Haupt-App aus starten können.NSTask: Konnte nicht posix_spawn: Fehler 13 beim Starten der App

Die Sache ist, ich habe einen Fehler, der schwer zu debuggen ist/finde Antworten über.

Hier ist mein Code:

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() 

Und der Fehler:

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

Ich habe keine Ahnung, wo sie suchen, was zu suchen. Ich weiß nicht, was ich falsch mache. Ich frage mich, ob das Problem mit der Sub-App selbst zusammenhängt. Diese Sub-App ist vorerst leer. Ich setze Application is Agent auf YES. Und in MainMenu.xib setze ich die Visible at launch Option auf Nein. Diese Sub-App muss im Hintergrund arbeiten und benötigt keine Benutzeroberfläche.

Danke!

+0

'Fehler 13' ist ein Fehler für 'Erlaubnis verweigert'. Was ist dein HelferPfad? Wenn es nicht "/ usr/bin" ist, erhalten Sie diesen Fehler. – Dershowitz123

Antwort

0

.app Dateien sind keine exektablen Binärdateien. Sie sind Ordner, die spezielle Eigenschaften haben (wie ein Symbol ist, und mit einem Standard-Öffnen-Aktion, die die ausführbare Datei öffnen in. Sie diese mit der rechten selbst sehen können, eine .app Datei klicken, und klicken Show Package Contents.

Sie können öffnen Sie eine Anwendung mit [open][1] -a oder durch die tatsächliche ausführbare bei 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

Tu das nicht wirklich. NSWorkspace ist der richtige Weg hier. – Julien

+1

@Julien Wie kommt es? Ich habe noch nie davon gehört. Was ist der Unterschied? – Alexander

1

verwenden NSTask, verwenden Sie nicht zu dieser Öffnung 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]]) 

Im obigen Code habe ich aus Gründen der Kürze das Ergebnis des Befehls openURL() ignoriert, aber in Wirklichkeit kann es eine Instanz NSRunningApplication zurückgeben, die die Aufgabe darstellt.

Um die Instanzen Ihrer Hilfsanwendung zu verfolgen, die Sie starten, können Sie Verweise auf diese NSRunningApplication in einer geeigneten Art von Auflistungsklasse beibehalten, und wenn die Zeit kommt, rufen Sie terminate() Methode.

+0

Das funktioniert richtig, danke. Aber ich bin mir nicht sicher, ob es mit dem, was ich tun muss, kompatibel ist. Ich muss in der Lage sein, mehrere Instanzen des App-Helpers zu starten (das ist in Ordnung, glaube ich) und ein bestimmtes programmgesteuert zu beenden. Task hat eine 'terminate()' Methode. Kann ich mit 'openURL()' etwas Ähnliches machen? – Link14

+0

Ja, Sie sollten etwas ähnliches mit 'openURL (_: options: configuration:)' machen können. Antwort wird aktualisiert ... – NSGod

Verwandte Themen