NSSavePanel speichert keine Datei nach dem Sandboxing einer App

8

Ich habe ein Problem beim Speichern einer Zeichenkette mit NSSavePanel nach dem Sandboxing der App für den Mac App Store. Ich habe com.apple.security.files.user-selected.read-write auf YES gesetzt und die NSOpenPanel funktioniert so, wie sie sollte.

Wenn ich versuche, eine neue Datei zu speichern, scheint es, dass alles gut funktioniert, aber dann gibt es keine gespeicherte Datei, wo es sein sollte ....

Dies ist der Code, den ich zum Speichern der Datei verwende:

%Vor%     
Blue 22.05.2012, 19:32
quelle

1 Antwort

10
___ tag123cocoa ___ Cocoa ist Apples Entwicklungsumgebung für MacOS, bestehend aus Foundation, Application Kit und Core Data. Verwenden Sie den "Kakao-Touch" -Tag für iOS-Fragen. ___ tag123objectivec ___ Dieses Tag sollte nur bei Fragen verwendet werden, die sich auf Objective-C-Funktionen beziehen oder von Code in der Sprache abhängen. Die Tags [Kakao] und [Kakao-Touch] sollten verwendet werden, um nach Frameworks oder Klassen von Apple zu fragen. Verwenden Sie die verwandten Tags [ios], [macos], [apple-watch] und [tvos] für Probleme, die für diese Plattformen spezifisch sind. ___ qstntxt ___

Ich habe ein Problem beim Speichern einer Zeichenkette mit -[NSSavePanel filename] nach dem Sandboxing der App für den Mac App Store. Ich habe -[NSSavePanel URL] auf -[NSString writeToFile:atomically:encoding:error] gesetzt und die error:(NSError**) funktioniert so, wie sie sollte.

Wenn ich versuche, eine neue Datei zu speichern, scheint es, dass alles gut funktioniert, aber dann gibt es keine gespeicherte Datei, wo es sein sollte ....

Dies ist der Code, den ich zum Speichern der Datei verwende:

%Vor%     
___ tag123nssavepanel ___ Ein NSSavePanel-Objekt erstellt und verwaltet ein Save-Panel und ermöglicht Ihnen, das Panel in einer modalen Schleife auszuführen ___ tag123appstoresandbox ___ Eine Methode zum Beschränken des Zugriffs einer Anwendung auf Systemressourcen (Sandbox), die für Anwendungen erforderlich ist, die an den Mac App Store gesendet werden, und optional für Anwendungen, die nicht von AppStore stammen. ___ answer 10719948 ___

Zunächst ist der error Selektor veraltet. Verwenden Sie stattdessen if (error) . Zweitens, die Art, wie error Ihnen sagt, was Sie falsch machen, ist das Argument po error .

Sie sollten insbesondere auch Fehler für Datei-E / A behandeln, denn auch wenn Ihr Code zu 100% korrekt ist, können auf dem System des Benutzers Fehler auftreten (unzureichende Berechtigungen usw.) und der Fehler dem Benutzer präsentiert werden erlauben Sie ihnen zu sehen, dass es fehlgeschlagen ist (und haben Sie eine Idee warum). Wenn Sie den Fehler im Code behandeln, kann Ihre App wiederhergestellt werden. Wenn Sie beispielsweise versucht haben, die Datei unterhalb des eingefügten Codes (nach dem Schreiben auf die Festplatte) zu lesen, der Benutzer jedoch versucht hat, sie in eine Netzwerkfreigabe zu schreiben, auf die sie keinen Zugriff hatte, stürzt Ihre App möglicherweise ab. Wenn Sie wissen, dass der Schreibvorgang fehlgeschlagen ist, können Sie entsprechend vorgehen (möglicherweise nach einem anderen Speicherort fragen).

In diesem Fall glaube ich jedoch, dass die folgende Zeile Ihr Problem ist:

%Vor%

Wenn Ihre App Sandboxed ist, muss der Benutzer Ihnen die Berechtigung für entweder eine spezifische Datei oder ein spezifisches Verzeichnis über die Öffnen / Speichern-Bereiche geben Sandkasten. Was Sie tun, ist die Datei, die der Benutzer Ihnen gegeben hat, zu schreiben und zu sagen: "Das ist großartig, aber ich möchte eine andere Datei speichern", was gegen die Sandbox verstößt. Was Sie stattdessen tun sollten, ist die Erweiterung im Speichern-Panel. Die vollständige feste Lösung wäre:

%Vor%

Wenn in Zukunft etwas anderes nicht stimmt, können Sie den Wert von %code% zur Laufzeit überprüfen. Legen Sie beim Debuggen einen Haltepunkt in der %code% -Anweisung fest, um den Wert des %code% -Objekts zu prüfen (machen Sie einen %code% im Xcode-Debugger). Das sollte dir helfen, herauszufinden, was falsch ist.

    
___ qstnhdr ___ NSSavePanel speichert keine Datei nach dem Sandboxing einer App ___
Dov 23.05.2012, 12:30
quelle