core audio user-space plug-in driver-sandbox предотвращает взаимодействие данных с другим процессом
Я работаю над плагином coreaudio user-space HAL на основе примера developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html
в реализации плагина я планирую получить аудиоданные из другого процесса, т. е. CFMessagePort
однако я получил следующую ошибку в консоли, пытаясь создать порт CFMessagePortCreateLocal...
sandboxd[251]: ([2597]) coreaudiod (2597) запретить Mach-регистр com.mycompnay.аудио
Я сделал некоторые googlging и пришел к этой статье
технические вопросы QA1811 https://developer.apple.com/library/mac/qa/qa1811/_index.html о добавлении AudioServerPlugIn_MachServices в plist, но по-прежнему без успеха.
есть ли что-то еще, что мне нужно сделать, чтобы сделать эту работу (например, добавление прав, код-знак), или это неправильный подход.? Я не уверен, что механизм MesssagePort работает больше под песочница. будут ли службы XPC жизнеспособными?
большое спасибо за ваше время. Любая помощь очень ценится
обновление 1:
Я должен создавать удаленный порт вместо локального в аудио плагине. Сказав это, с атрибутом AudioServerPlugIn_MachServices в plist. теперь нет sandboxd[559]: ([552]) coreaudiod (552) deny mach-поиск / Регистрация сообщение в консоли.
однако, в моем аудио 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();
Я получил консольное сообщение об этом.
com.яблоко.звуковой.DriverHelper[1314]: плагин с именем SimpleAudioPlugIn.драйвер требует расширения песочницы для службы mach с именем com.mycompnay.звуковой.XPCService
кто-нибудь знает почему??
обновление 2
Я заметил, что когда я использую режим отладки с coreaudiod, он успешно получает ссылку на объект Службы mach. (то же самое произошло, когда я пытался использовать подход xpc_service) Настройка схемы проекта
кого??
1 ответов
Я уверен, что столкнулся с теми же проблемами в моем AudioServerPlugIn. Я мог посмотреть вверх и использовать каждую услугу Mach, которую я пытался, за исключением тех, которые я создал. И те, которые я создал, работали нормально из регулярного процесса.
в конце концов я прочитал в Daemonomicon и понял, что coreaudiod
(на котором размещены Плагины HAL) использовало глобальное пространство имен bootstrap, но моя служба была зарегистрирована в пространстве имен bootstrap для каждого пользователя. И с "процессы, использующие глобальное пространство имен, могут видеть службы только в глобальном пространстве имен" мой плагин не мог видеть мою службу.
можно использовать launchctl
чтобы проверить это, запустив программу, которая регистрирует вашу службу, но с тем же пространством имен bootstrap, что и coreaudiod
. Вам, вероятно,нужно будет отключить rootless.
# launchctl bsexec $(pgrep coreaudiod) your_service_executable
С этим работает, попробуйте снова подключить плагин.
из таблицы 2 в Демономиконе, вы видно, что только демоны launchd используют глобальное пространство имен bootstrap. Это объясняет, почему coreaudiod
использует его. И я думаю, это означает, что ваш сервис Mach должен быть создан демоном launchd.
чтобы сделать один, создайте launchd.файл plist к вашим услугам /Library/LaunchDaemons
. Установите его владельца в root:wheel
и сделать его доступным только для записи владельцем. В нем установите MachServices
ключ и добавить название вашего сервиса:
<key>MachServices</key>
<dict>
<key>com.mycompany.audio.XPCService</key>
<true/>
</dict>
затем зарегистрировать это:
# launchctl bootstrap system /Library/LaunchDaemons/com.mycompany.audio.XPCService.plist
это то, что я закончил с: com.bearisdriving.ФОНОВАЯ МУЗЫКА.XPCHelper.файл plist.шаблон. Обратите внимание, что без UserName
/GroupName
ключи демон будет работать как root. (Код мои услуги и плагин также находится в этом РЕПО, если это полезно.)
к сожалению, мне пришлось использовать XPC, но сначала я попробовал CFMessagePort, и он работал нормально.
кажется, что все работает нормально подписан плагин или нет. Хотя, как вы говорите, вам нужен AudioServerPlugIn_MachServices
введите свою информацию.файл plist.