QLPreviewView 无法在沙盒中显示 quicklook 预览

QLPreviewView can not show the quicklook preview in sandbox

我使用 QLPreviewView 在应用程序中显示快速预览。没有沙箱,这很好用,但是一旦将应用程序更改为沙箱,预览将无法显示。

我在控制台中发现错误:QuickLookUIHelpe(20786) deny file-read-data XXX.

我已使用 安全范围书签 & com.apple.security.files.user-selected.read-write 授予访问权限用户主目录,然后:

[allowedURL startAccessingSecurityScopedResource];
self.myPreiviewItem.myURL = fileURL;
self.myQLPreviewView.previewItem = self.myPreiviewItem;
[self.myQLPreviewView refreshPreviewItem];
[allowedURL stopAccessingSecurityScopedResource];

有了这些,我可以删除用户主目录的文件,但 QLPreviewView 无法工作。 我不知道这两个场景有什么区别,QLPreviewView 是否需要更多的沙箱?

如果我在授权中添加com.apple.security.files.downloads.read-only,"Downloads"中的文件可以预览,但用户home目录下的其他文件不能预览。

我不久前(在 Mavericks 中)遇到过这个问题,或者至少是类似的问题。

这就是为什么我开始要求用户访问他们希望快速查看的文件的父文件夹。请随意查看我在撰写本文时的 1.1 版 this app of mine 中的操作方法。只需进入 Chikoo → 首选项... → 文件夹访问。这是两个屏幕截图:

我承认这不是一个很好的解决方案。这是我想出的解决问题的折衷方案。

终于找到解决办法了!

refreshPreviewItem是一个异步调用,所以在Mac加载完预览之前,下面的apistopAccessingSecurityScopedResource立即关闭了访问,结果,Mac未能成功加载预览。

所以解决方法是:这里不要调用stopAccessingSecurityScopedResource,保持allowedURL的访问权限,直到不需要QL预览功能,再调用stopAccessingSecurityScopedResource还有,比如关闭的时候window.