我正在将我的Lion应用程序转换为使用App SandBox.我试图利用10.7.3中引入的
security-scoped bookmarks功能来允许持久访问一个文件夹.下面的代码返回一个零书签,并产生以下日志消息:XPC无法查找作用域书签代理的Mach服务.
我将用户选择的文件访问权限设置为读/写访问,并且还尝试使用和不使用周围的..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
和-stopAccessingSecurityScopedResource
的调用是不必要的,因为PowerBox在用户在NSOpenPanel中选择资源后,才允许访问资源.
如果您正在从另一个安全范围的URL创建书签,例如从在另一个应用程序会话中创建的应用范围的书签制作文档范围的书签,则需要首先访问该文件.
解决方法
事实证明,我缺少一个关键的权利,未列在UI中,但在
the documentation中列出:
com.apple.security.files.bookmarks.app-scope