Работа с комплектами приложений FxPlug

В этой главе рассматриваются, как создать, упаковать, регистрирует и осуждает плагины FxPlug 3.0. Это также описывает, как преобразовать существующие плагины FxPlug 2.0 в плагины FxPlug 3.0.

Завершитесь примеры плагина FxPlug включены в FxPlug SDK.

Комплекты приложений FxPlug 3.0 могут существовать где угодно, но предложено вставить их /Applications папка.

Упаковка

Завершенный плагин FxPlug упаковывается в пакете XPC, содержащемся в комплекте приложений плагина. Посмотрите рисунок 8-1.

  Структура FxPlug 3 рисунка 8-1

Пакет также содержит Info.plist файл списка свойств, описывающий плагины в пакете. Это описание может быть статичным или динамичным.

Со статическим списком плагины распознаны и загружены автоматически; для динамического списка основной класс пакета просят зарегистрировать плагины. Различие зависит от значения булева тега ProPlugDynamicRegistration в списке свойств.

Динамическая регистрация подвергается плагину, сканируя хит производительности. Используйте статическую регистрацию, когда это возможно. Можно найти больше информации о динамической регистрации в <PluginManager/PROPlugInBundleRegistration.h>.

Регистрация

В первый раз, когда комплект приложений FxPlug 3.0 запускается, система регистрирует плагин, и это становится видимым к хост-приложениям.

Если установщик FxPlug был должным образом подписан с productsign (1) и допустимый сертификат, Привратник позволит плагину быть зарегистрированным независимо от того, чтобы быть запущенным ранее.

После того, как зарегистрированный, хост-приложение может вывести на экран список сгруппированных плагинов FxPlug в его пользовательском интерфейсе, позволив пользователю выбрать и применить определенные плагины к определенным дорожкам.

Несмотря на то, что сменная регистрация имеет место автоматически через Launch Services, можно использовать pluginkit команда для управления сменной регистрацией, например для отладки целей.

Важно отметить, что Launch Services свободна управлять плагинами, как этому нравится, и с вышеупомянутыми командами Вы просматриваете и непосредственно управляете регистрационной базой данных PlugInKit. Если Launch Services открывает вновь плагин после удаления ее плагин регистрируется снова. Самый верный способ управлять загружающимся поведением Движения и Final Cut Pro, в то время как разработка должна использовать приоритет и проигнорировать пути, посмотрите Загружающиеся Плагины FxPlug.

Для получения дополнительной информации о pluginkit команда, обратитесь к pluginkit страница справочника.

Осуждение плагина

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

Решение состоит в том, чтобы использовать устаревший ключ. Когда Вы добавляете устаревший ключ к файлу своего плагина Info.plist со значением ДА, это говорит хост-приложению не отображать свое имя в списке доступных плагинов. Когда пользователь откроет существующий проект, пользовательский интерфейс плагина все еще будет доступен, и они будут в состоянии скопировать и вставить экземпляры плагина, но не будут иметь никакого способа создать новый экземпляр плагина с нуля. Это позволяет Вам использовать то же имя для нового плагина и гарантирует, что только новые экземпляры создаются, продвигаясь.

Аналогично, когда Final Cut Pro X загружает проект, содержащий Эффект Окончательного варианта, имеющий устаревший FxPlug в нем, устаревший плагин будет продолжать работать должным образом. Обычно, разработчики только поставят новый шаблон с новым плагином, и только пользователи, установившие старый плагин со старым шаблоном, будут в состоянии использовать старого. Это действительно означает, однако, что новый шаблон должен будет иметь другое имя от старого или быть помещен в различную категорию. Это часто обрабатывается путем добавления номера версии к шаблонному имени, такому как “Мой Холодный Плагин v1.moef”.

<key>obsolete</key>
<string>YES</string>

Создание нового комплекта приложений FxPlug

Существует два способа создать новый плагин Комплекта приложений FxPlug: используйте шаблон FxPlug Xcode (добавленный установщиком SDK) или запуститесь с копии примера FxBrightness в SDK.

bullet
Создать новый Комплект приложений FxPlug с помощью шаблона FxPlug
  1. Откройте Xcode.

  2. Выберите File> New> Project.

  3. Выберите FxPlug в левой области под OS X.

  4. Выберите шаблон FxPlug в правой области и нажмите Далее.

Следующие свойства в новом проекте должны представлять интерес для Вас.

bullet
Создать новый Комплект приложений FxPlug с помощью примера FxBrightness
  1. Сделайте копию примера FxBrightness от SDK и поместите его, где когда-либо Вам нравится.

  2. Откройте копию проекта в XCode.

  3. Измените название продукта, сменное имя, UUID в пакете фильтра и основное имя класса в XPC plist.

Необходимо использовать универсально уникальный идентификатор (UUID) для каждого плагина, который Вы пишете и управляете подобным UUIDs для групп, к которым Вы хотите добавить свой плагин. При создании нового плагина с помощью шаблона FxPlug Xcode UUID автоматически сгенерирован — но если Вы создаете новый плагин путем копирования существующего проекта, необходимо генерировать новый UUID.

ProPlugPlugInGroupList словарь содержит название группы по умолчанию для Вашего плагина в groupName ключ.

Большинство сменного кода находится в <YourPlugInNamePlugIn>.m файл класса и <YourPlugInNamePlugIn>.h заголовочный файл в группе PlugIn. Этот код обеспечивает основную установку для демонстрации добавления и получения параметров, рендеринга и контакта со службой XPC из процесса.

Преобразование старых плагинов FxPlug к новым плагинам FxPlug

В этом разделе описывается преобразовать существующий плагин FxPlug 2.0, компилирующий и производящий сменный пакет, который Движение может загрузить в плагин FxPlug 3.0.

Обзор

В дополнение к существующему пакету FxPlug (Встроенный Принципал), три новых цели должны быть добавлены к существующему проекту FxPlug 2.0:

  • Приложение

  • Служба XPC (принципал службы)

  • Протокол

Каждая цель имеет зависимости от сборки и фазы копии (оба под Фазами Сборки), которые производят следующую структуру:

<Application Bundle>.app/Contents/PlugIns/XPCBundle/Contents/PlugIns/<YourBundle>.fxplug

Ваш плагин входит в пакет Службы XPC PlugIns папка, Ваш пакет Службы XPC входит в комплект приложений PlugIns папка. Посмотрите рисунок 8-1.

Каждая новая цель также требует, чтобы несколько plist настроек для помощи хост-приложению (Движение, Final Cut Pro) нашли их и установили их атрибуты.

Наконец, два конфигурационных файла необходимы для идентификации платформ во время выполнения.

Пример

Этот пример берет пример FxPlug 2.4 SDK Яркости (GLSLFxPlug) и преобразовывает его в новую структуру FxPlug 3, шаг за шагом. Этот плагин использует только свой Встроенный Принципал.

Следующее требуется, чтобы работать через этот пример:

  • Xcode 5.0 или позже

  • FxPlug 3.0 SDK

  • Движение 5.1 или позже

  • Пример Яркости от FxPlug 2.4 SDK

Выполните следующие шаги для преобразования примера FxPlug 2.4 SDK Яркости в формат FxPlug 3:

  1. Проверьте пример Яркости.

    1. Откройте пример Яркости в XCode.

    2. Создайте пример Яркости.

    3. Поместите созданный пакет FxPlug в /Library/Plug-Ins/FxPlug/.

    4. Откройте Motion и проверьте, что загружается плагин.

    5. Удалите файлы, в которых Вы просто поместили /Library/Plug-Ins/FxPlug/.

  2. Добавьте три новых цели к проекту Яркости в XCode.

    1. Выберите проект в левой области навигации.

    2. Нажмите Add Target в разделе Targets (или выберите File> New> Target).

      ../Art/addnewtarget.png
    3. Выберите OS X Cocoa Application и нажмите Далее.

    4. Войти BrightnessFilter для названия продукта.

    5. Введите идентификатор компании и нажмите Finish.

      ../Art/brightnessfilterapptarget.png
    6. Добавьте вторую новую цель, типа Служба XPC, с названием продукта BrightnessXPC.

      ../Art/addsecondnewtarget.png
    7. Добавьте новый файл типа класса Objective C, названного BrightnessProtocol. Помещенный и в целях GLSLFxPlug и BrightnessXPC.

      ../Art/brightnessprotocol.png
    ../Art/threenewtargets.png
  3. Укажите сборку и скопируйте зависимости.

    1. Выберите целевое приложение BrightnessFilter и откройте вкладку Build Phases.

    2. Откройте раздел Target Dependencies и нажмите элементы Add (+) кнопка.

    3. Выберите BrightnessXPC и нажмите Add.

      ../Art/addbrightnessfiltertargetdependency.png
    4. Выберите Editor> Add Build Phase> Add Copy Files Build Phase.

    5. Дважды щелкните по новому заголовку фазы, чтобы переименовать его и войти Copy XPC Bundle.

    6. Откройте новую Копию фаза Пакета XPC и выберите PlugIns из раскрывающего меню Destination.

    7. Нажмите элементы Add (+) кнопка.

    8. Выберите цель BrightnessXPC из Списка продуктов и нажмите Add.

      ../Art/addbrightnessfiltercopydependency.png
    9. Выберите целевую службу XPC BrightnessXPC и откройте вкладку Build Phases.

    10. Откройте раздел Target Dependencies и нажмите элементы Add (+) кнопка.

    11. Выберите GLSLFxPlug, существующий пакет FxPlug, и нажмите Add.

      ../Art/addbrightnessxpctargetdependency.png
    12. Выберите Editor> Add Build Phase> Add Copy Files Build Phase.

    13. Дважды щелкните по новому заголовку фазы, чтобы переименовать его и войти Copy Embedded Plugin.

    14. Откройте новую Копию Встроенная Сменная фаза и выберите PlugIns из раскрывающего меню Destination.

    15. Нажмите элементы Add (+) кнопка.

    16. Выберите цель GLSLFxPlug.fxplug из Списка продуктов и нажмите Add.

      ../Art/addbrightnessxpccopydependency.png
    17. Под целями GLSLFxPlug и BrightnessXPC, быть уверенным, что Protocols.m перечислен под Исходной фазой Компиляции. Если это не находится в обоих расположениях, несомненно, добавят его.

    18. Добавьте платформу FxPlug к фазе сборки BrightnessXPC. Выберите цель BrightnessXPC. Перетащите FxPlug.framework от Внешней группы Платформ и Библиотек к Двоичному файлу Ссылки С разделом фазы сборки Библиотек.

      ../Art/addfxplugframeworktobrightnessxpclinkphase.png
  4. Установите свою схему создать BrightnessFilter.app файл, создайте его и проверьте.

    1. Выберите BrightnessFilter из раскрывающего меню схемы и выберите свою платформу (32-разрядный или 64-разрядный).

      ../Art/setbrightnessfilterscheme.png
    2. Выберите Product> Build (или нажмите Command-B).

    3. Откройте папку отладки проекта.

    4. Щелкните правой кнопкой (или Щелчок управления) по приложению BrightnessFilter и выберите Show Package Contents.

    5. Перейдите к Contents/PlugIns, и проверьте, что присутствует пакет BrightnessXPC XPC.

    6. Щелкните правой кнопкой (или Щелчок управления) по пакету XPC и выберите Show Package Contents.

    7. Перейдите к Contents/PlugIns, и проверьте, что присутствует GLSLFxPlug.fxplug.

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

  5. Изменитесь XPC связывают расширение от .xpc к .pluginkit.

    1. Выберите цель BrightnessXPC и откройте вкладку Build Settings.

    2. Найдите Настройку внутреннего абонента Обертки и измените значение от xpc до pluginkit.

  6. Измените Протокол (BrightnessProtocol) класс.

    1. В BrightnessProtocol.h, замена:

      @interface BrightnessProtocol : NSObject

      с:

      @protocol BrightnessProtocol <NSObject>
    2. Компилятор Objective C и время выполнения выполняет некоторую оптимизацию, обрезающую неиспользованные протоколы от кода. Поскольку Вы хотите оставить этот протокол в покое, необходимо сделать дополнительный шаг обращения к нему в коде, чтобы препятствовать ему обрезаться. В BrightnessProtocol.m, замена:

      @implementation BrightnessProtocol
       
      @end

      с:

      void preserveProtocolFromBeingTrimmed()
      {
          (void)@protocol(BrightnessProtocol);
      }

      В GLSLFxPlug.m, добавьте следующий к - initWithAPIManager:

      - (id)initWithAPIManager:(id)apiManager
      {
          (void)@protocol(BrightnessProtocol);
      ...
      }
    3. Наверху GLSLFxPlug.h, убедиться импортировать Ваш Протокол:

      #import "BrightnessProtocol.h"
  7. Измените Принципал Службы (BrightnessXPC) класс.

    1. Щелкните правой кнопкой (или Щелчок управления) по группе BrightnessXPC и выберите New File для добавления Основного Класса цели XPC.

    2. Выберите класс Objective-C и нажмите Далее.

    3. Войти BrightnessServicePrincipal в поле Class и нажимают Далее.

    4. Сохраните новый файл в папке BrightnessXPC (группа) и выберите цель BrightnessXPC.

      ../Art/setbrightnessxpctarget.png
    5. Укажите, что этот новый класс придерживается протокола BrightnessProtocol. В BrightnessServicePrincipal.h, добавьте:

      #import "BrightnessProtocol.h"

      и замена:

      @interface BrightnessServicePrincipal : NSObject

      с:

      @interface BrightnessServicePrincipal : NSObject <BrightnessProtocol>
    6. Взгляд на main.m файл в цели BrightnessXPC показывает, что было автоматически добавлено много кода. Поскольку FxPlug обрабатывает все для Вас, этот код не необходим. Поэтому замените содержание этого файла со следующим:

      #import <FxPlug/FxPlugSDK.h>
      #import "BrightnessServicePrincipal.h"
       
      int main(int argc, const char *argv[])
      {
          [FxPrincipal startServicePrincipal];
          return 0;
      }
  8. Каждая цель зависит от друг друга для создания единственного комплекта приложений. Когда приложение загружается, внутренняя структура загружается из ряда plists. На этом шаге мы добавляем необходимую информацию так, чтобы хост-приложения знали то, что загружается.

    1. Откройтесь BrightnessXPC-Info.plist файл в папке Supporting Files для целевой группы BrightnessXPC.

    2. Выберите Editor> Add Item.

    3. Войти PlugInKit для имени. (Заметьте, что P, я и K капитализируемся, и ничто иное.)

    4. Установите тип в Словарь.

    5. Добавьте следующие элементы к словарю PlugInKit:

      Ключевое имя

      Ввести

      Значение

      Протокол

      Строка

      BrightnessProtocol

      PrincipalClass

      Строка

      BrightnessServicePrincipal

      EmbeddedCode

      Строка

      GLSLFxPlug.fxplug

      Атрибуты

      Словарь

      N/A

      Добавьте следующий элемент к словарю Атрибутов:

      • Ключевое Имя: com.apple.protocol

      • Тип: строка

      • Значение: FxPlug

      Финал plist похож на это:

      ../Art/brightnessxpcplist.png

      Если Вы не намереваетесь использовать XPC, и таким образом, не определяйте полезный протокол, можно видеть ошибку после загрузки в консоли. Эта ошибка предполагает, что не был найден именованный протокол. Перечислите NSObject как значение для Протокола в этом случае.

  9. Примените подпись кода в настройках сборки проекта. Обязательно установите подпись кода на уровне проекта, и не только для единой цели. Если Вы уже имеете существующие идентификационные данные подписи кода, выбираете это; иначе, можно использовать оперативную подпись кода. Для получения дополнительной информации о подписывании кода посмотрите Руководство по Подписыванию кода.

    1. Выберите проект в левой области навигации.

    2. Откройте вкладку Build Settings проекта.

    3. Найдите установку Code Signing Identity.

    4. Установите значение в применимый сертификат (Ваше собственное или то, которое Вы просто создали).

    ../Art/applycert.png../Art/applycert.png
  10. Выполните полный чистый проект, и разработайте свой проект.

  11. Найдите созданное приложение и дважды щелкните по нему. Появляется пустое приложение; это пространство свободно использовать, как Вы считаете целесообразным.

  12. Добавьте два новых конфигурационных файла к проекту XCode гарантировать, что могут быть найдены платформы FxPlug.

    1. Выберите File> New.

    2. Выберите шаблон Configuration Settings File из OS X> Другая группа и нажмите Далее.

    3. Войти PlugInConfig для имени файла.

    4. Нажмите Create.

    5. Добавьте следующее:

      LD_RUNPATH_SEARCH_PATHS = @loader_path/../../../../Frameworks
      FRAMEWORK_SEARCH_PATHS = @loader_path/../../../../Frameworks
    6. Сохраните файл.

    7. Выберите File> New.

    8. Выберите шаблон Configuration Settings File из OS X> Другая группа и нажмите Далее.

    9. Войти XPCConfig для имени файла.

    10. Нажмите Create.

    11. Добавьте следующее:

      LD_RUNPATH_SEARCH_PATHS = @loader_path/../Frameworks
      FRAMEWORK_SEARCH_PATHS = @loader_path/../Frameworks
    12. Сохраните файл.

    ../Art/configfilescreate.png
  13. Сконфигурируйте проект XCode использовать новые конфигурационные файлы.

    1. Выберите проект в левой области навигации.

    2. Откройте вкладку Info проекта.

    3. Откройте раздел Configurations.

    4. Поставьте цель FxPlug для использования PlugInConfig.xcconfig файл, и поставленный цель XPC для использования XPCConfig.xcconfig файл.

        Конфигурационные файлы Набора рисунка 8-2
  14. Выполните проверку проверки, чтобы удостовериться, что хост-приложение может загрузить плагин.

    1. Запустите приложение Движения и проверьте, что фильтр в качестве примера загружается успешно. Время от времени можно хотеть вручную добавить или удалить плагин из базы данных PlugInKit. Можно сделать это посредством использования Terminal.app и следующих команд. Действительно имейте в виду, что регистрация обрабатывается Launch Services в фоновом режиме, так удаление плагина не гарантирует, что не будет добавлено назад вскоре после того.

    2. Откройте Окно терминала и введите следующую команду для регистрации плагина:

      pluginkit -a /<application_location>/BrightnessFilter.app/Contents/PlugIns/*
    3. Чтобы не зарегистрировать плагин, введите следующую команду в Окно терминала:

      pluginkit -r /<application_location>/BrightnessFilter.app/Contents/PlugIns/*