Игра в песочнице диалогового расширения печати
Цель этого документа состоит в том, чтобы объяснить шаги для Игры в песочнице Print Dialog Extension (PDE).
Распечатайте диалоговые расширения и тестовую среду приложения
Эти Технические замечания описывают, как Диалоговые Расширения Печати (PDEs) затронуты Песочницей приложения узла. Тестовая среда приложения является механизмом защиты, разработанным для ограничения ущерба, который мог быть нанесен поставившим под угрозу или ошибочным приложением. Для получения дополнительной информации о Тестовой среде приложения, посмотрите целевую страницу разработчика Тестовой среды приложения.
PDEs являются плагинами, загружающимися, когда диалоговое окно Печати показано пользователю. Они расширяют набор функций диалогового окна Печати, обычно предлагая опции, определенные для выбранного принтера. Так как они - плагины, они работают в адресном пространстве приложения узла и должны соответствовать ограничениям, осуществленным Песочницей приложения узла. Они включают:
Ограниченный доступ к файловой системе. PDEs может только получить доступ к файлам в контейнере приложения. Это означает, что PDEs не может обменяться информацией с их связанным драйвером принтера с помощью файлов в общем каталоге, потому что нет никакого взаимно доступного каталога. Это также означает, что установка PDE, сохраненная в NSUserDefaults, не доступна для того же PDE, работающего в соответствии с различным приложением.
Сети. PDEs не должен участвовать ни в какой сетевой активности, имеет ли приложение сетевые права. Например, PDEs не может непосредственно связаться с их связанным принтером. Однако, существует механизм для PDEs, чтобы дать их драйверам команду выполнять определенные операции с их связанным принтером и получать результаты тех операций. Это обсуждено ниже.
Запуск процессов и отправка AppleEvents к другим процессам не позволяются.
Доступ Адресной книги. Если приложение узла имеет com.apple.security.personal-information.addressbook право, PDEs может получить доступ к адресной книге пользователя. С другой стороны, если приложение узла не имеет этого права, PDEs должен обработать тот случай соответственно. Например, Факс, PDE может потребовать, чтобы пользователь вручную ввел номера телефона, если запрещен доступ адресной книги.
Объявление совместимости песочницы
Тестовая среда приложения была представлена в OS X 10.7 Львов, но OS позволил несовместимому PDEs работать. Этот механизм обходного решения сохранялся в OS X 10.8 Пум. Наконец в OS X 10.9 Индивидуалистов, диалоговое окно Печати не загружает несовместимый PDEs. Поэтому весь PDEs должен соблюсти вышеупомянутые правила для совместимости Тестовой среды приложения.
Для объявления совместимости PDEs должен включать ключ в их Info.plist. Ключевым именем является PMSandboxCompatiblePDEs, и его значение должно быть установлено в Истину.
Тестирование совместимости песочницы
Самый простой способ определить, соответствует ли PDE правилам Песочницы, состоит в том, чтобы искать sandboxd сообщения в Консоли при выполнении большого разнообразия приложений OS X.
Связь с драйвером печати
PDEs может связаться с их связанными принтерами, косвенно, путем отправки заданий команды в их драйвер. И они могут получить информацию о принтере через печать системы APIs, включая PMPrinterCopyState заставить текущее состояние принтера и CUPS PostScript Printer Description (PPD) APIs получать опции и значения по умолчанию принтера.
Пример кода, загружаемый ниже, демонстрирует, как реализовать этот механизм.
Хранить динамические данные
Игра в песочнице предотвращает PDEs и драйверы от использования общего каталога на диске. Вместо этого они могут поделиться информацией с помощью файла PPD, связанного с очередью печати. Следующее является всесторонними шагами и примером кода для выполнения этого.
Шаги фильтра CUPS
Фильтры CUPS должны отправить»PPD: сообщения» демону CUPS, через stderr, для обеспечения файла PPD актуальны.
PPD:сообщения могут использоваться, чтобы установить или создать данные ключа/значения в файле PPD, например:PPD: DataLine1="foo" DataLine2="bar" ... DataLineN="baz"
Если ключ аргумента существует, то он обновляется, иначе он вставляется. Все динамические данные должны храниться этим способом.
У Вас может быть многократный ключ/значения на
PPD:сообщение, с максимумомPPD:сообщение 2k в размере при работе OS X 10.7 или позже. Ограничение размера прежде 10.7 является 1k.Файл PPD воссоздается после каждого
PPD:сообщение обрабатывается демоном CUPS. Рекомендуется сжать данные прежде, чем закодировать, чтобы оставить свободное место и минимизировать число ключевых слов, обновляющихся драйвером.Архив, соединенный в разделе Sample Code, содержит исходные файлы, демонстрирующие чтение и запись данных PPD со следующими соответствующими примечаниями:
Дескрипторы в качестве примера, комбинирующие многократные опции PPD в единственную строку состояния до предела 1k, наложенного CUPS на OS X 10.6.
Данные являются gzip'd и Base64-закодированный. Для примера кода в testppdx.c мы заканчиваем с сетевые сбережения/сжатие приблизительно 40% в файле PPD.
Код помещает верхний предел ценности 16 МБ данных, которые могут быть встроены на ключевое слово. Это основывается на среднем факторе сжатия, максимальном количестве сжатых байтов, которые могут быть закодированы на строку (158), и число блоков (пронумерованные ключевые слова) поддерживаемый текущим кодом (64k).
Шаги PDE
PDEs тогда читают файл PPD для отражения опций принтера и значений в диалоговом окне Печати. Следующее является шагами, которые PDE должен использовать для чтения файла PPD.
Поскольку система печати не консолидирует
PPD:сообщения прежде, чем записать PPD, может быть необходимо опросить относительно их завершения прежде, чем выполнить другую работу. Это выполняется путем отправки задания команды и ожидания того задания для завершения. Задание команды может быть любым заданием (какReportStatus); все вышлиPPD:сообщения, как гарантируют, закончатся, прежде чем состояние задания команды будет перемещено для завершения.Для отправки задания команды использовать
PMPrinterSendCommand. Также cupsDoFileRequest и запросы IPP могут быть эффективно использованы, чтобы сделать это непосредственно. Для примера последнего посмотрите SampleSuppliesView-sendCommand: метод в проекте примера кода SampleRaster, реализующем фильтр командного файла в качестве примера и PDE.Имя задания, которое Вы указываете в качестве параметра, проверяется (использующий cupsGetJobs) для завершения задания. Имя задания является вводом jobTitle к
PMPrinterSendCommand, как замечено здесь:(from PMCore.h: )
* jobTitle:
* The title of the job associated with the command file. If NULL,
* a job title will be automatically generated but it may not be
* meaningful to a user.
extern OSStatus
PMPrinterSendCommand(
PMPrinter printer,
CFStringRef commandString,
CFStringRef jobTitle,
CFDictionaryRef options) AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER;
Получите доступ к обновленному файлу PPD в использовании PDE
cupsGetPPD3, сCUPS_HTTP_DEFAULTиPMPrinterGetIDкак его основные параметры.
Пример кода
Этот загружаемый пример кода поддерживает метод, проиллюстрированный в разделе Storing Dynamic Data.
Динамический пример кода PPD («tn2329_DynamicPPDSampleCode.zip», 8.2K)
История версии документа
| Дата | Примечания |
|---|---|
| 13.12.2013 | Новый документ, перечисляющий требования Игры в песочнице Print Driver Extension (PDE). |