【问题标题】:startAccessingSecurityScopedResource never returns successstartAccessingSecurityScopedResource 永远不会返回成功
【发布时间】:2012-06-09 04:11:52
【问题描述】:

我正在开发一个沙盒 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/>

这段代码有什么问题吗?

【问题讨论】:

  • 您是否看到任何控制台消息?此外,请仔细检查代码签名以确保配置正确。
  • 在您的示例中,在打开面板完成后,尚不清楚 urls 数组的来源。
  • 当我删除错误检查时,我设法编辑了获取 url 的行。我又放回去了。调用 startAccessingSecurityScopedResource 的行周围的控制台中没有消息。

标签: objective-c macos cocoa appstore-sandbox


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这个很简单。您正在使用 NSURLBookmarkCreationWithSecurityScope 而不是 NSURLBookmarkResolutionWithSecurityScope 进行解析。只需更改该行,它应该可以工作。

    (在您创建书签的同一会话期间,当您已经可以访问该 URL 时,它可能不起作用,因为在这种情况下您不应该调用它。但在以后的运行中,它当然应该,因为这就是重点。)

    【讨论】:

    • 现在很明显,它已经被指出了。让你想知道为什么有两个不同的常数。谢谢!
    • 如果你看历史,那是有道理的。 10.6 中的原始 BookmarkCreation 和 BookmarkResolution 标志集没有任何匹配良好的对,因此它们是完全独立的位掩码值集,并且不会混淆,例如 NSURLBookmarkCreationMinimalBookmark 和 NSURLBookmarkResolutionWithoutUI。但是,如果他们为编译器添加一些方法来警告您这将是很好的,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 2011-07-25
    • 1970-01-01
    • 2012-10-02
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多