2014-04-23 44 views
4

我是使用IOKit的新手,並且注意到我認爲沙箱使其失敗。在Sandbox中不允許IOKit?

這裏是我試圖(在帕斯卡爾)的測試,它在沙箱外運行良好,但是當我啓用它時,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; 
+0

如果你還沒有,彈出打開'Console'應用,然後搜索'sandbox'添加幾行。每次遇到沙箱侵害時,您都應該收到帶有回溯的郵件。 – gaige

回答

5

我發現試圖讀取SMC鍵,以便從OSX優勝美地「今天擴展」裏面獲得傳感器臨時工及風扇轉速同樣的問題。擴展需要沙盒,每次我嘗試讀取溫度和風扇傳感器時,我也遇到了kIOReturnNotPermitted錯誤。

我得到它的工作的唯一途徑是通過創建一個管理所有SMC的東西,配置爲推出代理XPC服務。這樣,沙盒應用程序('今日'擴展)向XPC服務詢問所有相關數據,而不是直接與IOKit混淆。

到目前爲止,它似乎正常工作。

+0

我認爲這可能是答案,但我不想承諾學習XPC服務,直到我確定。謝謝! – GenericPtr

+2

我們是否需要製作XPC服務沙盒?我試過你的答案,但是當XPC服務中有沙箱啓用時,IOServiceOpen()不起作用。那麼如果我在XPC服務中禁用了沙箱,蘋果會批准我的應用程序?或者我在這裏錯過了什麼? –

+0

是的,據我所知,它必須是沙盒。爲了使它工作,我必須在XPC服務授權文件中添加一個臨時異常:(com.apple.security.temporary-exception.mach-lookup.global-name:(String)'您的XPCService標識符')。如果您不使用Mac App Store進行分發,它可以正常工作。不過,我不確定是否允許MAS分發。 –

0

我沒有看到路易斯Glez答案提供了一個解決方案,但錯誤信息。

事實上目前還沒有辦法從沙盒應用訪問此I/O Kit的功能,它也不能由蘋果App Store的批准。 如果您從Luis Glez檢查應用程序的沙盒狀態,您會發現它根本不是沙盒。此外,它不適用於App Store,我認爲這是原因。

終端:

codesign --display --entitlements - VitalStats.app 

有在開發者論壇,有人最近的討論從蘋果公司證實,也沒有辦法。

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

2

你並不需要一個XPC(不知道我的理解給它也需要被沙盒這個答案)。

你可以使用這個臨時的權利,雖然我不持有蘋果核準其MAS的希望 - 你需要讓你的情況下,試圖證明其在iTunes連接使用。我有類似的問題,這是迄今爲止唯一的「解決方案」:

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

解決方案非常簡單。你需要在文件的權利

<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