All*_*len 8 plugins xpc core-audio mach appstore-sandbox
我正在开发一个基于示例的coreaudio用户空间hal插件developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html
在插件实现中,我计划从另一个进程(即CFMessagePort)获取音频数据
但是,我在控制台中尝试创建端口CFMessagePortCreateLocal时出现以下错误...
sandboxd [251] :( [2597])coreaudiod(2597)deny mach-register com.mycompnay.audio
我做了一些googlging并来到这篇文章
技术问答QA1811 https://developer.apple.com/library/mac/qa/qa1811/_index.html 关于在plist中添加AudioServerPlugIn_MachServices但仍未成功.
还有什么我需要做的才能使这项工作(如添加权利,代码签名)或这不是正确的方法.我不确定MesssagePort机制是否可以在沙箱下运行.XPC服务是否可行?
非常感谢您的宝贵时间.任何帮助是极大的赞赏
更新1:
我应该在音频插件中创建一个远程端口而不是本地.有了这个说法,使用plist中的AudioServerPlugIn_MachServices属性.现在没有sandboxd [559] :( [552])coreaudiod(552)在控制台中拒绝mach-lookup/register消息.
但是,在我的音频hal插件(客户端)我有
CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService");
CFMessagePortRef port = CFMessagePortCreateRemote(kCFAllocatorDefault, port_name);
port已返回值0.我在另一个应用程序中尝试了这个并且它工作得很好.
这是我的服务器端:
CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService");
CFMessagePortRef port = CFMessagePortCreateLocal(kCFAllocatorDefault, port_name, &callback, NULL, NULL);
CFRunLoopSourceRef runLoopSource =
CFMessagePortCreateRunLoopSource(nil, port, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(),
runLoopSource,
kCFRunLoopCommonModes);
CFRunLoopRun();
Run Code Online (Sandbox Code Playgroud)
我确实得到了关于此的控制台消息.
com.apple.audio.DriverHelper [1314]:名为SimpleAudioPlugIn.driver的插件需要扩展名为com.mycompnay.audio.XPCService的mach服务的沙箱.
谁知道为什么?
更新2
我注意到当我使用带有coreaudiod的调试模式时,它成功获得了mach服务的对象引用.(当我尝试xpc_service方法时)同样的事情发生在 项目方案设置中
任何人??
我很确定我在 AudioServerPlugIn 中遇到了同样的问题。我可以查找并使用我尝试过的每一个 Mach 服务,除了我创建的那些服务。我创建的那些从常规流程中正常工作。
最终,我阅读了 Daemonomicon并发现coreaudiod(托管 HAL 插件)使用的是全局引导程序命名空间,但我的服务是在每用户引导程序命名空间中注册的。而且由于“使用全局命名空间的进程只能看到全局命名空间中的服务”,我的插件无法看到我的服务。
您可以launchctl通过让它运行注册您的服务的程序来测试它,但使用与coreaudiod. 您可能需要禁用 rootless。
# launchctl bsexec $(pgrep coreaudiod) your_service_executable
Run Code Online (Sandbox Code Playgroud)
运行后,尝试再次从您的插件连接。
从 Daemonomicon 中的表 2 中,您可以看到只有 launchd 守护程序使用全局引导程序命名空间。这解释了为什么coreaudiod使用它。我认为这意味着您的 Mach 服务需要由 launchd 守护进程创建。
要制作一个,请为您的服务创建一个launchd.plist/Library/LaunchDaemons。将其所有者设置为root:wheel并使其只能由所有者写入。在其中设置MachServices密钥并添加您的服务名称:
<key>MachServices</key>
<dict>
<key>com.mycompany.audio.XPCService</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
然后注册它:
# launchctl bootstrap system /Library/LaunchDaemons/com.mycompany.audio.XPCService.plist
Run Code Online (Sandbox Code Playgroud)
这就是我最终得到的:com.bearisdriving.BGM.XPCHelper.plist.template。请注意,如果没有UserName/GroupName键,您的守护程序将以 root 身份运行。(我的服务和插件的代码也在那个 repo 中,以防万一。)
不幸的是,我最终不得不使用 XPC,但我首先尝试了 CFMessagePort,它运行良好。
无论插件是否签名,它似乎都可以正常工作。不过,正如您所说,您确实需要AudioServerPlugIn_MachServicesInfo.plist 中的密钥。
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |