Ich konvertiere meine Lion-App in die App Sandbox. Ich versuche, das in 10.7.3 eingeführte Feature security-scoped bookmarks zu verwenden, um dauerhaften Zugriff auf einen Ordner zu ermöglichen. Der Code, den ich unten habe, gibt ein Null-Lesezeichen zurück und erzeugt die folgende Protokollmeldung: XPC couldn't look up the Mach service for scoped bookmarks agent
.Problem beim Erstellen eines Sicherheits-Scoped-Lesezeichen
Ich setze die User Selected File Access
Berechtigung auf Read/Write Access
, und versuchte auch mit und ohne die umliegenden ..AccessingSecurityScopedResource
Anrufe.
Ich denke, ich mache alles richtig nach der Dokumentation, also würde ich alle Hinweise zu schätzen wissen. Der Code arbeitete, um eine einfache URL abzurufen, bevor ich mit dem Sandboxing der App begann.
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseFiles:NO];
[openPanel setCanChooseDirectories:YES];
[openPanel setAllowsMultipleSelection:NO];
NSInteger result = [openPanel runModal];
if(result == NSFileHandlingPanelCancelButton) {
return;
}
NSArray *urls = [openPanel URLs];
if(urls != nil && [urls count] == 1) {
NSURL *url = [urls objectAtIndex:0];
NSData *bookmark = nil;
NSError *error = nil;
bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil // Make it app-scoped
error:&error];
if (error) {
NSLog(@"Error creating bookmark for URL (%@): %@", url, error);
[NSApp presentError:error];
}
NSLog(@"bookmark: %@", bookmark);
}
Update (x3)
Jetzt, wo ich es habe funktioniert, kann ich überprüfen, ob die Anrufe -startAccessingSecurityScopedResource
und -stopAccessingSecurityScopedResource
in dem obigen Code nicht notwendig sind, da die Powerbox gewährt den Zugriff auf die Ressource nachdem der Benutzer es in NSOpenPanel
auswählt.
Wenn Sie ein Lesezeichen aus einer anderen URL mit Sicherheitsbereich erstellen, z. B. ein Lesezeichen im Dokumentenbereich von einem in einer anderen App-Sitzung erstellten anwendungsspezifischen Lesezeichen erstellen, müssen Sie zuerst auf die Datei zugreifen.
Die Start/Stopp-Anrufe nie notwendig sind, wenn ein Lesezeichen zu machen. Sie haben bereits Zugriff von NSOpenPanel. Das Lesezeichen speichert diesen Zugriff für zukünftige Läufe. Und bei diesen zukünftigen Ausführungen müssen Sie startAccessingSecurityScopedResource (auf der URL, die Sie von der Auflösung des Lesezeichens zurückbekommen) aufrufen. – abarnert
@abarnert Ich glaube, du hast recht, denn in dem Code, den ich gepostet habe, benutze ich ein 'NSOpenPanel', aber du brauchst es, wenn du ein Lesezeichen von einer anderen Quelle als' NSOpenPanel' oder 'NSSavePanel' (z als ein neues Lesezeichen von einem bestehenden zu machen, um seinen Umfang zu ändern). Ich habe meinen Beitrag aktualisiert. – Dov
Die Dokumentation hat meine Augen bluten lassen, bis ich "Sicherheits-Lesezeichen" gefunden habe und das ist wirklich hilfreicher Beispielcode. Ich habe nicht die Möglichkeit, ein Tag zu erstellen. Kann ich vorschlagen, dass wir ein Tag "Sicherheits-Lesezeichen" hinzufügen? – Mark