OS X App Sandboxing и произвольный доступ к файлам - Обновление до документов?

Мое приложение OS X (в настоящее время не изолированное) позволяет получить доступ к файлам, содержащимся в каталоге, заданном пользователем (путь выбирается с помощью NSOpenPanel и ссылка на этот путь сохраняется на протяжении всего выполнения). Список файлов генерируется через NSDirectoryEnumerator и затем я читаю и записываю в эти файлы, используя AVAsset а также taglib (в C++ с мостовым заголовком) соответственно.

Как и ожидалось, включение Sandboxing в Xcode сделало приложение бесполезным, список файлов, предоставленных NSDirectoryEnumerator пусто, и даже если бы этого не было, я не смог бы читать и записывать файлы. Какие шаги мне нужно предпринять, чтобы сделать мое приложение совместимым с песочницей?

Должно ли мое приложение основываться на документах? Может ли мое приложение действительно быть "основанным на документах", поскольку у меня на самом деле нет нужных документов (например, у меня нет окна для файла, оно не соответствует стандартной модели приложения на основе документов)? Мое приложение - это просто табличное представление со ссылками на файлы в виде строк. Еще один важный момент: могу ли я использовать taglib для записи в мои файлы, если мое приложение основано на документе? Мне нужно передать taglib путь к моему файлу в виде строкового указателя, чтобы он работал.

Большое спасибо, эта тема в настоящее время довольно запутанная.

2 ответа

Решение

Вам не нужно преобразовывать свое приложение в документное, чтобы получить доступ к выбранным пользователем файлам и закладкам в области безопасности.

Я могу вспомнить две причины, по которым ваш текущий код не работает в изолированной среде:

  • У вас не установлена ​​возможность "Доступ к выбранному пользователем файлу" (Xcode > target > Capabilities > App Sandbox > File Access)
  • Вы используете API на основе пути /NSString перечислителя каталога вместо URL на основе NSURL.

Проект Vanilla Xcode с включенной изолированной программной средой и установленными возможностями выбранных пользователем файлов должен перечислять любой путь, полученный с помощью NSOpenPanel:

NSOpenPanel* panel =[NSOpenPanel openPanel];
panel.canChooseDirectories = YES;
[panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result) {
    NSFileManager *fileManager = [[NSFileManager alloc] init];
    NSURL *directoryURL = panel.URL;
    NSDirectoryEnumerator *enumerator = [fileManager
                                         enumeratorAtURL:directoryURL
                                         includingPropertiesForKeys:nil
                                         options:0
                                         errorHandler:nil];
    for (NSURL *url in enumerator) { 
        NSLog(@"url:%@", url);
    }
}];

Если вы хотите сохранить возможность доступа к определенным папкам из песочницы во время циклов запуска / выхода из приложения, вам нужно будет сохранить закладку в области безопасности. Этот пост содержит информацию о сохранении выбранного пользователем доступа к файлу / каталогу через закладку в области приложения: проблема с созданием закладки в области безопасности

Похоже, текущая функциональность превратится в песочницу просто отлично.

  1. Пользователь выбирает каталог через NSOpenPanel (который вызовет что-то под названием Powerbox в изолированной среде).
  2. Этот каталог теперь доступен для записи, так как пользователь явно выбрал его.
  3. Вы даже можете сохранить доступ для записи в этот каталог, создав закладку Security Scoped и сохраняя ее между сеансами.

Это не имеет никакого отношения к тому, чтобы быть основанным на Документах; это внутренний дизайн, который не связан с песочницей.

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