12

我正在将我的 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)

现在我让它工作了,我可以验证在上面的代码中调用-startAccessingSecurityScopedResourceand-stopAccessingSecurityScopedResource是不必要的,因为 Powerbox 在用户在NSOpenPanel.

如果您从另一个安全范围的 URL 创建书签,例如从另一个应用会话中创建的应用范围的书签创建文档范围的书签,那么您需要首先访问该文件。

4

1 回答 1

10

事实证明,我错过了一项关键权利,未在 UI 中列出,但在文档中列出:

com.apple.security.files.bookmarks.app-scope

2018 年 12 月 18 日更新

根据此 Twitter 线程,可能不再需要此权利。感谢@pkamb提醒我这一点。

于 2012-04-06T12:27:37.057 回答