Как отладить заставку в OS X - PullRequest
20 голосов
/ 09 июля 2009

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

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

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

приложение как своего рода плагин.

Так есть ли достойный способ отладки вашего кода? Просмотр отчетов о сбоях и NSLoging на консоли помогает , но это далеко от совершенства.

Ответы [ 9 ]

14 голосов
/ 09 июля 2009

Есть старая MacTech статья, которая описывает цикл разработки Заставки. Существует также Часть 2 к статье. Посмотрите в разделе «Советы по отладке».

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

7 голосов
/ 21 января 2016

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

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

  1. Скопируйте /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/ в /tmp/. (Так как .xcscheme ссылается на полный путь, копирование его в какое-то общее место лучше всего подходит для совместной работы, а не в какое-либо место в домашнем каталоге конкретного пользователя.)
  2. Редактировать проект .xcscheme:
    • Установите исполняемый файл для его действия Run для скопированного приложения и добавьте аргументы: -debug -background -module "<product-name>" (где <product-name> - имя пакета без расширения .saver).
    • Добавьте сценарий предварительного действия (источник ниже) с его оболочкой, установленной на /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, заставка будет работать в режиме обоев на рабочем столе, и вы сможете использовать отладчик.

6 голосов
/ 09 июля 2009

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

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

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

3 голосов
/ 13 мая 2013

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

3 голосов
/ 12 февраля 2012

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

Чтобы избежать копирования продукта сборки в «~ / Library / Screen Savers /» после каждой сборки, вы можете добавить собственный сценарий сборки (примечание: я использую «/ 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}".

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

2 голосов
/ 18 июля 2009

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

Однако вместо использования движка заставки вы также можете использовать системные настройки. Когда настройки появятся, перейдите к заставке в разделе «Рабочий стол и заставка», чтобы загрузить плагин.

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

1 голос
/ 09 июля 2009

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

редактировать

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

0 голосов
/ 09 апреля 2019

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

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

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

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

0 голосов
/ 12 августа 2016

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

...