2012-06-05 184 views
5

我正在开发一个沙盒的Mac App Store应用程序,该应用程序询问用户在何处保存从其他地方下载的文件。我有这样的代码来获取用户的文件夹(剔除一些错误检查):startAccessingSecurityScopedResource永远不会返回成功

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

你看到任何控制台消息?此外,仔细检查代码签名以确保配置正确。 – gaige

+0

在您的示例中,在打开面板完成后,“urls”数组来自哪里并不清楚。 – gaige

+0

当我删除错误检查时,我设法编辑出网址以获取网址。我又把它放回去了。在调用startAccessingSecurityScopedResource的行的控制台中没有消息。 –

回答

8

这一个很容易。您正在使用NSURLBookmarkCreationWithSecurityScope而不是NSURLBookmarkResolutionWithSecurityScope解决。只要改变这一行,它应该工作。

(它可能不是你创建书签在同一会话期间的工作,当你已经可以访问网址,因为你不应该把它叫在这种情况下要。但在以后运行,当然应该, ,因为这是整点。)

+0

现在非常明显,它被指出。让你想知道为什么有两个不同的常量。谢谢! –

+2

如果你看历史,这是有道理的。原始的BookmarkCreation和BookmarkResolution标志在10.6中没有任何很好的匹配对,所以它们是完全独立的位掩码值集合,并且在例如NSURLBookmarkCreationMinimalBookmark和NSURLBookmarkResolutionWithoutUI之间没有混淆的可能性。但是,如果他们为编译器添加了一些方法来警告你这件事,那会很好,不是吗? – abarnert

0

上面已经给出了正确的解决方案,但我想我会为那些有相同症状的人添加另一种可能性(startAccessingSecurityScopedResource永不返回YES)。确保您使用的是Powerbox返回的实际URL,它可能(可能会)与您试图访问的实际资源的URL不同。例如,Powerbox会将URL返回到一个路径,您将使用该路径与startAccessingSecurityScopedResource访问该目录下的特定文件。

相关问题