无法创建Security-Scoped Bookmark

Dov*_*Dov 12 macos objective-c nsopenpanel osx-lion appstore-sandbox

我正在将我的Lion应用程序转换为使用App Sandbox.我正在尝试使用10.7.3中引入的安全范围书签功能来允许对文件夹的持久访问.我下面的代码返回一个零书签,并生成以下日志消息: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);
}
Run Code Online (Sandbox Code Playgroud)

更新(x3)

现在我已经开始工作,我可以验证上面代码中的调用-startAccessingSecurityScopedResource-stopAccessingSecurityScopedResource不必要,因为Powerbox在用户选择资源后授予对资源的访问权限NSOpenPanel.

如果您要从另一个安全范围的URL创建书签,例如从另一个应用程序会话中创建的应用程序范围的书签制作文档范围的书签,则需要首先访问该文件.

Dov*_*Dov 10

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

com.apple.security.files.bookmarks.app-scope
Run Code Online (Sandbox Code Playgroud)

更新12/18/2018

根据这个Twitter帖子,可能不再需要此权利.谢谢@pkamb提醒我这个.

  • 谢谢,权利是我需要的工作.只是想补充一点,我不同意你的更新--startAccessingSecurityScopedResource不是必需的; 如果我从我的代码中评论这个,我就再也无法访问该资源了. (2认同)