App沙箱:如何让XPC服务读取用户在父应用中打开的文件?

Mar*_*ark 10 cocoa xpc sandbox appstore-sandbox

我有一个简单的Cocoa图像预览应用程序.用户使用a选择文件NSOpenPanel,应用程序使用Quick Look API生成预览图像.

我想将预览生成移动到单独的XPC服务中.如果没有应用程序沙盒,一切正常,但在为父应用程序和XPC服务启用应用程序沙盒后,XPC服务将被拒绝对用户所选文件的读取权限.

允许父应用程序读取文件(因为它是通过NSOpenPanel选择的).

如何将用户选择的文件的"文件读取"权限从父应用程序传输到XPC进程,以便XPC进程可以读取文件以生成预览?

我的XPC服务通过其权利请求文件读取访问,我将以下密钥添加到XPC服务Info.plist,但这没有帮助:

JoinExistingSession = YES
Run Code Online (Sandbox Code Playgroud)

Ole*_*ann 11

我不是100%肯定,但我认为Apple建议NSFileHandle在这种情况下传递给XPC进程.这样,XPC进程可以访问文件的内容,但不需要知道文件的URL.

编辑:Apple开发者论坛中的这个主题很有帮助.建议为文件的URL创建一个普通(非安全范围)书签.然后可以将该书签传递给XPC进程并由其访问.

  • 谢谢!解决方案是创建一个安全范围的书签,创建一个NSURL,然后获取URL并创建一个**普通**书签发送到XPC服务. (3认同)
  • 我还可以确认这是有效的:在主进程中请求文件URL,在那里存储安全范围的书签数据,然后将非范围的书签数据发送到XPC进程并在那里创建文件URL.重要的是,目录文件URL也起作用,以便您可以访问发送书签数据的目录下的子目录和文件. (2认同)