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);
}
}];
Если вы хотите сохранить возможность доступа к определенным папкам из песочницы во время циклов запуска / выхода из приложения, вам нужно будет сохранить закладку в области безопасности. Этот пост содержит информацию о сохранении выбранного пользователем доступа к файлу / каталогу через закладку в области приложения: проблема с созданием закладки в области безопасности
Похоже, текущая функциональность превратится в песочницу просто отлично.
- Пользователь выбирает каталог через
NSOpenPanel
(который вызовет что-то под названием Powerbox в изолированной среде). - Этот каталог теперь доступен для записи, так как пользователь явно выбрал его.
- Вы даже можете сохранить доступ для записи в этот каталог, создав закладку Security Scoped и сохраняя ее между сеансами.
Это не имеет никакого отношения к тому, чтобы быть основанным на Документах; это внутренний дизайн, который не связан с песочницей.