- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
en viewDidLoad
una extensión de iOS 8 . las NSLog
salidas no tienen nada en Xcode. NSLog
Sin embargo, funciona como de costumbre en la aplicación de contenedor.
¿Cómo puedo obtener resultados de los mensajes de depuración de una extensión?
ios
ios8
xcode6
ios-app-extension
Oh ho
fuente
fuente
Respuestas:
Pasos para depurar una extensión de aplicación:
Ejecute la aplicación de contenedor. En este paso, Xcode carga la aplicación contenedora y la extensión de la aplicación en el dispositivo o simulador.
Detenga la aplicación del contenedor. Este paso es importante cuando depura en el simulador. Si no lo hace, Xcode le dirá que el simulador está en uso.
En Xcode, presione el menú Depurar -> Adjuntar al proceso -> Por identificador de proceso (PID) o Nombre ..., ingrese el identificador de la extensión de la aplicación, por ejemplo, com.abc.ContainerApp.MyExtension, para iniciar la depuración. No olvide establecer puntos de quiebre. (Actualización del 25 de agosto de 2014: puede ingresar MyExtension (el nombre de su extensión) directamente).
En el dispositivo o simulador, abra la extensión de su aplicación.
Actualizaciones el 23 de agosto de 2014:
Encontré que los pasos de depuración anteriores no funcionan bien en Xcode 6 beta 6 con iOS 8 SDK beta 5 en el simulador.
Solución:
Los puntos de interrupción funcionan. Pero no sé por qué los registros no se muestran en la ventana de salida.
fuente
Yo también tengo este problema. Me funciona si vas a tu Simulador en el menú Depurar -> Abrir registro del sistema ...
Desde aquí puede ver todos los registros del iPhone Simulator (incluidos los registros de su extensión).
fuente
NSLog
está trabajando perfectamente .Simplemente no ve lo que se está registrando en el área de depuración de Xcode porque el depurador de Xcode no está adjunto a su extensión. Las extensiones son casi completamente independientes de la aplicación que las contiene. Tienen identificadores de paquete separados, por ejemplo, y también son procesos separados en el sistema operativo.
He tenido varios éxitos en lograr que Xcode se adjunte a las extensiones. Supuestamente parece que se adjunta automáticamente, y aparece en el navegador de depuración como "Esperando adjuntar", pero nunca se adjunta.
A veces, puedo ejecutar mi destino de extensión en Xcode:
Y luego tengo la opción de elegir en qué aplicación ejecutar mi extensión. En este caso, elegiría su recomendación de "hoy", que es el centro de notificaciones.
Y luego a veces adjuntaba el depurador a mi extensión. Tenga en cuenta que este método solo funciona en dispositivos físicos, al parecer.
Si no se adjunta, puede usar el método de adjunto manual en la respuesta de @ VinceYaun,
También he tenido un éxito variado utilizando otros métodos de apego. La mayoría no han tenido éxito y parece que son solo errores que se solucionarán en una fecha posterior.
Para ver sus mensajes de registro, vaya a
Window
->Devices
en la barra superior y seleccione su dispositivo. Puede abrir el registro del dispositivo desde la parte inferior de esa ventana. Si está probando en un simulador, puede usar la respuesta de @ BalestraPatrick .Algunos de los errores se han corregido en Beta 2, y supongo que eventualmente el depurador se adjuntará automáticamente al iniciar la extensión.
Actualización: en las notas de la versión de iOS 8 Beta 4 :
fuente
Yo también tengo este problema. Xcode nunca adjunta mi depurador a la extensión ni muestra mensajes NSLog. Si adjunta su depurador Xcode manualmente a su proceso de extensión, al menos los puntos de interrupción funcionan como un encanto:
fuente
Se trabaja para mí :)
fuente
NSLog
solo funcionará si está ejecutando la aplicación de contenedor. Que no va a funcionar si se está ejecutando la aplicación extensión en lugar del contenedor.Xcode 8 puede depurar extensiones:
Resultado: los puntos de interrupción y el registro funcionan como de costumbre.
fuente
Lo que finalmente me permitió ver el registro en el área de depuración, según la sugerencia de Michael y la documentación de Apple , es:
Cree y ejecute la extensión de la aplicación en el simulador y, cuando se le solicite una aplicación de host, elija la aplicación específica desde la que va a llamar a la extensión . En mi caso, estaba lanzando mi extensión Action desde Safari abriendo una hoja para compartir en un PDF.
Lo que no funcionaba antes era seguir las sugerencias de otras personas de usar Today como host, pero luego dejar esa aplicación y pasar a Safari para llamar a mi extensión. Ya ni siquiera necesito ejecutar mi aplicación contenedora antes de ejecutar la extensión.
De la documentación de Apple:
fuente
De hecho, logré que los registros se ejecutaran de manera bastante simple en Xcode 6.3. En primer lugar, compile y ejecute la aplicación que lo contiene. Una vez que la aplicación contenedora se esté ejecutando en el dispositivo, compile y ejecute la extensión de la aplicación cambiando el esquema a la extensión de la aplicación.
Apple tiene documentación directamente relacionada con la depuración, la creación de perfiles y la prueba de la extensión de su aplicación.
fuente
Un truco que me funciona (aunque es bastante feo) es colocar un muñeco
UILabel
en algún lugar de la esquina inferior de mi extensión. Normalmente lo llamologLabel
. Luego, es posible actualizar el texto de esta etiqueta con cualquier declaración de registro que desee registrar. Este enfoque no es muy bueno si necesita registrar declaraciones de instancias de diferentes clases. Y, obviamente, satura tu interfaz de usuario.Sin embargo, si tiene un widget bastante simple y no le importa un ligero desorden de la interfaz de usuario, este es el truco. Probé todas las demás soluciones descritas en esta discusión y, lamentablemente, ninguna de ellas funcionó para mí.
fuente
La única forma en que la depuración funciona para mí es seleccionando Depurar-> Adjuntar al proceso por PID o Nombre Luego ingrese el PID, no el nombre de la extensión. Puede encontrar el PID ejecutando la extensión en un dispositivo, vaya a Ventana-> Dispositivos. Encuentra tu dispositivo y visualiza la consola. Cuando vea el nombre de su extensión, estará seguido de un número de 5 dígitos. Ese es el PID
También puse un montón de NSLog en la extensión para encontrar el PID. Esto está en xCode 7
fuente
Encuentra el mismo problema sobre la extensión
NSLog
y los puntos de ruptura. Lo he combatido con muchos días.Device log
se puede encontrar como la siguiente imagen. Es enXCode -> Window -> Devices and Simulators
.Después de ingresar
Open Console
, hay un campo de búsqueda en la parte superior derecha del cuadro de diálogo. Puedo aplicar la regla de filtro allí. Por ejemplo, el nombre de un proceso contieneNotification
una palabra clave, o el nombre del proceso debe ser igual al nombre del destino de la extensión, por ejemplo: igual alMyNotificationServiceExtension
nombre del proceso.fuente
Claramente, algo está roto en Xcode6-B5.
Si intento ejecutar una extensión de foto en el simulador, no puedo ver ninguna aplicación de fotos como una opción para el proceso de adjuntar la extensión.
Lo mismo, ejecutándose en un dispositivo real, me da el comportamiento correcto.
En el primer caso, no se respeta ningún punto de interrupción. En el último caso, los puntos de interrupción funcionan a la perfección.
fuente
Debe saber que la aplicación contenedora y la extensión son procesos totalmente diferentes en iOS, mientras que LLVM depura solo un hilo por vez, por lo que cuando está depurando, la consola nunca registra la extensión y nunca se detiene en el punto de interrupción.
Puede resolver la mayoría de los problemas con el método de @Vince Yuan.
Sin embargo, mi problema es que el depurador de Xcode apenas se engancha en la extensión de mi teclado tanto en el simulador de iOS como en los dispositivos, como 1 vez en 7-8 ejecuciones. Es totalmente una cuestión de probabilidad. El método de @Vince Yuan también funciona solo a veces.
Mi pequeña experiencia es que cuando ejecuta su esquema de depuración, si la sesión de depuración en el panel izquierdo muestra que 'Sin sesión de depuración', no hay necesidad de abrir su extensión y probarla, el depurador no se enganchó, simplemente ejecute de nuevo por suerte.
pero cuando vea que com.xxx.xxx.xxx está esperando para adjuntar, la extensión definitivamente se puede depurar.
Este es un pequeño truco para quienes no pueden depurar la extensión de iOS, especialmente la extensión del teclado.
fuente
A partir de Xcode 6 Beta 5, he podido usar un dispositivo real con iOS8 para depurar mi extensión. Intente ejecutarlo en un dispositivo y seleccione Safari para iniciar
fuente
Para superar todos los estados causados por el IDE en constante cambio, estoy usando iOS Console de lemonjar.com: muestra una ventana de consola para cualquier dispositivo iOS conectado que muestre mensajes de syslog independientemente del ID del proceso. Puede ver los mensajes de registro de depuración de aplicaciones y extensiones a la vez aquí.
fuente
Podría depurar mi extensión de la forma que describo a continuación:
Debug
->Attach to process by PID or Name
. El nombre de su esquema de extensión.main app target
y ejecute.Espero que también les funcione a ustedes.
fuente