startAccessingSecurityScopedResource永远不会返回成功

Gar*_*kin 6 macos cocoa objective-c appstore-sandbox

我正在开发一个沙盒式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;
Run Code Online (Sandbox Code Playgroud)

当把文件移到这个文件夹的时候,我有这个代码:

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];
Run Code Online (Sandbox Code Playgroud)

要列出的很多代码可以说startAccessingSecurityScopedResource在从NSOpenPanel获取ULR之后或之后的运行中立即返回成功,并且书签数据保存在NSUserDefaults中.

在权利文件中,除其他项目外,我还有:

<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题吗?

aba*_*ert 9

这个很容易.您正在使用NSURLBookmarkCreationWithSecurityScope而不是NSURLBookmarkResolutionWithSecurityScope进行解析.只需更改该行即可.

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

  • 如果你看一下历史,那就有意义了.10.6中的原始BookmarkCreation和BookmarkResolution标志集没有任何匹配良好的对,因此它们是完全独立的位掩码值集,并且不存在例如NSURLBookmarkCreationMinimalBookmark和NSURLBookmarkResolutionWithoutUI之间混淆的可能性.但如果他们为编译器添加了一些方法来警告你这件事会不会很好,不是吗? (2认同)