objective-c - 无法创建安全范围的书签

标签 objective-c macos osx-lion nsopenpanel appstore-sandbox

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

相关文章:

objective-c - C套接字Ping命令?

javascript - Firebug 中神秘的 "Type Error: non-native scope object"

bash - 全局安装的 NPM 包(带 CLI)返回命令未找到

cocoa - 全屏狮子复合动画

java - osx lion 上的 IntelliJ IDEA - 如何设置 JSDK?

objective-c - 非 rootViewController View 中的 NavigationController 问题

iphone - iOS - 计算距离、方位角、仰角和相对位置(增强现实)

objective-c - 如何从 NSResponder 显式发送键值观​​察通知?

macos - 什么会导致 .NET Core 二进制文件加载 native 库,然后抛出 DllNotFoundException?

c - 使用 dup2 重定向 stdin 和 stdout 时出现未定义错误