Как отладить Заставка в 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 еще недостаточно высок)