2012-04-06 6 views
10

Je convertis mon application Lion pour utiliser l'application Sandbox. J'essaie d'utiliser la fonctionnalité security-scoped bookmarks introduite en 10.7.3 pour permettre l'accès persistant à un dossier. Le code que j'ai ci-dessous renvoie un signet nul et produit le message de journal suivant: XPC couldn't look up the Mach service for scoped bookmarks agent.Problème lors de la création du signet Sécurité-Scoped

J'ai défini le droit User Selected File Access sur Read/Write Access, et j'ai également essayé avec et sans les appels ..AccessingSecurityScopedResource environnants.

Je pense que je fais tout correctement selon la documentation, donc j'apprécierais n'importe quel pointeur. Le code fonctionnait pour récupérer une URL normale avant que j'aie commencé à bac à sable l'application.

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); 
} 

Mise à jour (x3)

Maintenant que je l'ai eu à travailler, je peux vérifier que les appels à -startAccessingSecurityScopedResource et -stopAccessingSecurityScopedResource ne sont pas nécessaires dans le code ci-dessus, étant donné que les subventions Powerbox accès à la ressource après que l'utilisateur l'ait sélectionné dans le NSOpenPanel. Si vous créez un signet à partir d'une autre URL de sécurité, par exemple en créant un signet de portée documentaire à partir d'un signet d'application créé dans une autre session d'application, vous devez d'abord accéder au fichier.

+2

Les appels de démarrage/arrêt ne sont jamais nécessaires lors d'un signet. Vous avez déjà accès à NSOpenPanel. Le signet enregistre cet accès pour les prochaines sessions. Et ces futures exécutions sont l'endroit où vous devrez appeler startAccessingSecurityScopedResource (sur l'URL que vous récupérez à partir de la résolution du signet). – abarnert

+0

@abarnert Je crois que vous avez raison, puisque dans le code que j'ai posté j'utilise un NSOpenPanel, mais vous en avez besoin si vous créez un signet depuis une source autre qu'un NSOpenPanel ou un NSSavePanel (comme comme faire un nouveau signet d'un existant pour en changer la portée). J'ai mis à jour mon message. – Dov

+0

La documentation a fait saigner mes yeux jusqu'à ce que je trouve des signets de sécurité "et ceci est vraiment un exemple de code utile. Je n'ai pas le pouvoir de créer un tag, est-ce que je pourrais suggérer d'ajouter un tag "security-scoped bookmark"? – Mark

Répondre

8

Il se trouve que je manque un droit essentiel, ne figure pas dans l'interface utilisateur, mais dans la liste the documentation:

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

Merci, le droit était ce dont j'avais besoin pour faire ce travail. Je voulais juste ajouter que je ne suis pas d'accord avec votre mise à jour sur -startAccessingSecurityScopedResource n'étant pas nécessaire; si je commente cela hors de mon code, je ne peux plus avoir accès à la ressource. – escrafford

+0

Merci beaucoup de partager cette solution. J'ai passé des années à débugger mon code pour découvrir que ce droit est nécessaire chez Lion (dans Mountain Lion ce n'est pas le cas). – Nickkk

Questions connexes