2013-07-21 15 views
6

Ich habe eine Mac OSX-Anwendung, die eine ausführbare Datei in/Contents/Resources startet. Die Anwendung soll nicht im App Store veröffentlicht werden und deshalb habe ich Sandbox nicht eingeschaltet.Starten der ausführbaren Datei mit NSTask - Sandboxing Probleme?

Der Start Code:

toolPath = [[[NSBundle mainBundle] pathForResource:@"myexecutable" ofType:@""] copy]; 
task = [[NSTask alloc] init]; 
[task setLaunchPath: toolPath]; 
pipe = [[NSPipe alloc] init]; 
[task setArguments:[NSArray arrayWithObjects:@"-someArg", someVariable, nil]]; 
file = [[NSFileHandle alloc] initWithFileDescriptor:[pipe fileHandleForReading].fileDescriptor]; 
[task setStandardOutput: stderrPipe]; 
[task launch]; 

Die Sache ist - das alles funktioniert gut, wenn in Xcode läuft. Es funktioniert auch gut, wenn Sie die Anwendung auf den Desktop exportieren und ausführen.

Wenn ich jedoch die Anwendung zip, auf einen Webserver hochladen, und dann auf dem gleichen Computer (oder Dropbox auf einen anderen Mac), wird die Aufgabe nicht mehr gestartet! Ich bekomme keinen Fehler in der Systemkonsole oder irgendetwas.

Ich recherchierte einige zu diesem Problem und fand, dass OSX eine neue Anwendung als "unter Quarantäne gestellte" Sonderberechtigungsrecht markieren wird. So untersuchte ich den Unterschied zwischen dem heruntergeladenen App und der exportierten App:

Berechtigungen für die ausführbare Datei nach meiner Anwendung von Xcode exportieren:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

An dieser Stelle der App funktioniert gut und die ausführbare Datei wird von einem ins Leben gerufen Schaltfläche in der App.

und nach der Anwendung zippen, auf dem Server hochgeladen, heruntergeladen, entpackt und die Anwendung öffnen und die Annahme des Dialogs „Diese Anwendung wurde aus dem Internet heruntergeladen“:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 
    com.apple.quarantine  26 

An diesem Punkt nichts passiert, wenn ich schiebe die Schaltfläche in meiner App.

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

aber die ausführbare Datei ist noch nicht gestartet werden:

Wenn ich laufe xattr -rd com.apple.quarantine auf der gesamten App dann wird der Quarantäne Hinweis entfernt!

An diesem Punkt habe ich nun die folgenden Berechtigungen auf meinem Desktop App:

/Contents/MacOS:

-rwxr-xr-x 1 Username staff 407728 21 Jul 16:31 appName 

/Contents/Resources:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

Und auf die heruntergeladene App, die ich verwendet Xattr -rd auf:

/Inhalt/MacOS:

-rwxr-xr-x 1 Username staff 407728 21 Jul 16:31 appName 

/Contents/Resources:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

Die erste App funktioniert gut und der zweite startet nie die ausführbare Datei. Was zum Teufel ist hier los? Es ist die gleiche App, auf demselben Computer, mit den gleichen Berechtigungen, aber die heruntergeladene funktioniert einfach nicht.

Dieses Problem tritt in allen OSX-Versionen auf verschiedenen Computern auf.

Antwort

5

die com.apple.security.inherit Anspruch auf die Hilfsanwendung löste dieses Problem für das Hinzufügen von mir.

Meine Helfer App stürzte mit Could not set sandbox profile data: Operation not permitted (1), als ich versuchte, es mit NSTask zu starten.

von Apple-Dokumentation:

Wenn Ihre Anwendung ein Kind Prozess entweder mit dem posix_spawn Funktion oder der NSTask Klasse erstellt beschäftigt, können Sie den untergeordneten Prozess konfigurieren Sie die Sandbox seiner Eltern zu erben. Die Verwendung eines untergeordneten Prozesses bietet jedoch nicht die durch die Verwendung eines XPC-Dienstes gebotene Sicherheit. com.apple.security.app-Sandbox und com.apple.security.inherit:

Um Sandbox Vererbung, muss ein Kind Ziel verwenden genau zwei App Sandbox Berechtigungsschlüssel zu aktivieren. Wenn Sie eine andere App Sandbox-Berechtigung angeben, bricht das System den untergeordneten Prozess ab. Sie können einem untergeordneten Prozess jedoch andere Fähigkeiten über iCloud und Benachrichtigungsansprüche zuweisen.

Die Hauptanwendung in einem Xcode-Projekt darf niemals einen YES-Wert für die Vererbungsberechtigung haben.

Ich hoffe, diese Lösung hilft.

+0

thx !!!! das half –

+0

kein Kind Prozess, Haupt-App wird abgestürzt coz dieser Ausgabe – Swati

+0

danke! Ich habe NSTask verwendet und das Hinzufügen der App Sandbox = NO Berechtigung hat mich gerettet. – iOSDec

0

Ich fand schließlich heraus, was dieses Problem verursacht, es passiert, wenn Sie versuchen, eine ausführbare Datei mit NSTask zu starten, die Dateien schreibt. Seltsamerweise funktioniert das in einigen Fällen wie im ursprünglichen Beitrag erwähnt. Aber um es auf anderen Computern zu arbeiten, endete ich mit STPrivilegedTask, die das Problem löste.

Verwandte Themen