沙盒中不允许使用 IOKit?

Gen*_*Ptr 6 macos iokit appstore-sandbox

我是使用 IOKit 的新手,并注意到我认为是沙箱导致它失败。

这是我正在尝试的测试(在 Pascal 中),它在沙箱外运行良好,但是当我启用它时,IOServiceOpen 每次都会返回错误 kIOReturnNotPermitted。

对于某些服务,IOKit 在沙箱中不安全吗?我试图获得一些风扇速度/cpu 温度,我看到 AppStore(沙盒)中有一些应用程序这样做,所以我相信这是可能的。我唯一能确认的似乎有一个与应用程序捆绑在一起的 XPC 服务作为助手,所以也许这是使 IOKit 工作的线索?我基本上尝试了所有的权利,但似乎没有一个对任何人有帮助。

感谢您的任何想法。

procedure TestIOKit;
var
    err: kern_return_t;
    masterPort: mach_port_t;
    iterator: io_iterator_t;
    device: io_object_t;
    matchingDictionary: CFMutableDictionaryRef;
    conn: io_connect_t;
begin
    IOMasterPort(0, masterPort);
    matchingDictionary := IOServiceMatching('AppleSMC');
    err := IOServiceGetMatchingServices(masterPort, matchingDictionary, iterator);
    if err <> kIOReturnSuccess then
        writeln('IOServiceGetMatchingServices: ', err);

    device := IOIteratorNext(iterator);
    IOObjectRelease(iterator);
  if device = 0 then
        writeln('no smc found');

    err := IOServiceOpen(device, mach_task_self_, 0, conn);
  if err <> kIOReturnSuccess then
        writeln('IOServiceOpen: ', err);
end;
Run Code Online (Sandbox Code Playgroud)

小智 5

我在尝试读取 SMC 密钥以便从 OSX Yosemite“Today 扩展”内部获取传感器温度和风扇速度时发现了同样的问题。该扩展需要进行沙箱处理,而且每次尝试读取温度和风扇传感器时,我都会收到 kIOReturnNotPermissioned 错误。

我让它工作的唯一方法是创建一个 XPC 服务来管理所有 SMC 内容,并将其配置为启动代理。这样,沙盒应用程序(“today”扩展)会向 XPC 服务请求所有相关数据,而不是直接干扰 IOKit。

到目前为止,它似乎运行正常。

  • 难道我们不需要把XPC服务沙箱化吗?我已经尝试过你的答案,但是当 XPC 服务中启用沙箱时,IOServiceOpen() 不起作用。那么,如果我在 XPC 服务中禁用沙箱,苹果会批准我的应用程序吗?或者我在这里遗漏了什么? (2认同)