Закладки в области безопасности для каталога

Мне нужно дать полное разрешение на чтение / запись для каталога, в котором приложение записывает какой-либо файл в этот каталог. Я читал, что при использовании изолированного приложения для включения доступа к папке после перезапуска приложения требуется включить закладку с защитой от области доступа и доступ по URL-адресу.

Поэтому я пытаюсь реализовать его на основе приведенного здесь кода с незначительными изменениями. Как правильно обрабатывать устаревшие закладки NSURL?

     NSOpenPanel* openDlg = [NSOpenPanel openPanel];
    [openDlg setCanChooseDirectories:YES];
    [openDlg setCanCreateDirectories:YES];
    [openDlg setAllowsMultipleSelection:FALSE];
    if ( [openDlg runModal] == NSOKButton )
    {
        NSArray *files = [openDlg URLs];

        NSString* dirPath =[[files objectAtIndex:0] path];// absoluteString];
        BOOL isDirectory;
        NSFileManager* manager = [NSFileManager defaultManager];



        NSString *Dir = [dirPath stringByAppendingPathComponent:@"ScreenCaptures"];
        if (![manager fileExistsAtPath:Dir isDirectory:&isDirectory] || !isDirectory)
        {
            NSError *error = nil;

            [manager createDirectoryAtPath:Dir
               withIntermediateDirectories:NO
                                attributes:nil
                                     error:&error];
            if (error)
                NSLog(@"Error creating directory snap path: %@", [error localizedDescription]);

        }


            NSURL *url = [NSURL URLWithString:[Dir stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

            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);
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        [userDefaults setObject:bookmark forKey:@"bookmark"];

    }

Но приведенный выше код дает мне ошибку

016-08-20 02:19:53.390 FileAccess[635:85753] modalSession has been exited prematurely - check for a reentrant call to endModalSession:
2016-08-20 02:19:59.979 FileAccess[635:85753] Error creating bookmark for URL (/Users/development/Documents/c/ScreenCaptures): Error Domain=NSCocoaErrorDomain Code=262 "Scoped bookmarks can only be made with file URLs" UserInfo={NSURL=/Users/development/Documents/c/ScreenCaptures, NSDebugDescription=Scoped bookmarks can only be made with file URLs}
2016-08-20 02:20:00.021 FileAccess[635:85753] CFURLCopyResourcePropertyForKey failed because it was passed an URL which has no scheme
2016-08-20 02:20:04.967 FileAccess[635:85753] bookmark: (null)

В чем может быть проблема? Что-то не так в приведенном выше коде.

1 ответ

Решение

Ваше второе сообщение об ошибке говорит вам, что не так - вы не использовали файл:// URL.

Это можно исправить, правильно создав URL-адрес из переменной пути, однако вам, вероятно, будет лучше придерживаться URL-адресов повсюду и не выполнять преобразование URL -> path -> URL. Все операции, для которых вы использовали путь, могут быть выполнены напрямую с URL-адресами, просто проверьте документацию для NSFileManager а также NSURL, Единственное, что может быть неочевидным, это использование NSURL"s checkResourceIsReachableAndReturnError: скорее, чем NSFileManager"s fileExistsAtPath:Однако прочитайте документацию для checkResourceIsReachableAndReturnError: внимательно и примите его совет.

Внесение этих изменений должно касаться как минимум трех ошибок, о которых вы сообщили.

НТН

Другие вопросы по тегам