Аудио компоненты и тестовая среда приложения
Эти Технические замечания описывают, как Аудио Компоненты могут передать свои требования использования ресурсов системе, и как система использует эту информацию для разрешения конфликта между требованиями использования ресурсов Аудио Компонента и ресурсов, к которым Песочница хост-приложения предоставляет доступ.
Аудио компоненты по сравнению с тестовой средой приложения
Тестовая среда приложения является технологией безопасности, задание которой она должна ограничить размер ущерба, который может быть сделан к системе поставившим под угрозу приложением.
Это выполняется приложением, добровольно воздерживающимся от доступа к системным ресурсам, таким как файловая система, сеть, связь с другими процессами или драйверами и т.д. Приложение указывает, к каким службам оно требует доступа через права, которые присоединены к приложению через его подпись кода. Система читает эти права из подписи кода, и Песочница осуществляет ограничения.
Аудио Компоненты являются независимыми пакетами кода, который может выполнить задачи, такие как обработка звукового сигнала, кодирование/декодирование аудиоданных, парсинг аудиофайла, и т.д. Приложения загружают Аудио Компоненты в свой процесс для использования в своих интересах этих возможностей. Аудио Компонент, как любой код, может потребовать доступа к различным системным ресурсам для выполнения его работы. Это устанавливает потенциал для конфликта между ресурсами, Аудио Компоненту нужны доступ к и ресурсы, к которым Песочница хост-приложения предоставляет доступ.
Об аудио компонентах и менеджере компонентов
В OS X 10.6, Платформа Аудиоустройства добавила AudioComponent
API для загрузки и управления Аудио Компонентами хост-приложениями. AudioComponent
API вытесняет использование Менеджера компонентов для этих задач. Важно отметить что AudioComponent
API обеспечивает доступ к обоим Аудио плагинам Стиля компонента, а также плагинам Менеджера компонентов. Также, любое приложение, предназначающееся 10.6 или позже, должно переключиться на AudioComponent
API. Менеджер компонентов официально осуждается с Пумы OS X.
Для приложений, предназначающихся для более ранних систем, рекомендуемый подход должен использовать AudioComponent
API при работе Mac OS X 10.6 или позже и условно отступить к Менеджеру компонентов при работе более ранних систем.
Поиграйте в песочнице безопасные аудио компоненты
Безопасный Аудио Компонент «Песочницы» определяется, чтобы быть Аудио Компонентом, который может функционировать правильно в процессе, имеющем наиболее сильно ограничивающую Песочницу, где доступ ко всем системным ресурсам, таким как файловая система, сеть, и т.д. были урезаны драйверы в ядре. Такой Аудио Компонент никогда не будет заставлять нарушения песочницы быть отмеченными в консольных журналах.
Аудио Компонент указывает к системе, что это - Песочница, Безопасная включением»sandboxSafe
«введите его словарь описания, расположенный в info.plist
из содержания пакета. Этот ключ отражается в componentFlags
поле AudioComponentDescription
для Аудио Компонента с константой, kAudioComponentFlag_SandboxSafe
.
Перечисление 1 показывает пример словаря описания для гипотетического AudioUnit по имени MyExampleAU. Этот AudioUnit выполняет всю свою работу, не требуя доступа ни к каким системным ресурсам и является полностью Безопасной Песочницей. Отметьте, как это выражено с помощью»sandboxSafe
«ключ.
Перечисление 1 , Устанавливающее sandboxSafe ключ.
<dict> |
<key>description</key> |
<string>My Example AudioUnit</string> |
<key>factoryFunction</key> |
<string>MyExampleAUFactory</string> |
<key>manufacturer</key> |
<string>MYCO</string> |
<key>name</key> |
<string>My Company: MyExampleAU</string> |
<key>subtype</key> |
<string>EXAU</string> |
<key>type</key> |
<string>aufx</string> |
<key>version</key> |
<integer>65536</integer> |
<!-- Declare that this AudioComponent is Sandbox Safe --> |
<key>sandboxSafe</key> |
<true/> |
</dict> |
Аудио Компоненты могут также быть зарегистрированы в системе динамично с Аудио вызовом API Компонента, AudioComponentRegister
(). Вызывающая сторона сообщает системе, что такой Аудио Компонент является Песочницей, Безопасной путем установки флага, kAudioComponentFlag_SandboxSafe
, в AudioComponentDescription
переданный AudioComponentRegister
(). Перечисление 2 демонстрирует динамическую регистрацию с помощью той же информации от MyExampleAU выше.
Перечисление 2 , Регистрирующееся Динамично во флаге sandboxSafe.
#include <AudioUnit/AudioComponent.h> |
extern AudioComponentPlugInInterface* |
MyExampleAUFactoryFunction(const AudioComponentDescription *inDesc); |
AudioComponent RegisterMyExampleAudioUnit() |
{ |
// fill out the version number for the AU |
UInt32 theVersion = 0x00010000; |
// fill out the AudioComponentDescription |
AudioComponentDescription theDescription; |
theDescription.componentType = kAudioUnitType_Effect; |
theDescription.componentSubType = 'EXAU'; |
theDescription.componentManufacturer = 'MYCO'; |
theDescription.componentFlagsMask = 0; |
// Use the flag to indicate that this AudioComponent is Sandbox Safe |
theDescription.componentFlags = kAudioComponentFlag_SandboxSafe; |
// call AudioComponentRegister() |
return AudioComponentRegister(&theDescription, CFSTR("My Company: MyExampleAU"), |
theVersion, MyExampleAUFactoryFunction); |
} |
Поиграйте в песочнице безопасные аудио компоненты по сравнению с файловой системой
Наиболее распространенная системная служба, использование которой заставляет Аудио Компонент не быть Безопасной Песочницей, является файловой системой. Также, Аудио Компонент должен использовать предоставленный стандарт системы, Открывают и Сохраняют диалоговые окна, чтобы позволить пользователю определять местоположение необходимых файлов, а также служб API такой как NSSearchPathForDirectoriesInDomains
() для определения местоположения определенных каталогов.
Аудио Компонент должен также использовать закладки объема безопасности для контакта с персистентными ссылками на файл.
Для получения дополнительной информации об ограниченных по объему безопасностью закладках посмотрите Ограниченные по объему безопасностью Закладки и Персистентный Доступ Ресурса в Руководстве по проектированию Тестовой среды приложения.
Пример создания закладки securityscope для персистентного хранения продемонстрирован в Перечислении 3 и разрешении, что закладка объема безопасности продемонстрирована в Перечислении 4.
Перечисление 3 , создающее закладку объема безопасности
CFDataRef CreateSecurityScopeBookMarkFromURL(CFURLRef inURL, CFURLRef inRelativeToURL, |
bool inReadOnly, CFErrorRef* outError) |
{ |
// set up the options we want |
CFURLBookmarkCreationOptions theOptions = kCFURLBookmarkCreationWithSecurityScope; |
if(inReadOnly) |
{ |
theOptions |= kCFURLBookmarkCreationSecurityScopeAllowOnlyReadAccess; |
} |
// create the bookmark data |
return CFURLCreateBookmarkData(NULL, inURL, theOptions, NULL, inRelativeToURL, outError); |
} |
Перечисление 4 , разрешающее закладку объема безопасности
CFURLRef CreateURLFrom SecurityScopeBookMark(CFDataRef inBookmarkData, |
CFURLRef inRelativeToURL, CFErrorRef* outError) |
{ |
// Note that if inRelativeToURL is non-NULL, it must be a URL that points to the same |
// location that was used to create the bookmark data. |
return CFURLCreateByResolvingBookmarkData(NULL, inBookmarkData, |
kCFURLBookmarkResolutionWithSecurityScope, inRelativeToURL, NULL, NULL, outError); |
} |
Аудио компоненты, которые не являются безопасной песочницей
Если Аудио Компонент не удовлетворяет требования, чтобы быть Безопасной Песочницей, это должно объявить к системе системные ресурсы, к которым это требует доступа. Это сделано с помощью словаря описания в Info.plist содержания пакета с»resourceUsage
«ключ.
"resourceUsage
«значение является словарем, имеющим несколько определенных ключей, перечисляющих системные ресурсы, к которым Аудио Компонент требует доступа, это:
"
iokit.user-client
«ключ. Этот ключ описывает пользовательские объекты клиента IOKit, которые откроет Аудио Компонент. Это - массив пользовательских имен классов клиентов, с которыми Аудио Компонент должен открыть соединения."
mach-lookup.global-name
«ключ. Этот ключ описывает службы Маха, с которыми должен соединиться Аудио Компонент. Это - массив имен служб. Обратите внимание на то, что эти службы могут быть прямыми службами Маха, найденными черезbootstrap_look_up
службы () или XPC, найденные черезxpc_connection_create_mach_service
()."
network.client
«ключ. Этот ключ указывает, что Аудио Компонент получит данные от сети. Его значение является aboolean
."
temporary-exception.files.all.read-write
«ключ. Этот ключ является aboolean
это указывает, что Аудио Компоненту нужна произвольная выборка к файловой системе. Это для обратной совместимости для Аудио Компонентов, еще не принявших использование закладок объема безопасности и/или использование стандартного диалогового окна файла для обнаружения, доступа и хранения персистентных ссылок на файлы в файловой системе. В будущей версии ОС не будет поддерживаться этот ключ.
Если ни один из этих ключей не является надлежащим для описания требований Аудио Компонента, словарь описания не должен или присутствовать или должен быть пустым.
Система сравнит информацию использования ресурсов, предоставленную Аудио Компонентом с тем, что позволяет песочница хост-процесса. Если использование ресурсов Аудио Компонента полностью позволяется песочницей, Аудио Компонент считают Песочницей, Безопасной для того процесса. Такой Аудио Компонент будет автоматически иметь флаг, kAudioComponentFlag_SandboxSafe
набор на нем и будет всегда позволяться быть загруженным в тот хост-процесс.
Перечисление 5 показывает словарь в качестве примера для AudioUnit, требующего всех четырех видов ресурсов.
Перечисление 5 , Заполняющее Словарь Использования ресурсов.
<dict> |
<key>type</key> |
<string>aufx</string> |
<key>subtype</key> |
<string>XMPL</string> |
<key>manufacturer</key> |
<string>ACME</string> |
<key>name</key> |
<string>AUExample</string> |
<key>version</key> |
<integer>12345</integer> |
<key>factoryFunction</key> |
<string>AUExampleFactory</string> |
<!-- This AU is not sandbox safe so describe it's resource usage --> |
<key>resourceUsage</key> |
<dict> |
<key>iokit.user-client</key> |
<array> |
<string>CustomUserClient1</string> |
<string>CustomUserClient2</string> |
</array> |
<key>mach-lookup.global-name</key> |
<array> |
<string>MachServiceName1</string> |
<string>MachServiceName2</string> |
</array> |
<key>network.client</key> |
<true/> |
<key>temporary-exception.files.all.read-write</key> |
</true> |
</dict> |
</dict> |
Хостинг аудио компонентов в поигравшем в песочнице приложении
Существует несколько подходов, которые поигравшее в песочнице приложение может проявить относительно загрузки Аудио Компонентов. Самый простой метод для приложения, чтобы только поддерживать загружающиеся Аудио Компоненты, которые являются Безопасной Песочницей. Это может быть выполнено путем установки флага, kAudioComponentFlag_SandboxSafe
, в AudioComponentDescription
переданный AudioComponent
Вызов API, AudioComponentFindNext
() при поиске Аудио Компонентов для загрузки.
Перечисление 6 перечисляет песочницу безопасные аудио компоненты.
#include <AudioUnit/AudioComponent.h> |
extern void ProcessFoundAudioComponent(AudioComponent inComponent); |
void EnumerateSandboxSafeAudioComponents() |
{ |
// make a description that includes all wildcards except for the flags and flags |
// mask so that we traverse all the AudioComponents that are sandbox safe |
AudioComponent theComponent; |
AudioComponentDescription theDescription; |
memset(&theDescription, 0, sizeof(theDescription)); |
// Use the flag to indicate that we want to find Sandbox Safe AudioComponents |
theDescription.componentFlags = kAudioComponentFlag_SandboxSafe; |
theDescription.componentFlagsMask = kAudioComponentFlag_SandboxSafe; |
// get the first AudioComponent |
theComponent = AudioComponentFindNext(NULL, &theDescription); |
while(theComponent != NULL) |
{ |
// process the AudioComponent |
ProcessFoundAudioComponent(theComponent); |
// get the next one in the list |
theComponent = AudioComponentFindNext(theComponent, &theDescription); |
} |
} |
Если приложение хочет открыть Audio Components, которые не являются Безопасной Песочницей, приложение должно быть подписано с правом»com.apple.security.temporary-exception.audio-unit-host
«. Любая попытка открыть Audio Component, который не является Песочницей, Безопасной приложением, не имеющим этого права, перестанет работать.
Когда приложение с»com.apple.security.temporary-exception.audio-unit-host
«право пытается открыть Audio Component, который не является Безопасной Песочницей, система покажет пользователю диалоговое окно, указывающее, что процесс пытается открыть Audio Component, который не является Безопасной Песочницей.
Если пользователь не утвердит действие, то открытая попытка перестанет работать, и пользователь будет видеть диалоговое окно снова в следующий раз, когда приложение пытается открыть Audio Component, который не является Безопасной Песочницей. Если пользователь утвердит действие, то система отключит песочницу хост-приложения, попытка открыть Audio Component успешно выполнится и дальнейшие попытки открыть Audio Component, который не является Безопасной Песочницей, успешно выполнится без пользователя, видящего диалоговое окно. Кроме того, система будет помнить ответ пользователя так, чтобы, если приложение пытается открыть тот же Аудио Компонент в будущем, это успешно выполнилось, не показывая диалоговое окно пользователю.
Много приложений накапливают список различных Аудио Компонентов и их возможностей. Начиная с запросов Аудио Компонента для обнаружения то, что это делает, требует открытия Audio Component, это может заставить песочницу приложения отбрасывать, даже если приложение никогда не использует ни одного из запрошенных Аудио Компонентов.
Избегать отбрасывать песочницу приложения при запросах компонентов, нового AudioComponentCopyConfigurationInfo
(), API может использоваться. Этот вызов возвращает словарь, содержащий информацию о возможностях Аудио Компонента. Ключи, возвращенные в этом словаре, зависят от вида Аудио Компонента. Для Аудиокодеков и Компонентов Аудиофайла, нет никаких определенных ключей. Для Аудиоустройств ключи определяются в <AudioUnit/AudioUnitProperties.h
> и включайте такие вещи как, имеет ли Аудиоустройство пользовательское представление (kAudioUnitConfigurationInfo_HasCustomView
) и конфигурации канала (kAudioUnitConfigurationInfo_ChannelConfigurations
) Аудиоустройство может быть сконфигурировано для и т.д.
Пример перечисления 7 словарь ConfigInfo, возвращенный AudioComponentCopyConfigurationInfo
.
// The contents of this dictionary is different for each Audio Unit. |
// Some will have all the defined keys some will have none. |
// This is the plist form of the ConfigInfo dictionary for the AUSampler Audio Unit. |
<dict> |
<key>ChannelConfigurations</key> |
<array> |
<array> |
<integer>0</integer> |
<integer>-16</integer> |
</array> |
</array> |
<key>HasCustomView</key> |
<true/> |
<key>InitialOutputs</key> |
<array> |
<integer>2</integer> |
</array> |
</dict> |
История версии документа
Дата | Примечания |
---|---|
06.03.2013 | Передовая статья |
31.07.2012 | Новый документ, описывающий, как Аудио Компоненты передают свои требования использования ресурсов системе для работы в Песочнице хост-приложения. |