2012-08-30 9 views
6

Ich brauche meine Sandbox-App, um eine geöffnete Datei nach dem Neustart der App wieder zu öffnen. Apple bietet mit den Optionen NSURLBookmarkCreationWithSecurityScope und NSURLBookmarkResolutionWithSecurityScope in den NSURL-Methoden zum Erstellen und Auflösen von Lesezeichen sichere Lesezeichen. Diese Flags/Optionen sind jedoch nur für 10.7.3 oder höher geeignet und führen dazu, dass eine App vor 10.7.3 fehlschlägt.Mac App Store-Sandboxing und Umgang mit Sicherheits-Lesezeichen vor 10.7.3

Wie behalte ich das Speichern/Wiedereröffnen des Dateilesezeichens für 10.6 bis 10.7.3 in einer Sandbox-App?

-

FOLLOW-UP: Siehe meine Antwort unten. Das Problem wurde nicht durch die Verwendung von NSURLBookmarkCreationWithSecurityScope verursacht, sondern durch die Verwendung der Start/Stopp-Methoden für die Sicherheit im Lesebereich.

+0

Meine Vermutung ist, dass Sie wahrscheinlich nicht können. Dies war ein Mangel in ihrem Sandboxing-Ansatz und der zusätzliche Mechanismus wurde deshalb hinzugefügt. Und Apple ist nicht einer der Backport Dinge ... – Thilo

+2

Sind Sie sicher, dass das die Ursache für den Fehler ist? Ich habe eine App (in MAS), die '[NSURL URLByResolvingBookmarkData: Lesezeichenoptionen: NSURLBookmarkResolutionWithSecurityScope relativeToURL: nil bookwordDataIsStale: NO-Fehler: Nil];' das funktioniert gut auf 10.6.8 Maschinen. – Patrick

+0

@Patrick - funktioniert es gut auf 10.7 - 10.7.2? (Die Sandbox ist am 10.6.8 nicht betriebsbereit und die Auflösung der URL könnte alle Sicherheitsinformationen ignoriert haben, die von 10.7.3+ hinzugefügt wurden - nur Raten) – CRD

Antwort

9

Es stellt sich heraus, NSURLBookmarkCreationWithSecurityScope verursacht kein Problem mit 10.7 - 10.7.2. Was den Fehler verursacht, ruft -[NSURL startAccessingSecurityScopedResource]: auf, das vor 10.7.3 nicht unterstützt wird. Daher müssen Sie Aufrufe für diese Methode (und die entsprechende Stoppmethode) mit einer OS-Prüfung oder einer Antwort mit dem Befehl "answerToSelector" umbrechen. Ich habe getestet, dass das Lesezeichen immer noch in 10.7.1 funktioniert, solange Sie sicherstellen, dass Start/Stopp nicht aufgerufen wird.

Hier sind einige Code-Schnipsel für respondsToSelector verwenden, die alle anderen helfen, die zu diesem Problem führen in:

Mit dieser Nutzung zu starten:

if([bookmarkFileURL respondsToSelector:@selector(startAccessingSecurityScopedResource)]) { // only supported by 10.7.3 or later 
    [bookmarkFileURL startAccessingSecurityScopedResource]; // start using bookmarked resource 
} 

Und diese Nutzung zu stoppen:

if([bookmarkFileURL respondsToSelector:@selector(stopAccessingSecurityScopedResource)]) { // only supported by 10.7.3 or later 
    [bookmarkFileURL stopAccessingSecurityScopedResource]; // stop using bookmarked resource 
} 
+1

Warum nicht einfach nur die Version des Betriebssystems revalsToSelector verwenden? –

+0

@ Ben-Uri Sie haben Recht, 'AntwortenToSelector' ist eine bessere Implementierung als die Überprüfung der Betriebssystemversion. Ich habe die Antwort aktualisiert. – spurgeon