sharp riders online jetbrain ios automation simulator appcode

ios - online - jetbrain riders



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

Acabo de ver el código de aplicación IDE de JetBrains y parece ser capaz de iniciar el simulador de iOS y ejecutar aplicaciones en él.

Cuando tuve que automatizar la implementación de mis proyectos, tuve que recurrir a la automatización de Apple y GUI.

Parece que están usando una herramienta cerrada llamada ''simlauncher''. Me pregunto qué podría ser la magia detrás de esto.

Actualizar:

  1. Al mirar el Monitor de actividad, veo que se lanza osascript desde el simlauncher antes de que se inicie el simulador. ¿Podría ser Applecript de nuevo? Pensé que iOS Simulator.app no ​​era programable.
  2. El simulador de iOS parece ser lanzado por launchd, por lo que simlauncher definitivamente no lo está lanzando por sí solo. Además, Simlauncher solo permanece hasta que la aplicación real se ejecuta en el simulador. ¿Están encuestando por ello quizás?
  3. Para las compilaciones de dispositivos, usan AMDeviceService, que probablemente sea una versión del servicio de dispositivos móviles de Apple. ¿Es esta una técnica desde la cárcel roto el SDK?

Un poco más de información en 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 solo es cuestión de ordenar los comandos de acuerdo con el pid y ejecutarlos. :-)

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

¿Hay una manera de establecer la ruta de acceso a dylibs antes de ejecutar un comando? Esto parece prometedor: http://sacredsoftware.net/svn/misc/StemLibProjects/eaglshell/tags/2.1.0/Makefile

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


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

Alrededor de 3":

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

Este servicio implementa la aplicación en el dispositivo, monta la imagen del desarrollador, examina las aplicaciones en el dispositivo e inicia el servidor Debugs.

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


AppCode usa un envoltorio especial para hacer esto, que notaste en su consola:

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

simlauncher es un binario de Mach-o no documentado / no amigable ... Pero aquí hay un análisis rápido de esto:

  • Para lanzar el simulador utiliza un marco de Apple privado ( 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 está incluido 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

Sobre el otro servicio binario AMDeviceService , puedo decir que usa ProtocolBuffers para poder comunicarme con el servicio MobileDevice ... Una vez más, cosas indocumentadas ...

Conclusión rápida, lo siento, no hay una manera fácil de iniciar iPhoneSimulator utilizando la forma de JetBrains, a menos que invierta las API privadas o no documentadas de Apple ... como lo hizo la gente de Jetbrains. Sé oro, ya estoy trabajando en ello todos los días :)

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


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í. ¿Es posible que estén ejecutando e implementando Xcode en lugar de usar el simulador directamente?


El proyecto iphonesim te ofrece un lanzador de línea de comandos para aplicaciones iOS. Creo que empaca lo que quieres.


No estoy 100% seguro de de qué trata tu pregunta, pero puedo ejecutar una aplicación compilada por Simulator arbitraria cuya carpeta tengo en el Escritorio (por ejemplo) en el Simulator con la siguiente línea en el terminal (toda una línea , sustituyendo valores apropiados para su sistema):

/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone/ Simulator.app/Contents/MacOS/iPhone/ Simulator -SimulateApplication /Users/myusername/Desktop/[the alphanumeric app directory name]/MyCompiledAppProject.app/MyCompiledAppProject

Donde ese último archivo "MyCompiledAppProject" es el binario real que se encuentra dentro del paquete que termina con .app (tendrá que hacer clic con el botón derecho sobre el archivo .app y seleccionar "Mostrar contenido del paquete" para verlo). Esto lanzará el simulador si aún no está abierto. Se podría empaquetar fácilmente en un AppleScript que toma la ubicación de la aplicación recién compilada como un argumento de archivo y no requiere que Xcode esté abierto o que se use xcodebuild.