Le problème que vous rencontrez est pas persistant quoi que ce soit, il est à peu près comment fonctionne bac à sable:
La règle est ...
Pour renommer un fichier (en fait effectuer une opération de déplacement),
vous devez avoir un accès en écriture au répertoire parent du fichier.
Notre problème est ...
Si vous faites glisser fichiers, Sandbox ne étendre l'accès à ces fichiers, et non pas leur répertoire parent, d'où cette erreur en disant qu'il a besoin d'une autorisation
Maintenant, essayez de faire glisser le dossier contenant ces fichiers, et vous verrez que tout fonctionne juste :)
Alors, que faisons-nous?
Une solution simple serait de demander à l'utilisateur de choisir via NSOpenPanel un « travail » répertoire, de sorte que l'accès sans bac à sable a aliénant l'utilisateur à chaque fois qu'il souhaite renommer
Mais nous tracasse maintenant l'utilisateur merde il ne devrait même pas savoir au sujet de la première place!
Donc, pour moi, c'est une mauvaise conception/UX
Maintenant, j'ai lu la documentation sur bac à sable et je remarqué NSFileCoordinator avait une méthode appelée itemAtURL:willMoveToURL:
Wich m'a conduit à ce petit snippet (que je réécris ici parce qu'il lui manquait la fonction WillMove)
ce que nous voulons faire ici est de demander une extension de bac à sable pour le bien de changement de nom:
NSURL *sourceURL = document.fileURL;
NSURL *destinationURL = [[sourceURL URLByDeletingLastPathComponent] URLByAppendingPathComponent:fileName isDirectory:NO];
NSError *writeError = nil;
__block NSError *moveError = nil;
__block BOOL success = NO;
NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
[coordinator coordinateWritingItemAtURL:sourceURL
options:NSFileCoordinatorWritingForMoving
writingItemAtURL:destinationURL
options:NSFileCoordinatorWritingForReplacing
error:&writeError
byAccessor:^(NSURL *newURL1, NSURL *newURL2)
{
NSFileManager *fileManager = [NSFileManager new];
[coordinator itemAtURL:sourceURL willMoveToURL:destinationURL];
success = [fileManager moveItemAtURL:newURL1 toURL:newURL2 error:&moveError];
if (success)
{
[coordinator itemAtURL:newURL1 didMoveToURL:newURL2];
}
}];
Malheureusement, il semble que cette méthode ne vise à changer l'extension du fichier plutôt que de renommer, d'où cette erreur dans le journal:
NSFileSandboxingRequestRelatedItemExtension: an error was received from pboxd instead of a token. Domain: NSPOSIXErrorDomain, code: 1
Yay, pomme, yay
Êtes-vous résoudre définitivement le signet sécurisé avant de tenter d'accéder à ce chemin? – Dov
Oui, je résolve définitivement le signet et commence l'accès sécurisé. – Mark
Pourriez-vous donner plus de code? Peut-être assez pour que quelqu'un puisse reproduire votre problème? À l'heure actuelle, il n'y a pas grand chose à faire. De plus, obtenez-vous accès au chemin d'accès et au chemin de destination? – Dov