我正在将我的 Lion 应用程序转换为使用应用程序沙盒。我正在尝试利用 10.7.3 中引入的安全范围书签功能来允许对文件夹进行持久访问。我在下面的代码返回一个 nil 书签,并产生以下日志消息:XPC couldn't look up the Mach service for scoped bookmarks agent
.
我将User Selected File Access
权利设置为Read/Write Access
,并尝试使用和不使用周围的..AccessingSecurityScopedResource
调用。
我认为我根据文档做的一切都是正确的,所以我会很感激任何指示。在我开始对应用程序进行沙盒处理之前,该代码正在检索一个纯 URL。
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseFiles:NO];
[openPanel setCanChooseDirectories:YES];
[openPanel setAllowsMultipleSelection:NO];
NSInteger result = [openPanel runModal];
if( result == NSFileHandlingPanelCancelButton ) {
return;
}
NSArray *urls = [openPanel URLs];
if( urls != nil && [urls count] == 1 ) {
NSURL *url = [urls objectAtIndex:0];
NSData *bookmark = nil;
NSError *error = nil;
bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil // Make it app-scoped
error:&error];
if (error) {
NSLog(@"Error creating bookmark for URL (%@): %@", url, error);
[NSApp presentError:error];
}
NSLog(@"bookmark: %@", bookmark);
}
更新 (x3)
现在我让它工作了,我可以验证在上面的代码中调用-startAccessingSecurityScopedResource
and-stopAccessingSecurityScopedResource
是不必要的,因为 Powerbox 在用户在NSOpenPanel
.
如果您从另一个安全范围的 URL 创建书签,例如从另一个应用会话中创建的应用范围的书签创建文档范围的书签,那么您需要首先访问该文件。