【问题标题】:What does startAccessingSecurityScopedResource() actually do?startAccessingSecurityScopedResource() 实际上做了什么?
【发布时间】:2017-06-29 23:50:00
【问题描述】:

我正在制作一个沙盒 Mac 应用程序,我使用 NSOpenPanel 获取文件 URL,并将其作为安全范围的书签保存到 UserDefaults。当我退出并重新启动应用程序时,我可以再次将该数据块解析为 URL。

文档说我应该调用startAccessingSecurityScopedResource(),并检查它的返回值。 (当我调用它时,它确实返回 true。)但如果我不调用它,我仍然有一个解析的 URL,而且我似乎仍然有权访问它。

startAccessingSecurityScopedResource() 实际上是做什么的?如果我不打电话,会有什么不好的事情发生吗?

【问题讨论】:

  • 更新:我在 Mac App Store 中有一个应用程序已经好几个月了,至少有六个不同的版本。此应用从不调用 startAccessingSecurityScopedResource(),但 Apple 审阅者和我的任何用户都没有报告访问文件或文件夹的单个问题。

标签: macos nsurl foundation security-scoped-bookmarks


【解决方案1】:

只要您的应用仅访问标准位置(下载、音乐 电影、图片)并且您在应用中包含了所需的 entitlements for programmatic file and folder access,则无需为这些位置存储安全范围的书签。

但是对于在应用程序重新启动后应该仍然可以访问的其他位置,您应该存储安全范围的书签并在访问之前调用startAccessingSecurityScopedResource()。如果您跳过该步骤,您将在尝试访问该文件时立即收到异常。

startAccessingSecurityScopedResource() 使安全范围书签的资源可用于您应用的沙箱,从而授予您对该资源的访问权限。

【讨论】:

  • "如果您跳过该步骤,您将在尝试访问该文件时立即收到异常。"正如我在问题中所说,不,我没有。你看到这种行为了吗?您使用的是什么版本的 macOS?
  • @Ssswift 下面是重现崩溃的要点:gist.github.com/anonymous/ef56f55e0e9eb8da8d0514644a5c11b8(Xcode 9.2,macOS 10.13.3)
  • 谢谢,我有空去看看。不过,通过查看您的代码,我发现您正在使用“/tmp”,这对于 Mac 沙箱来说是一个有趣的案例,因为它是“/private”的符号链接。如果您尝试将 /tmp 与沙箱一起使用,很多事情的行为都会非常奇怪。
  • 我也遇到了这个问题,起初并不清楚这一切是如何工作的。我在这里写了一篇博客:benscheirman.com/2019/10/…
猜你喜欢
  • 2013-06-02
  • 2020-11-21
  • 2015-02-26
  • 2013-06-13
  • 2021-10-25
  • 2011-08-12
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多