如何从文件描述符创建NSURL?

时间:2017-10-12 17:14:56

标签: macos cocoa appkit core-foundation xpc

这个问题实际上是关于将文件权限从非沙盒的父macOS应用程序传输到沙盒的子XPC服务。

这个问题App sandbox: how to allow XPC service to read file that user opened in parent app?在目的上几乎完全相同,但在实施方面有所不同。 (关于该问题的一个公认答案涉及发送一个安全范围的书签,哪个有效,但确实很慢。)

Apple似乎建议的低级实现是将文件描述符发送到XPC服务。 Apple的Secure Coding Guide在"继承文件描述符"。

下讨论了这个问题。

使用基于C的XPC框架,我可以成功地将文件描述符从主应用程序发送到XPC服务,并使用该文件描述符读取数据:

在主应用中:

NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:@"..."];
xpc_dictionary_set_fd(dict, "fd", handle.fileDescriptor);

在XPC服务中:

 int fd = xpc_dictionary_dup_fd(dict, "fd");
 NSFileHandle *handle = [[NSFileHandle alloc] initWithFileDescriptor:fd 
                                                   closeOnDealloc:YES];

 NSData *data = [handle readDataOfLength:1000];
 NSLog(@"Read data of length: %@", @(data.length));

XPC服务能够读取该数据。但是,现在使用指向同一文件的文件路径(NSString)创建NSURL的任何尝试都将失败。这是有问题的,因为我想在XPC服务中使用的API都需要NSURL

我无论如何都无法从文件描述符创建NSURL,也无法将文件描述符转换为NSURL,但也许我忽略了一些东西。

有没有办法从文件描述符创建NSURL,或者新创建的NSURL是否继承了文件描述符的只读权限?

或者,是否有另一种方法将文件权限从父进程传输到子XPC进程,该进程不必创建安全范围的书签,将其归档然后在另一端取消归档?

macOS 10.12 / 10.13

修改1

Apple的SandboxedFetch示例代码完美地使用了文件描述符技术,但它在XPC服务中使用的函数能够获取文件描述符。也就是说,它只使用read()fdopen()curl

0 个答案:

没有答案