【发布时间】: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中。我很想看看它是如何以正确的方式完成的......
标签: objective-c macos appstore-sandbox