在 Mac OSX 沙盒中读取文件

Reading a file in Mac OSX Sandbox

我正在尝试在应用程序沙箱外以沙箱模式读取文件。我经历了这个 objColumnist post, and definitely Apple's App Sandbox Design Guide documentation.

文档明确指出您需要 NSOpenPanelNSSavePanel 到 read/write 文件 Security-Scoped Bookmarks.

If your app employs a download or processing folder that is outside of the app container, obtain initial access by presenting an NSOpenPanel dialog to obtain the user’s intent to use a specific folder

我的用例有点不同,我想从 finder 读取文件。就像当用户从 finder 触发一些热键时,我将从 finder 中获取选择(使用脚本桥获取文件选择),然后读取该文件。因此我无法创建 Security-Scoped Bookmarks

那么有没有其他方法可以读取书签文件。或者除了脚本桥之外还有其他方法来获得适合应用程序沙箱的查找器选择。

除了下载、图片、电影和音乐,您绝对需要用户同意才能阅读文件。

您的应用程序可以使用 UTI 注册以读取某些类型的文件,然后您可以实施适当的应用程序委托方法来打开用户在查找器中双击的文件。比如当用户双击页面文档时页面是如何打开的。

除此之外,(除非您不使用沙盒)出于安全原因,您的应用受到限制。通过沙盒的唯一方法是使用 powerbox,它由 NSOpenPanel 和 NSSavePanel 透明地处理,开发人员不能直接访问。

有一种方法可以完成此操作:使用 NSService 在 Finder > 服务菜单中发布文件服务 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/SysServices/Articles/overview.html#//apple_ref/doc/uid/20000850-BCIDHJJA

用户在 Finder 中选择一个文件,通过上下文菜单、shortcut/hotkey 或 Finder 菜单调用服务。您将收到一个安全范围的书签,然后您可以通过该书签访问该文件。

Mac App Store 将不允许使用 AppleScript 的方式,因为您无法获得脚本 Finder 的权利。