Création d'un security scoped bookmark avec NSSavePanel

klogklog Membre

Salut à  tous !


 


Je m'arrache les cheveux depuis hier en essayant en vain de créer un security scoped bookmark (via bookmarkDataWithOptions...) avec l'URL issue d'un NSSavePanel...


 


J'ai systématiquement nil en retour avec une erreur NSCocoaErrorDomain code 260.


 


Je n'ai pas de problème quand je fais la même chose suite à  un NSOpenPanel.


 


Donc ma question est triviale : peut-on combiner security scoped bookmark avec NSSavePanel ?


 


A la lecture de la doc Apple, et les NSOpenPanel héritant de NSSavePanel, j'imaginais que oui, mais là  je commence sérieusement à  douter ! :'(


 


Par avance merci pour vos tuyaux !


Cyril.


Réponses

  • klogklog Membre
    mars 2016 modifié #2

    C'est étrange... Après quelques tests, j'ai réussi à  créer ce fout@&u bookmark, mais selon l'endroit où je place sa création, ça fonctionne ou échoue :


     


    Echec (bookmark dès que le panel nous donne la main) :



    NSSavePanel *savePanel = [NSSavePanel savePanel];
    NSArray *documentsPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    savePanel.canCreateDirectories = NO;
    savePanel.allowedFileTypes = @[;@ttt];
    savePanel.allowsOtherFileTypes = NO;

    if (_lastFolderUrl)
    savePanel.directoryURL = _lastFolderUrl;
    else
    savePanel.directoryURL = [NSURL URLWithString:documentsPaths.firstObject];

    [savePanel beginSheetModalForWindow:_window completionHandler:^(NSInteger result) {

    NSError *error = nil;
    BOAResponse isStored = boa_failed;

    if (result == NSFileHandlingPanelOKButton)
    {
    NSURL *newUrl = savePanel.URL;


    NSData *data = [savePanel.URL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:&error];


    //////////////////////
    // save at current url
    [_managedObjectContext save:&error];

     

    Echec (bookmark après un save sur le NSManagedObjectContext) :


    NSSavePanel *savePanel = [NSSavePanel savePanel];
    NSArray *documentsPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    savePanel.canCreateDirectories = NO;
    savePanel.allowedFileTypes = @[;@ttt];
    savePanel.allowsOtherFileTypes = NO;

    if (_lastFolderUrl)
    savePanel.directoryURL = _lastFolderUrl;
    else
    savePanel.directoryURL = [NSURL URLWithString:documentsPaths.firstObject];

    [savePanel beginSheetModalForWindow:_window completionHandler:^(NSInteger result) {

    NSError *error = nil;
    BOAResponse isStored = boa_failed;

    if (result == NSFileHandlingPanelOKButton)
    {
    NSURL *newUrl = savePanel.URL;


    //////////////////////
    // save at current url
    [_managedObjectContext save:&error];


    NSData *data = [savePanel.URL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:&error];


    if (!error)
    {

    ////////////////////////
    // migrate to the newUrl
    [[NSFileManager defaultManager] removeItemAtURL:newUrl error:nil];

    [_persistentStoreCoordinator migratePersistentStore:_persistentStoreCoordinator.persistentStores.lastObject toURL:newUrl options:nil withType:NSBinaryStoreType error:&error];

     


     

    Succès (bookmark après un migratePersistentStore) :



    NSSavePanel *savePanel = [NSSavePanel savePanel];
    NSArray *documentsPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    savePanel.canCreateDirectories = NO;
    savePanel.allowedFileTypes = @[;@txt];
    savePanel.allowsOtherFileTypes = NO;

    if (_lastFolderUrl)
    savePanel.directoryURL = _lastFolderUrl;
    else
    savePanel.directoryURL = [NSURL URLWithString:documentsPaths.firstObject];

    [savePanel beginSheetModalForWindow:_window completionHandler:^(NSInteger result) {

    NSError *error = nil;
    BOAResponse isStored = boa_failed;

    if (result == NSFileHandlingPanelOKButton)
    {
    NSURL *newUrl = savePanel.URL;


    //////////////////////
    // save at current url
    [_managedObjectContext save:&error];


    if (!error)
    {

    ////////////////////////
    // migrate to the newUrl
    [[NSFileManager defaultManager] removeItemAtURL:newUrl error:nil];

    [_persistentStoreCoordinator migratePersistentStore:_persistentStoreCoordinator.persistentStores.lastObject toURL:newUrl options:nil withType:NSBinaryStoreType error:&error];


    NSData *data = [savePanel.URL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:&error];

     

     

    Quelqu'un peut-il me dire la raison de ce comportement ? Faut-il qu'il y ait un accès effectif au disque ? Je suis dans le flou le plus total, et j'aime pas qu'un truc marche sans comprendre pourquoi... ::)


     


    Dans le cas d'un NSOpenPanel, j'arrive à  créer le bookmark dès le début du block.


     


    Merci,


    Cyril.


Connectez-vous ou Inscrivez-vous pour répondre.