¿Cómo lanza JetBrains AppCode el simulador de iOS?

Acabo de mirar el IDE de la aplicación ID de JetBrains y parece poder lanzar el simulador de iOS y ejecutar aplicaciones en él.

Cuando tuve que automatizar el deployment de mis proyectos, tuve que recurrir a la automation de Applescript y GUI.

Parecen estar usando una herramienta cerrada llamada 'simlauncher'. Me pregunto cuál podría ser la magia detrás de eso.

Actualizar:

  1. Al mirar el Monitor de actividad, veo que osascript se inicia desde simlauncher antes de que se inicie el simulador. ¿Podría ser Applescript otra vez? Pensé que iOS Simulator.app no ​​era scriptable.
  2. iOS launcher parece ser lanzado por launchd, por lo que simlauncher definitivamente no lo está lanzando por sí mismo. Además, simlauncher se queda solo hasta que la aplicación real se ejecute en el simulador. ¿Tal vez lo están buscando?
  3. Para las comstackciones de dispositivos, están utilizando AMDeviceService, que es probablemente una versión de Apple Mobile Device Service. ¿Es esta una técnica de la cárcel roto SDK?

Un poco más de información sobre el simulador de la salida de 'ps':

plumenator 26404 12.9 1.3 290172 52772 ?? SX 8:56PM 0:03.62 /Users/plumenator/Library/Application Support/iPhone Simulator/4.3.2/Applications/817A280D-1F74-4755-B848-B04EC8A24ADA/xxx.app/xxx plumenator 26395 2.3 0.3 444208 13560 ?? S 8:56PM 0:00.72 /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/iPhone Simulator -SessionOnLaunch NO plumenator 26402 1.4 0.8 318320 33052 ?? Us 8:56PM 0:00.86 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -SBDisableAutoDim YES -SBAutoLockTime -1 -SBAutoDimTime -1 -SBDontLockAfterCrash YES -SBDidShowReorderText YES -SBFakeBars YES -SBDontAnimateAppleDown YES -SBEnableDoubleHeightToggling YES plumenator 26406 0.0 0.4 2466496 15792 ?? Ss 8:56PM 0:00.16 /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/libexec/gdb/gdb-i386-apple-darwin --arch i386 --interp=mi1 -q plumenator 26401 0.0 0.1 106584 5688 ?? S 8:56PM 0:00.30 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/libexec/lsd plumenator 26400 0.0 0.1 105228 4204 ?? S 8:56PM 0:00.13 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/libexec/installd -t 30 plumenator 26399 0.0 0.3 223488 11464 ?? Ss 8:56PM 0:00.15 /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/SimulatorBridge 26395 

Ahora supongo que es solo cuestión de orderar los commands de acuerdo con el pid y ejecutarlos. Todos los derechos reservados

Sin embargo, hay un problema. Todos estos binarys se refieren a los dylibs presentes en la raíz de la plataforma del simulador. Cuando los ejecuto directamente, buscan aquellos en '/'.

¿Hay alguna manera de establecer la ruta de los dylib antes de ejecutar un command? Esto parece prometedor: http://sacnetworkingsoftware.net/svn/misc/StemLibProjects/eaglshell/tags/2.1.0/Makefile

https://github.com/BlueFrogGaming/icuke tiene buena información también.

AppCode usa un contenedor especial para hacer esto, que notó en su console:

 /Applications/AppCode-108.379.app/bin/simlauncher 4.3 debug iphone <PATH_TO_APP> <STDOUT> <STDERR> 

simlauncher es un binary mach-o no documentado / no amigable … Pero aquí hay un análisis rápido de él:

  • Para iniciar el simulador utiliza un marco privado de Apple ( otool -L simlauncher ):

     /Applications/AppCode-108.379.app/bin/simlauncher: @rpath/iPhoneSimulatorRemoteClient.framework/Versions/A/iPhoneSimulatorRemoteClient (compatibility version 1.0.0, current version 12.0.0) 
  • Este marco se incluye con Xcode:

     <XCODE_PATH>/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.framework 
  • Y se usa así ( class-dump simlauncher ) ( DTiPhoneSimulator* son de Apple Framework):

     @protocol DTiPhoneSimulatorSessionDelegate - (void)session:(id)arg1 didEndWithError:(id)arg2; - (void)session:(id)arg1 didStart:(BOOL)arg2 withError:(id)arg3; @end @interface Launcher : NSObject <DTiPhoneSimulatorSessionDelegate> { DTiPhoneSimulatorSession *mySession; } - (int)launch:(id)arg1 sdkVersion:(id)arg2 wait:(BOOL)arg3 device:(int)arg4 sout:(id)arg5 eout:(id)arg6 argument:(id)arg7 env:(id)arg8; - (void)session:(id)arg1 didEndWithError:(id)arg2; - (void)session:(id)arg1 didStart:(BOOL)arg2 withError:(id)arg3; @end 

Acerca del otro AMDeviceService binary, puedo decir que utiliza ProtocolBuffers para poder comunicarme con el service MobileDevice … Una vez más, cosas indocumentadas …

Conclusión rápida, perdón, no hay una forma fácil de iniciar iPhoneSimulator utilizando la forma JetBrains, a less que invierta Apple / API no documentadas … como lo hicieron las personas de Jetbrains, me encantan sus herramientas, son armas principales, no puedo esperar appcode para ser oro, ya está trabajando en él todos los días 🙂

EDIT: Vea la respuesta a continuación de un empleado de JetBrains … @JetBrains, sería genial tener algún tipo de AMDeviceService documentado para automatizar algunas cosas …;)

¿Qué es exactamente lo que quieres automatizar? ¿Instalar la aplicación y ejecutarla en un simulador o dispositivo?

Acerca de "3":

AMDeviceService es solo un daemon que es responsable de cualquier interacción con el dispositivo. Utiliza solo /System/Library/PrivateFrameworks/MobileDevice .framework library (es privado). No sabe nada de /Developer (por supuesto, si no vas a depurar el dispositivo).

Este service despliega la aplicación en el dispositivo, monta la image del desarrollador, navega por las aplicaciones en el dispositivo e inicia el server de eliminación de errores.

Utiliza el protocolo basado en buffers de protocolo de Google para comunicarse con AppCode. No cosas de Apple.

No estoy seguro al 100% de lo que se trata tu pregunta, pero puedo ejecutar una aplicación comstackda de simulador arbitraria cuya carpeta tengo en el escritorio (por ejemplo) en el Simulador con la siguiente línea en el terminal (una sola línea , sustituyendo los valores apropiados para su sistema):

  /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone \ Simulator.app/Contents/MacOS/iPhone \ Simulator -SimulateApplication 
 / Usuarios / myusername / Desktop / [el nombre del directory de la aplicación alfanumérica] /MyCompiledAppProject.app/MyCompiledAppProject 

Donde ese último file "MyCompiledAppProject" es el binary real que se encuentra dentro del package y que finaliza con .app (tendrás que hacer clic y presionar el button ".app" y seleccionar "Mostrar contenido del package" para verlo). Esto abrirá el simulador si aún no está abierto. Podría ser fácilmente empaquetado en un AppleScript que toma la location de la aplicación recién comstackda como un argumento de file y no requiere que Xcode sea abierto o que se use xcodebuild.

El proyecto iPhonesim le ofrece un iniciador de command-line para aplicaciones iOS. Creo que empaqueta lo que quiere.

Creo que leí en alguna parte que confían en Xcode para hacer este tipo de cosas por ellos. Pero no fue muy específico, y no sé dónde lo leí. ¿Tal vez están diseñando Xcode para iniciar y desplegar, en lugar del simulador directamente?

Un proyecto similar por brecha de teléfono se encuentra en https://github.com/phonegap/ios-sim .