问题标签 [security-scoped-bookmarks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
386 浏览

nsurl - 安全范围书签的当前内核资源限制是什么?

状态的文档-[NSURL startAccessingSecurityScopedResource]

您必须平衡对 startAccessingSecurityScopedResource 方法的每次调用与对 stopAccessingSecurityScopedResource 方法的相应调用。如果您在不再需要文件系统资源时未能放弃访问权限,则您的应用程序会泄漏内核资源。如果泄漏了足够的内核资源,您的应用程序将失去将文件系统位置添加到其沙箱的能力,例如通过 Powerbox 或安全范围的书签,直到重新启动。

任何人都可以了解内核资源的实际限制是什么吗?

我不希望我的应用程序达到这些确切的限制,只是知道一个大概的数字会有所帮助,这样我就可以判断代码是否曾经做过任何危险/愚蠢的事情。

0 投票
1 回答
762 浏览

nsurl - 如何将 plist 中的 NSURL 绑定到沙盒应用程序中的 NSPathControl?

我的 OS X 应用程序需要持久访问用户选择的目录。在我打开应用沙箱之前,UI 有一个 NSPathControlvalue绑定到数据模型。模型中的数据类型是NSData,并且绑定使用了NSKeyedUnarchiveFromData值转换器。效果很好。

打开应用程序沙盒后,这显然会失败,因为 NSURL 不是安全范围。为了解决这个问题,我用NSKeyedUnarchiveFromData自己的变压器替换了绑定中的变压器,如下所示。

不幸的是,它并不总是正常工作。有时,当我(作为用户)从 NSPathControl 中选择一个文件时,transformedValue:即使传递给它的 NSData 参数不是 nil,也会返回 nil。换句话说,NSURL 不解析书签数据。有人知道这里发生了什么吗?当它失败时,返回的错误URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:

错误域 = NSCocoaErrorDomain 代码 = 259 “文件无法打开,因为它的格式不正确。”

0 投票
1 回答
4180 浏览

cocoa - 处理陈旧的 NSURL 书签的正确方法是什么?

从安全范围的书签解析 NSURL 时,如果用户重命名或移动了该文件或文件夹,则该书签将过时。Apple 的文件对陈旧性进行了说明:

是陈旧的

返回时,如果是,则书签数据已过时。您的应用应使用返回的 URL 创建一个新书签,并使用它来代替现有书签的任何存储副本。

不幸的是,这对我来说很少有用。它可能有 5% 的时间工作。尝试使用返回的 URL 创建新书签会导致错误(代码 256),并且在控制台中查看会显示来自 sandboxd 的消息,说在更新的 URL 上拒绝文件读取数据。

注意如果重新生成书签确实有效,它似乎只在第一次重新生成时有效。如果文件夹/文件再次移动/重命名,它似乎永远不会起作用。

我最初如何创建和存储书签

解析书签的代码

当书签过时时,生成的解析 URL 确实指向正确的位置,尽管 [url startAccessingSecurityScopedResource] 返回 YES,但我实际上无法访问该文件。

也许我误解了有关过时书签的文档,但我希望我只是在做一些愚蠢的事情。每次重命名或移动带书签的文件/文件夹时弹出一个 NSOpenPanel,此时我唯一的其他选择似乎很荒谬。

我应该补充一点,我将com.apple.security.files.bookmarks.app-scopecom.apple.security.files.user-selected.read-writecom.apple.security.app-sandbox都设置为 true在我的权利文件中。

0 投票
1 回答
327 浏览

objective-c - 安全范围的书签在 Yosemite 10.10 上停止工作

我正在使用以下代码生成安全范围的书签。这在 10.8 和 10.9 上运行良好,但在 10.10 上已停止运行。我不知道要检查什么?

我已启用 App Sandbox 权利并添加了 com.apple.security.files.user-selected.read-write 和 com.apple.security.files.bookmarks.app-scope 权利。

以上是生成一个 URL,但它不是安全范围的。因此,当记录它时,它是通常的文件路径,而不是以前发生的 ? 然后是一堆字符。

任何帮助或想法表示赞赏

0 投票
1 回答
177 浏览

cocoa - 优胜美地中外部驱动器的 NSURL 书签解析失败

在我的可可应用程序中,我使用以下代码从我从 NSOpenPanel 获得的 NSURL 创建一个安全范围的书签:

为了解决它,我使用:

在 Mac OS X Mavericks (10.9) 中,当我为外部驱动器(如 USB 记忆棒)创建书签时,这可以正常工作。但在 Yosemite (10.10) 中,如果未安装外部驱动器,则书签分辨率不会nil像在 Mavericks 中那样返回。相反,它返回一个指向 Macintosh HD 的 url(即[myURL path]返回字符串@"/")。我注意到在这种情况下isStale==YES

其他人是否遇到过同样的问题?这是优胜美地中的一个已知错误,还是我错过了一些额外的步骤来处理这种情况?有解决方法吗?

0 投票
2 回答
1678 浏览

macos - 应用扩展中的安全范围书签

我正在创建一个 TodayWidget 应用程序扩展,它显示有关用户在应用程序目录之外选择的文件夹的信息。

在我的主应用程序中,我可以通过 NSOpenPanel 使用 powerbox 来选择文件夹。然后,我可以将一个安全范围的书签保存到我的 TodayWidget 可访问的应用程序组容器的用户默认值中。

TodayWidget 可以读取书签数据,但是当它调用URLByResolvingBookmarkData时,它会出错:

The file couldn’t be opened because it isn’t in the correct format.

我的主应用程序和 TodayWidget 都具有以下权利:

  • com.apple.security.files.bookmarks.app-scope
  • com.apple.security.files.user-selected.read-only

从 Apple 的文档中,只有创建安全范围书签的应用程序才能使用它。我猜这些意味着不允许嵌入式应用程序?

我已经考虑过使用 XPC,但这并不能真正解决问题,因为 XPC 也不能使用安全范围的书签,只能使用普通书签。一旦计算机重新启动,XPC 进程将失去对目录的访问权限。

我真正需要的是一种让 XPC 进程获得对用户指定目录的读取访问权限的方法。有没有办法不必每次重新启动计算机都重新启动我的主应用程序?

0 投票
1 回答
406 浏览

objective-c - 如何正确实现 QLPreviewPanel 数据源,同时牢记安全范围的 URL?

当尝试组合快速查看预览面板和安全范围的 URL 时,会出现 Cocoa 中选择不当、不可组合的抽象的问题。

我有一个具体的例子:

想象一下,我们正试图显示来自 MediaLibrary 的某些对象的预览(MediaLibrary.framework 允许应用程序通过方便的 API 浏览 iPhoto、Aperture... 和照片库)。

最简单直接的方法是调整“MLMediaObject”类(表示特定的照片或视频项目)以实现“QLPreviewItem”协议(可以传递给 QLPreviewPanel):

MLMediaObject+PreviewItem.h

MLMediaObject+PreviewItem.m

简单的。现在想象以下 QLPreviewPanel 数据源实现:

相册视图控制器.m

到目前为止,一切都很好。但是,如果我们查看稀疏且通常具有误导性的 Apple 文档,我们可能会发现以下重要细节:

URL
媒体对象的位置。(只读)
此属性作为安全范围的 URL 提供。为了访问该 URL 所引用的文件,调用者必须在使用该 URL 访问该文件startAccessingSecurityScopedResource之前和之后调用。stopAccessingSecurityScopedResource

因此,很明显,对资源的访问必须用startAccessingSecurityScopedResource/stopAccessingSecurityScopedResource调用对括起来。

问题是在给定当前QLPreviewPanelDataSource协议定义的情况下我应该把这些调用放在哪里?访问资源取决于 QLPreviewPanel,而不是我的代码,但不幸的是,我几乎不会相信 Apple 更新了 QL 以在沙盒环境中运行。

startAccessingSecurityScopedResource当呼叫返回时,我如何处理这些情况,NO说明无法获得访问权限?

似乎当您尝试startAccessingSecurityScopedResource访问已被访问的 URL 时,您会在返回时获得失败标志。就像,一切都很好,但是你得到一个错误标志。似乎这些开始/停止......调用必须精确配对,甚至禁止平衡嵌套。那么,当您获得返回时如何区分这两种可能性NO:已被访问的安全范围 URL 和未能“解析”的安全范围 URL?

这是一个经过实验证明的事实,您的应用程序只能访问有限数量的安全范围 URL(在它静默停止工作之前,您可以获取大约 1500 个 URL)。那么,在将安全范围的 URL 传递给 QLPreviewPanel 之后,我应该如何正确放弃对它们的访问?什么时候这样做合适?在我看来,它是 QLPreviewPanel 类的私有实现细节,我无法对其内部工作做出任何假设。

0 投票
0 回答
327 浏览

macos - 将文档移动到另一台机器后,安全范围的书签无法解析

我正在使用基于文档的安全范围书签来存储对文档中文件的引用。我像这样创建它们:

relativeURL包含将存储书签的文档的 URL 。

我稍后使用以下方法解析书签:

只要文档和引用的文件保留在初始机器上,这就会起作用。然后我可以移动并重命名它们,它们会继续工作。

另一方面,如果我压缩包含文档和文件的文件夹,并将它们解压缩到另一台机器上,则书签无法解析。

出现的错误是code 4: File doesn't exist. 我验证文档仍然包含其安全范围属性并且确实如此。当然,文档和引用的文件实际上都存在。

我尝试从相对 URL 创建书签数据,但这并没有改变任何东西。从书签请求 URL 总是显示一个绝对 URL。

当文档和文件传输到另一台机器时,如何确保书签解析?

更新

苹果已经确认了这个问题。它在radar: 24126953. 不幸的是,有人告诉我,他们内部不同意是否应该解决这个问题。我希望他们有一天会。

0 投票
1 回答
254 浏览

macos - 文档范围的安全书签如何存储在 Core Data 中?

我一直在制作一个包含多个目标的应用程序,它们作为一个应用程序组相互合作。

当我开始将其设为沙盒时,问题就来了:

  • 应用程序将 URL 存储在核心数据中,一个目标进行保存,另一个目标进行读取
  • 现在一个目标创建的书签不能被另一个解决

我知道可以在应用程序之间共享文档范围的书签。但似乎它们需要存储到另一个“包装”文档中。

有没有一种好方法可以在 Core Data 中存储文档范围的书签并在不同的目标之间共享它们?

0 投票
1 回答
149 浏览

macos - 应用程序范围的安全范围书签可以从一台 Mac 复制到另一台吗?

我有一个沙盒应用程序,它使用可以包含嵌入文件名的文档格式。例如,这些参考文件中的一些用于用户选择的图像文件,以便将图像文件与存储在文档中的数据相关联。虽然此类图像有时会位于用户图片文件夹中,但有时它们会位于其他位置。出于可移植性原因,文档格式本身无法更改(与现有 Windows 版本的应用程序共享)。

为了让应用程序能够访问其名称嵌入在文档中的文件,当用户选择一个文件名(使用 nsopenpanel)以像这样存储在文档中时,应用程序还会创建一个应用程序范围的安全范围书签对于每个这样的存储文件名。然后它通过将这些书签序列化到另一个文件来存储它们。当应用程序再次运行时,它会加载其先前序列化的书签并在访问“嵌入”文件名时使用它们,并且工作正常。

但是,当我将这样的文档(及其相关的序列化书签文件)从一台 Mac 复制到另一台 Mac 时,它不起作用,即使已知书签引用的所有文件都存在于两台 Mac 上。发生的情况是,虽然应用程序可以正常打开文档文件(在用户使用 nsopenpanel 选择它之后),并从其关联的序列化书签文件(用户再次使用 nsopenpanel 选择)中成功读取序列化书签,即使已知书签所指的完全相同的文件名存在于另一台 Mac 上(用户可以通过 finder 等访问),但沙盒应用程序仍然无法访问它们。解析书签似乎失败了。

问题是:应用范围内的书签是否仅限于在创建它们的 Mac 上工作?如果我无法将应用程序范围的书签从一个系统移动到另一个系统,那么在不强制用户必须手动重新选择每个使用 nsopenpanel 的“嵌入”文件名的情况下,我还能如何实现我想要的效果?

试图在 Apple 文档中找到这个问题的答案,但没有成功。

我认为毫无疑问,安全范围的书签只能由创建它们的应用程序使用。