重复使用 Apple Sandbox 安全范围的书签

Posted

技术标签:

【中文标题】重复使用 Apple Sandbox 安全范围的书签【英文标题】:Reusing Apple Sandbox security-scoped bookmarks 【发布时间】:2014-06-17 07:51:00 【问题描述】:

我正在创建一个应用程序,它正在读取应用程序沙箱之外的文件。我需要用户的许可才能阅读这些文件,并且通过让用户在 NSOpenPanel 中选择路径,我已经让安全范围的书签工作。

我的问题是我不希望用户在每次应用程序访问同一路径时都授予我权限。我将书签保存在NSApplicationSupportDirectory 文件夹中。

这工作正常,直到用户重新启动计算机,然后保存的书签似乎变得无效。书签数据从磁盘加载时看起来完全正常,但应用程序需要新的安全范围的书签来读取文件,即使应用程序正在使用在重新启动之前工作的路径的书签。

我正在创建这样的书签:

NSData * bookmark  = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:&err];
NSURL* bookmarkUrl = [NSURL URLByResolvingBookmarkData:bookmark options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:&isStale error:&err]

我正在检查书签是否可以通过以下方式访问:

[url startAccessingSecurityScopedResource];
[[NSFileManager defaultManager] contentsOfDirectoryAtURL:url includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:&err]

if (err && err.code == NSFileReadNoPermissionError)

    NSLog(@"No URL access");
    res = NO;

else if(err)

    NSLog(@"URL validate unexpected error:%@", err);
    res = NO;


if (res)

    //Bookmark works!

[url stopAccessingSecurityScopedResource];

只要我不重新启动 Mac,它就可以工作。我可以退出应用程序并重新启动它,我的书签仍然有效。但是,一旦 Mac 重新启动,我就会收到 NSFileReadNoPermissionError 错误,即使我使用的是在我重新启动之前有效的已保存书签。

有没有办法创建在 Mac 重新启动时有效的书签?

【问题讨论】:

我不明白第一个代码片段的意思; NSURL -> NSData -> NSURL?这有什么作用? 它正在创建一个包含安全范围的新NSURL 没有必要。当我过去这样做时,我创建了一个类来处理从数据创建 URL(保存到 plist 文件)并将 URL 保存到 plist 文件,并且如果它是从 @ 创建的,则只记住该类987654330@ 对象或来自NSData 对象(通过 plist)。 为什么要在 Documents 文件夹中保存一个安全范围的书签?很抱歉,您的所作所为从一开始就是根本错误的。 哦,那是一个“错字”。我将它们保存在NSApplicationSupportDirectory 中。我很想看看它是如何以正确的方式完成的...... 【参考方案1】:

事实证明,我未能在开始和停止调用之间取得平衡。正如startAccessingSecurityScopedResource 的documentation 所述,这会使书签无效:

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

我最终还将书签存储在 NSUserDefaults 中,而不是 NSApplicationSupportDirectory 文件夹中的文件。

【讨论】:

以上是关于重复使用 Apple Sandbox 安全范围的书签的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 pushsharp 中的 tcp 客户端连接到 feedback.sandbox.apple.com

www.sandbox.itunes.apple.com 已关闭

与 APNS gateway.sandbox.push.apple.com 连接 2195 显示空白

为啥没有出现 Apple Push Notification Authentication Key (Sandbox & Production)

APNS:无法验证 courier.sandbox.push.apple.com 的证书链 - 未调用 didRegisterForRemoteNotificationWithDeviceToken

QQ邮箱反射型xss漏洞