我正在开发一个沙盒式Mac App Store应用程序,它会询问用户从哪里保存从其他地方下载的文件。我有这个代码从用户获取文件夹(删除一些错误检查):
NSOpenPanel* openPanel = [NSOpenPanel openPanel];
[openPanel setAllowsMultipleSelection:NO];
[openPanel setCanChooseDirectories:YES];
[openPanel setResolvesAliases:YES];
NSInteger result = [openPanel runModal];
NSArray* urls = [openPanel URLs];
NSURL* folderURL = [urls objectAtIndex:0];
NSError* error;
NSData* bookmakeData = [folderURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil
error:&error];
_saveFolderBookmark = bookmakeData;
当把文件移到这个文件夹时,我有这个代码:
BOOL isStale;
NSError* error;
NSURL* saveFolder = [NSURL URLByResolvingBookmarkData:_saveFolderBookmark
options:NSURLBookmarkCreationWithSecurityScope
relativeToURL:nil
bookmarkDataIsStale:&isStale
error:&error];
BOOL success = [saveFolder startAccessingSecurityScopedResource];
// Move the file somewhere else
NSWorkspace* workspace = [NSWorkspace sharedWorkspace];
NSInteger operationTag;
BOOL copied = [workspace performFileOperation:NSWorkspaceMoveOperation
source:[[self getDocumentsFolder] path]
destination:[saveFolder path]
files:[NSArray arrayWithObject:filename]
tag:&operationTag];
[saveFolder stopAccessingSecurityScopedResource];
要列出的很多代码可以说startAccessingSecurityScopedResource在从NSOpenPanel获取ULR后立即或在以后的运行中立即返回成功,并且书签数据保存在NSUserDefaults中。
在权利文件中,除其他项目外,我还有:
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
这段代码有什么问题吗?
答案 0 :(得分:8)
这个很容易。您正在使用NSURLBookmarkCreationWithSecurityScope而不是NSURLBookmarkResolutionWithSecurityScope进行解析。只需更改该行即可。
(在您创建书签的同一会话期间,当您已经有权访问该URL时,它可能无效,因为在这种情况下您不应该调用它。但是在以后的运行中它当然应该是因为这是重点。)
答案 1 :(得分:1)
上面已经给出了正确的解决方案,但我认为我会为那些有相同症状的人添加另一种可能性(startAccessingSecurityScopedResource
永不返回YES
)。确保您使用的是Powerbox返回的实际URL,该URL可能(可能会)与您尝试访问的实际资源的URL不同。例如,Powerbox会将URL返回到路径,您可以使用startAccessingSecurityScopedResource
来访问该目录下的特定文件。