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.
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
@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
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