我正在将我的 Lion 应用程序转换为使用应用程序沙盒。我正在尝试使用 security-scoped bookmarks 10.7.3 中引入的功能允许持久访问文件夹。我下面的代码返回一个 nil 书签,并生成以下日志消息:XPC 无法查找范围书签代理的 Mach 服务
。
我将 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
的调用和 -stopAccessingSecurityScopedResource
在上面的代码中不是必需的,因为 Powerbox 会在用户在 NSOpenPanel
中选择它后授予对资源的访问权限。
如果您从另一个安全范围的 URL 创建书签,例如从在另一个应用 session 中创建的应用范围的书签创建文档范围的书签,那么您需要先获得对该文件的访问权限。
最佳答案
事实证明我缺少一个关键的权利,它没有在 UI 中列出,但在 the documentation 中列出:
com.apple.security.files.bookmarks.app-scope
2018 年 12 月 18 日更新
根据 this Twitter thread ,可能不再需要此权利。感谢 @pkamb 提醒我这一点。
关于objective-c - 无法创建安全范围的书签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10043345/