objective c - Cómo depurar un salvapantallas en OS X
objective-c xcode (9)
Como dice Peter, puedes depurar el complemento ejecutando una aplicación que cargará el complemento.
Sin embargo, en lugar de usar el motor de salvapantallas, también puede usar las preferencias del sistema. Cuando aparezcan las preferencias, navegue hasta el protector de pantalla en "Escritorio y protector de pantalla" para cargar su complemento.
No es perfecto ya que su vista no será de tamaño completo, pero puede ser más fácil que configurar la depuración remota.
Me preguntaba si habría alguna forma decente, aparte de NSLog en casi todo, ¿para depurar correctamente un paquete de aplicaciones de Screensaver en OS X?
El "protector de pantalla" es un tipo de proyecto en Xcode, pero obviamente no hay depuración de Build and Go. Además, he encontrado que, de hecho, mi paquete se está cargando en el
/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app
Aplicación como una especie de plugin.
Entonces, ¿hay una manera decente de depurar su código? Ver los informes de fallos y NSLog-ing en la consola ayuda , pero está lejos de ser perfecto.
Debido a la característica de protección de integridad del sistema OS X 10.11 El Capitan, el depurador no puede adjuntar nada que se ejecute desde /System/
. Además, la otra información aquí se aplica a las versiones anteriores de Xcode.
Así es como lo conseguí trabajando en El Capitán con Xcode 7.2:
- Copie
/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/
to/tmp/
. (Dado que .xcscheme hace referencia a la ruta completamente calificada, copiarla en un lugar común es mejor para la colaboración, en lugar de en algún lugar del directorio particular de un usuario en particular). - Edite el
.xcscheme
del proyecto:- Establezca el Ejecutable para su acción Ejecutar en la aplicación copiada, y agregue los argumentos:
-debug
-background
-module "<product-name>"
(donde<product-name>
es el nombre del paquete sin la extensión.saver
). - Agregue un script de acción previa (fuente a continuación), con su shell configurado en
/bin/bash
y sus configuraciones de compilación que provienen del esquema. Crea un enlace simbólico al paquete.saver
creado en~/Library/Screen Savers/
.saver
~/Library/Screen Savers/
- Establezca el Ejecutable para su acción Ejecutar en la aplicación copiada, y agregue los argumentos:
Fuente:
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}"
Ahora, cuando presiona el botón Ejecutar de Xcode, el protector de pantalla se ejecutará en modo de fondo de pantalla en su escritorio, y podrá usar el depurador.
Hay algunas aplicaciones de Mac OS X que ejecutarán protectores de pantalla: SaverLab, Screenalicious, etc. Solo busque una de ellas en la web y descárguela y luego configúrela como el ejecutable de destino (como dijo Peter N Lewis).
Para evitar copiar el producto de compilación en ''~ / Library / Screen Savers /'' después de cada compilación, puede agregar un script de compilación personalizado (nota: estoy usando ''/ bin / tcsh -x'' para el shell):
#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
A continuación, configure su archivo de entrada en "$ {BUILT_PRODUCTS_DIR} / $ {FULL_PRODUCT_NAME}" y su archivo de salida en "$ {HOME} / Library / Screen Savers / $ {FULL_PRODUCT_NAME}".
Ahora, cuando compile / ejecute su proyecto, se vinculará automáticamente a su compilación de depuración o copiará su compilación de lanzamiento.
Hay un viejo artículo de MacTech que describe el ciclo de desarrollo del protector de pantalla. También hay una Parte 2 al artículo. Busque en la sección "Consejos de depuración".
Considero que este método es un problema, por lo que escribí una aplicación, la aplicación básica era una ventana y un controlador que inicializó un ScreenSaverView con mi nuevo paquete de salvapantallas. Una vez que funcionó, todo lo que tenía que hacer para probar un cambio fue pulsar Comando-R en Xcode.
Me gustaría señalar que la solución de @Karl funcionó mejor para mí. Sin embargo, si usted es como yo y reinicia su computadora todas las noches, quizás quiera pensar en poner:
cp -Rn /System/Library/CoreServices/ScreenSaverEngine.app /tmp
al comienzo del script de shell pre-Build mencionado en su respuesta. Esto hará automáticamente el paso de copia para usted.
(Aunque creo que esto realmente pertenece a un comentario, mi XP aún no es lo suficientemente alto)
Puede depurar los complementos ejecutando la aplicación que cargará el complemento.
Entonces, para depurar un protector de pantalla, abra su proyecto de complemento, elija Nuevo ejecutable personalizado en el menú Proyecto y configure la aplicación para que sea el motor del protector de pantalla.
Para depurar un protector de pantalla, es posible que también desee utilizar un segundo Mac y la depuración remota para que las acciones de la interfaz de usuario no interfieran con el protector de pantalla.
Si hace una copia de la aplicación ScreenSaverEngine y la firma con su ID de desarrollador, solucionará la situación en la que la Protección de integridad del sistema evita adjuntar el depurador. Solo asegúrese de establecer el archivo ejecutable en su propia copia firmada.
También puede hacer que el motor de salvapantallas (''/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app'') sea el ejecutable de destino y pasarle la bandera de fondo (para que funcione detrás de todo en lugar de delante de todo) .
no es necesariamente la mejor manera, pero podría ssh desde otra máquina e iniciar ScreenSaverEngine desde gdb (sin probar)
editar :
también, puede intentar agregar un nuevo destino de aplicación y agregar su ScreenSaverView a una ventana en IB, puede que tenga que configurar manualmente elementos como la configuración, pero podría ayudar a algunos y probablemente debería funcionar bien ya que ScreenSaverView es una subclase de NSView