Техническое примечание TN2247

Аудио компоненты и тестовая среда приложения

Эти Технические замечания описывают, как Аудио Компоненты могут передать свои требования использования ресурсов системе, и как система использует эту информацию для разрешения конфликта между требованиями использования ресурсов Аудио Компонента и ресурсов, к которым Песочница хост-приложения предоставляет доступ.

Аудио компоненты по сравнению с тестовой средой приложения
Об аудио компонентах и менеджере компонентов
Поиграйте в песочнице безопасные аудио компоненты
Поиграйте в песочнице безопасные аудио компоненты по сравнению с файловой системой
Аудио компоненты, которые не являются безопасной песочницей
Хостинг аудио компонентов в поигравшем в песочнице приложении
История версии документа

Аудио компоненты по сравнению с тестовой средой приложения

Тестовая среда приложения является технологией безопасности, задание которой она должна ограничить размер ущерба, который может быть сделан к системе поставившим под угрозу приложением.

Это выполняется приложением, добровольно воздерживающимся от доступа к системным ресурсам, таким как файловая система, сеть, связь с другими процессами или драйверами и т.д. Приложение указывает, к каким службам оно требует доступа через права, которые присоединены к приложению через его подпись кода. Система читает эти права из подписи кода, и Песочница осуществляет ограничения.

Аудио Компоненты являются независимыми пакетами кода, который может выполнить задачи, такие как обработка звукового сигнала, кодирование/декодирование аудиоданных, парсинг аудиофайла, и т.д. Приложения загружают Аудио Компоненты в свой процесс для использования в своих интересах этих возможностей. Аудио Компонент, как любой код, может потребовать доступа к различным системным ресурсам для выполнения его работы. Это устанавливает потенциал для конфликта между ресурсами, Аудио Компоненту нужны доступ к и ресурсы, к которым Песочница хост-приложения предоставляет доступ.

Об аудио компонентах и менеджере компонентов

В 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«значение является словарем, имеющим несколько определенных ключей, перечисляющих системные ресурсы, к которым Аудио Компонент требует доступа, это:

Если ни один из этих ключей не является надлежащим для описания требований Аудио Компонента, словарь описания не должен или присутствовать или должен быть пустым.

Система сравнит информацию использования ресурсов, предоставленную Аудио Компонентом с тем, что позволяет песочница хост-процесса. Если использование ресурсов Аудио Компонента полностью позволяется песочницей, Аудио Компонент считают Песочницей, Безопасной для того процесса. Такой Аудио Компонент будет автоматически иметь флаг, 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

Новый документ, описывающий, как Аудио Компоненты передают свои требования использования ресурсов системе для работы в Песочнице хост-приложения.