2012-04-06 21 views
10

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.

+2

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

+0

@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

+0

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

Antwort

8

Es stellt sich heraus, dass ich eine entscheidende Berechtigung fehlt, nicht in der Benutzeroberfläche aufgeführt, aber aufgeführt in the documentation:

com.apple.security.files.bookmarks.app-scope 
+2

Danke, der Anspruch war, was ich brauchte, um diese Arbeit zu machen. Ich wollte nur hinzufügen, dass ich nicht mit Ihrem Update über -startAccessingSecurityScopedResource einverstanden bin. Wenn ich dies aus meinem Code heraus sage, kann ich keinen Zugriff mehr auf die Ressource erhalten. – escrafford

+0

Vielen Dank für das Teilen dieser Lösung. Ich habe ewig damit verbracht, meinen Code zu debuggen, nur um festzustellen, dass dieser Anspruch in Lion notwendig ist (in Mountain Lion ist es nicht). – Nickkk