Depurar WatchKit en Apple Watch real – No pasa nada

Estoy luchando con la debugging de mi WatchKit Extension / App en un Apple Watch real. Depurar tanto la aplicación de iPhone como la extensión de WatchKit usando el simulador el simulador no es un problema:

  1. Seleccione el perfil de la aplicación WatchKit y ejecútelo en Simulator ==> La aplicación se inicia en Watch Simulator y puedo utilizar puntos de interrupción en el código de la extensión para depurar.
  2. Para depurar la aplicación de iPhone también, lanzo la aplicación en el simulador y adjunto el depurador manualmente ==> Puedo usar puntos de interrupción en el Código de iPhone para depurar.

No es un problema observar tanto el trabajo de la aplicación de iPhone como la aplicación de reloj. Al less no en el simulador.

Me gustaría hacer lo mismo en un Apple Watch real . Pero cuando selecciono el perfil de la aplicación WatchKit y mi iPhone real (en lugar del Simulador) y hago clic en "Ejecutar", no sucede nada. Esto significa que Xcode parece generar e iniciar la aplicación, pero no sucede nada en los dispositivos. El campo de estado en Xcode muestra:

Creación de la aplicación MyKeep WatchKit: Extensión de MyKeep WatchKit

Creación de la aplicación MyKeep WatchKit: acabado …

Ejecución de MyApp en mi iPhone 6

Esto es todo. No hay window de debugging, los puntos de interrupción se ignoran o no funcionan y la aplicación no se inicia ni en el iPhone ni en Apple Watch.

Encontré otras preguntas sobre problemas con la debugging en dispositivos reales (por ejemplo, aquí ), pero todos se ocupan de problemas de installation y firma. En mi caso, tanto la aplicación de iPhone como la aplicación WatchKit están instaladas sin ningún problema. Cuando hago clic en el ícono de la aplicación en el Reloj, puedo comenzar y usar la aplicación. El problema es que no puedo depurar este process.

¿Por qué tengo que depurar el process en dispositivos reales? Bueno, hay una cosa que no puedo probar con el simulador: ¿Qué sucede cuando la aplicación Watch intenta ponerse en contacto con la aplicación iPhone usando openParentApplication:reply: cuando la aplicación iPhone ya no está funcionando? Esto funciona perfectamente en el simulador, pero en los dispositivos reales, las aplicaciones de reloj parecen no recibir respuesta de la aplicación de iPhone y simplemente esperan por siempre.

Ya encontré pistas para resolver esto, pero sin poder depurar la aplicación Watch y ver cómo se ejecuta el código, no puedo estar seguro de qué está sucediendo …

Gracias por sus respuestas. Finalmente logré que la debugging funcione (la mayoría de las veces) en mi Apple Watch real. Sin embargo, es bastante engorroso y poco confiable. No hay suficiente espacio en los comentarios, así que usaré esta respuesta para describir mi solución. Quizás sea una ayuda completa para otros:

  1. Asegúrese de que la aplicación en su reloj no se esté ejecutando (como describió Balestra Patrick). Abre la aplicación y mantén presionado el button lateral unos segundos para que aparezca el cuadro de dialog "Desactivar tu reloj". Mantenga presionado el button lateral por unos pocos segundos para cerrar la aplicación y volver a la pantalla de inicio del reloj.
  2. Asegúrate de que el iPhone no esté bloqueado.

  3. Seleccione el objective de la WatchKit App y su iPhone real y ejecute el proyecto.

  4. La ejecución de la aplicación Watch resultó con bastante frecuencia en un error SPErrorInvalidBundleNoGizmoBinaryMessage . Reiniciar Xcode y limpiar tanto la aplicación Watch como el objective de la aplicación lo resolvieron.
  5. Si la compilation de la aplicación Watch tiene éxito, habrá un post corto en Xcode, pero nada en tu iPhone o Watch. Si ha realizado cambios en la aplicación Watch, tardará unos segundos en actualizar la aplicación en Watch. Esto se indica con la superposition del círculo de progreso sobre el ícono de la aplicación. Si no realizó ningún cambio de mineral una vez que la aplicación se haya transferido: Inicie la aplicación de reloj manualmente tocando el ícono . No habrá un lanzamiento automático.
  6. En la mayoría de los casos, Xcode reconocerá el lanzamiento de la aplicación y adjuntará su depurador. Esto permitirá usar puntos de interrupción, inspeccionar el código, etc.

En mi caso, me encantó examinar cómo la aplicación iPhone maneja la application:handleWatchKitExtensionRequest:reply: llamada cuando la aplicación no estaba activa antes . Esto es importante porque esto no se puede hacer con el simulador. Si la aplicación tarda en manejar la request, Watch no recibirá una respuesta válida.

Después de seguir los pasos descritos anteriormente, Xcode solo se adjunta a la aplicación de reloj y no se mantendrá en los puntos de interrupción en el código de la aplicación de iPhone. Para hacer esto, uno tiene que adjuntar manualmente el process de la aplicación Depurador al iPhone que se inicia cuando la aplicación de reloj envía su llamada.

Para poder adjuntar el depurador agregué un retraso a la function principal de aplicaciones: [NSThread sleepForTimeInterval:5] :

  1. Seleccione la function en la aplicación de reloj que comenzará la llamada a la aplicación de iPhone
  2. La aplicación para iPhone se lanzará en segundo plano. Los retrasos le dan 5 segundos para adjuntar el depurador.
  3. Elija Debug\Attach To Process\Likely Targes\Your iPhone App en Xcode para adjuntar el depurador.
  4. Después de los 5 segundos de retraso, el process continuará y podrá usar puntos de interrupción en el código de su aplicación de iPhone también.
  5. No olvide quitar el código de retraso cuando termine de probar 🙂

NOTA: No podrá ver la salida de NSLog (o ninguna salida de la console en absoluto) desde la aplicación de iPhone ya que al adjuntar el depurador NO se vuelve a enrutar la salida de la console.

Pruebas felices con este increíble nuevo producto de Apple 😛

Estoy teniendo el mismo tipo de problema, pero para mejorar un poco la experiencia de debugging, suelo reiniciar mis dispositivos varias veces. Intenta reiniciar tu Apple Watch o tu iPhone.

Antes de iniciar su aplicación desde Xcode, asegúrese de que la aplicación esté completamente cerrada en su Apple Watch (no está atrapada en la pantalla de carga, por ejemplo). Para hacerlo, debes forzar cerrar la aplicación: ingresa tu aplicación, mantén presionado el button lateral hasta que aparezca el menu para apagar el reloj, luego presiona el mismo button lateral por unos segundos más hasta que el reloj regrese a la pantalla de inicio y la fuerza de cerrar su aplicación.

Ahora puedes intentar comstackr y ejecutar la aplicación desde Xcode y debería funcionar de manera más confiable.

watchOS 3+:

La fuerza se cierra presionando y manteniendo presionado el button lateral (el button justo debajo de la corona digital) hasta que aparezca la pantalla de apagado, y luego suelte el button lateral, luego presione y mantenga presionada la corona digital.

Aquí hay una técnica que parece ser la más confiable para mí, aunque solo funciona aproximadamente el 25% del time (Xcode 7 beta 4, 7A165t):

  1. Ejecuta el objective del teléfono en debugging (en tu iPhone real, por supuesto)
  2. Mientras la aplicación iPhone todavía se está ejecutando, cambie al objective de reloj y ejecútelo en debugging.
  3. Vigila la pantalla de inicio de tu reloj mientras la aplicación se instala. Una vez que la aplicación esté instalada, toca para abrirla. Esto a veces "arranca" la aplicación de reloj y permite que el depurador la capture. En este punto, deberías poder depurar tanto tu aplicación de iPhone como la aplicación watchOS.

Esta pregunta tiene diferentes respuestas. Todos estan bien.

La razón es: en mi experiencia hay al less dos problemas diferentes que evitan la debugging en un reloj real. Ambos requieren una estrategia diferente.

Esta respuesta intenta ayudarlo a decidir cuándo usar qué estrategia.

  1. XCode se instala, le dice que se está ejecutando por un corto time y luego deja de mostrar "corriendo …".
    • Comience con la respuesta de BalestraPatrick:
    • reinicia tus dispositivos
    • No te olvides de reiniciar tu iPhone. Esto hizo el truco la primera vez que tuve este problema.
  2. XCode se instala, le dice que se está ejecutando durante un período de time más largo: "ejecutando <projectName> en Apple Watch de <yourname>.
    • Comience con la respuesta de Jay Hickey o Andrei Herford
    • Comenzar la aplicación de reloj manualmente probablemente sea el truco.

También tuve ocasiones en que XCode pudo iniciar mi aplicación de reloj sin ninguna ayuda de mi parte.

Prima:

Comenzando con XCode 7.1 parece que XCode no siempre comstack todos los files Swift necesarios (más a menudo que antes). Esto no es específico del reloj, también se aplica a las aplicaciones de iOS. Los síntomas pueden ser similares a los de esta pregunta. -> limpie su proyecto y luego reinicie XCode.