Как отладить Заставка в OS X

Мне было интересно, есть ли какой-нибудь достойный способ, кроме NSLog-ing, почти все - чтобы правильно отладить набор приложений Screensaver в OS X?

"Заставка" - это тип проекта в Xcode, но, очевидно, нет отладки Build and Go. Кроме того, я обнаружил, что на самом деле мой пакет загружается в

/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app 

как какой-то плагин.

Итак, есть ли достойный способ отладки вашего кода? Глядя на отчеты о сбоях и NSLog-ing на консоль помогает, но это далеко не идеально.

Ответы

Ответ 1

Существует старая статья MacTech, в которой описывается цикл разработки Screen Saver. В статье также есть Часть 2. Просмотрите раздел "Советы по отладке".

Я нахожу этот метод болью, поэтому я написал приложение, основное приложение было одним окном и контроллером, который инициализировал ScreenSaverView с моим новым набором скринсейверов. Как только это работало, все, что мне нужно было сделать, чтобы проверить изменение, было поражено Command-R в Xcode.

Ответ 2

Из-за OS X 10.11 Функция защиты целостности системы El Capitan, отладчик не может подключиться к чему-либо, работающему от /System/. Кроме того, другая информация здесь относится к старым версиям Xcode.

Вот как я работал над El Capitan с Xcode 7.2:

  • Скопируйте /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/ в /tmp/. (Так как .xcсхема ссылается на полностью квалифицированный путь, копирование его в какое-то место обычно лучше всего для совместной работы, а не где-то в конкретном домашнем каталоге пользователя.)
  • Отредактируйте проект .xcscheme:
    • Задайте исполняемый файл для действия "Выполнение" для скопированного приложения и добавьте аргументы: -debug -background -module "<product-name>" (где <product-name> - это имя пакета без расширения .saver).
    • Добавьте предварительное действие script (источник ниже), с его оболочкой, установленной на /bin/bash, и его настройками сборки выходят из схемы. Он создает символическую ссылку на встроенный пакет .saver в ~/Library/Screen Savers/

Источник:

SCREEN_SAVER_PATH="${HOME}/Library/Screen Savers/${FULL_PRODUCT_NAME}"
if [[ -d "${SCREEN_SAVER_PATH}" || -f "${SCREEN_SAVER_PATH}" || -L "${SCREEN_SAVER_PATH}" ]]; then
    rm -Rf "${SCREEN_SAVER_PATH}"
fi
ln -s "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" "${SCREEN_SAVER_PATH}"

Теперь, когда вы нажмете кнопку Xcode Run, экранная заставка будет работать в фоновом режиме на вашем рабочем столе, и вы можете использовать отладчик.

Ответ 3

Вы можете отлаживать плагины, выполняя приложение, которое будет загружать плагин.

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

Для отладки заставки вы также можете использовать второй Mac и использовать удаленная отладка, чтобы ваши действия с пользовательским интерфейсом не мешали заставки.

Ответ 4

Есть несколько приложений Mac OS X, которые будут запускать экранные заставки: SaverLab, Screenalicious и т.д. Просто найдите один из них в Интернете и загрузите его, а затем установите в качестве целевого исполняемого файла (как сказал Питер Н. Льюис).

Чтобы избежать копирования продукта сборки в "~/Library/Screen Savers/" после каждой сборки, вы можете добавить пользовательскую сборку script (примечание: я использую '/bin/tcsh -x' для оболочки)

#remove the old screen saver or link
rm -Rf "${SCRIPT_OUTPUT_FILE_0}"

#if this is a debug build…
if ("${CONFIGURATION}" == "Debug" ) then

# create a symbolic link from our screen saver to this users screen saver directory
ln -sfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}"

#if this is a release build…
else if ("${CONFIGURATION}" == "Release" ) then

# copy our screen saver to this users CMM directory
cp -Rfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}"

endif

Затем установите свой входной файл в "$ {BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" и его выходной файл в "$ {HOME}/Library/Screen Savers/${FULL_PRODUCT_NAME}".

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

Ответ 5

Вы также можете сделать движок заставки ('/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app') целевого исполняемого файла и передать ему флаг -background (так что он работает за всем, а не спереди всего).

Ответ 6

Как говорит Питер, вы можете отлаживать плагин, выполняя приложение, которое будет загружать плагин.

Однако, вместо использования механизма заставки вы также можете использовать системные настройки. Когда появятся настройки, перейдите в свою заставку в разделе "Desktop and Screen Saver", чтобы загрузить ваш плагин.

Это не идеально, так как ваше представление будет не полным, но это может быть проще, чем настройка удаленной отладки.

Ответ 7

не обязательно лучший способ, но вы можете ssh с другой машины и запустить ScreenSaverEngine из gdb (untested)

изменить

Кроме того, вы можете попробовать добавить новую цель приложения и добавить ScreenSaverView в окно в IB, вам, возможно, придется вручную настраивать такие вещи, как настройки, но это может помочь некоторым и, вероятно, работать нормально, так как ScreenSaverView является подклассом NSView

Ответ 8

Если вы создадите копию приложения ScreenSaverEngine и подпишите его с помощью идентификатора разработчика, он исправит ситуацию, когда System Integrity Protection предотвращает присоединение отладчика. Просто убедитесь, что исполняемый файл установлен на вашу собственную подписанную копию.

Ответ 9

Я хотел бы отметить, что решение @Karl работает лучше всего для меня. Однако, если вы похожи на меня и перезагружаете свой компьютер каждую ночь, возможно, вы захотите добавить:

cp -Rn/System/Library/CoreServices/ScreenSaverEngine.app/tmp

в начале сценария оболочки перед сборкой, упомянутого в его ответе. Это автоматически сделает шаг копирования за вас.

(хотя я считаю, что это действительно относится к комментарию, мой xp еще недостаточно высок)