沙盒中不允许IOKit?

时间:2014-04-23 12:30:45

标签: 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;

6 个答案:

答案 0 :(得分:4)

我发现同样的问题是尝试读取SMC键,以便从OSX Yosemite'Woday extension'中获取传感器温度和风扇速度。扩展需要沙箱化,每当我尝试读取温度和风扇传感器时,我也会得到kIOReturnNotPermitted错误。

我实现它的唯一方法是创建一个管理所有SMC内容的XPC服务,配置为启动代理。这样,沙盒应用程序('今天'扩展名)向XPC服务询问所有相关数据,而不是直接搞乱IOKit。

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

答案 1 :(得分:3)

你不需要一个XPC(不确定我理解答案,因为它也需要沙盒)。

你可以使用这个临时权利,虽然我没有希望苹果批准它为MAS - 你需要让你的案例试图证明它在iTunes连接中的使用。我有一个类似的问题,它是迄今为止我发现的唯一“解决方案”:

com.apple.security.temporary-exception.sbpl string (allow iokit-open)

答案 2 :(得分:1)

我不认为Luis Glez的答案提供了解决方案,但错误的信息。

实际上目前无法从沙盒应用程序访问此I / O Kit功能也不会被Apple批准用于App Store。 如果您从Luis Glez检查应用程序的沙箱状态,您将看到它根本没有沙箱。此外,它在App Store无法使用,我认为这就是原因。

终端:

codesign --display --entitlements - VitalStats.app

最近有关开发者论坛的讨论,Apple的某人证实没有办法。

https://devforums.apple.com/message/1082393#1082393

答案 3 :(得分:1)

一般来说,我的应用只是因为使用IOKit而被拒绝。还有其他人有同样的问题吗?该应用程序已被批准用于60个早期版本,但突然之间,Apple似乎现在遇到了问题。我使用IOKit读取电池信息,例如当前电压等。

由于1.1.6-安全性而被拒绝。

  

感谢您的提交。在审核过程中,我们发现您的应用不适合App Store。

     

我们鼓励您检查您的应用概念并评估您是否   可以合并不同的内容和功能以将其引入   遵守《 App Store审查指南》。

答案 4 :(得分:0)

解决方案非常简单。您需要在文件权利

中添加几行
<key>com.apple.security.temporary-exception.sbpl</key>
<array>
    <string>(allow iokit-open)</string>
    <string>(allow iokit-set-properties (iokit-property "ConsoleUID"))</string>
    <string>(allow mach-lookup (global-name "com.apple.AssetCacheLocatorService"))</string>
</array>

Screenshot

答案 5 :(得分:0)

对于那些仍在寻找答案的用户,问题可能是该应用首先需要获得输入监视权限(如果未授予或拒绝它)-您肯定会得到kIOReturnNotPermitted错误。

要尝试这种情况,请转到“系统设置”,“隐私”,选择“输入监视”,然后检查是否允许您的应用。

授予权限后,错误应消失