2017-02-11 6 views
2

Я создаю изолированное Mac приложение, и я использовал NSOpenPanel для получения URL-адреса файла и сохранил его в UserDefaults в качестве закладки с защитой. Когда я уйду и перезагрузите приложение, я снова смогу разрешить этот блок данных в URL.Что делает startAccessingSecurityScopedResource() на самом деле?

В документации указано, что я должен позвонить по номеру startAccessingSecurityScopedResource() и проверить его возвращаемое значение. (Это возвращает true, когда я это называю.) Но если я этого не назову, у меня все еще есть разрешенный URL-адрес, и у меня все еще есть разрешения на его доступ.

Что на самом деле startAccessingSecurityScopedResource()? Есть ли что-то плохое, что может случиться, если я не позвоню?

+0

Обновление: У меня было приложение в Mac App Store в течение нескольких месяцев, по крайней мере, в полдюжины различных версий. Это приложение никогда не вызывает 'startAccessingSecurityScopedResource()', но ни обозреватели Apple, ни мои пользователи не сообщали об одной проблеме с доступом к файлам или папкам. – Ssswift

ответ

1

Пока ваше приложение имеет доступ только к файлам в стандартных местах (загрузка, музыка Movies, Pictures), и вы включили в свое приложение entitlements for programmatic file and folder access, вам не нужно хранить закладки с защитой для этих мест.

Но для других местоположений, которые должны оставаться доступными после перезапуска приложения, вы должны сохранить закладки в области безопасности и позвонить по номеру startAccessingSecurityScopedResource() перед доступом. Если вы пропустите этот шаг, вы получите исключение, как только попытаетесь получить доступ к этому файлу.

startAccessingSecurityScopedResource() обеспечивает доступ к ресурсу закладки с областью действия безопасности в виде песочницы вашего приложения, предоставляя вам доступ к этому ресурсу.

+0

«Если вы пропустите этот шаг, вы получите исключение, как только попытаетесь получить доступ к этому файлу». Как я сказал в вопросе, нет, я этого не делаю. Вы видите это поведение? Какую версию macOS вы используете? – Ssswift

+1

@Ssswift Вот суть, чтобы воспроизвести крах: https://gist.github.com/anonymous/ef56f55e0e9eb8da8d0514644a5c11b8 (Xcode 9.2, macOS 10.13.3) – seb

+0

Спасибо, я проверю это, когда у меня будет время. От взгляда на ваш код, я вижу, что вы используете «/ tmp», хотя это забавный случай с песочницей Mac, потому что это символическая ссылка на «/ private». Многие вещи ведут себя очень странно, если вы попытаетесь использовать/tmp с песочницей. – Ssswift

Смежные вопросы