Cordova: iniciar una imagen de emulador de iOS específica

120

Estoy desarrollando una aplicación móvil multiplataforma usando Cordova, centrándome principalmente en iOS en la etapa de desarrollo.

Para mi proceso de desarrollo, sería ideal si pudiera iniciar mi aplicación Cordova directamente desde la línea de comandos y cargarla en un emulador específico. Puedo hacer esto ejecutando lo siguiente desde el directorio raíz del proyecto:

$cordova run --debug --emulator iOS

Esto funciona bien y da como resultado un simulador de iOS que ejecuta mi aplicación en un iPhone 4 Retina simulado con iOS 7.0.3

Además de este dispositivo simulado, también me gustaría probar (por ejemplo) en un iPad. Tengo estas imágenes de emulación instaladas y puedo iniciar mi aplicación en ellas manualmente en Xcode. Además, el comando list-emulator-images(ubicado en project_dir/platforms/ios/cordova/lib) da el siguiente resultado:

"iPhone Retina (3.5-inch)"
"iPhone Retina (4-inch)"
"iPhone Retina (4-inch 64-bit)"
"iPhone"
"iPad"
"iPad Retina"

Sin embargo, la cosa es: parece que no puedo entender cómo iniciar el emulador en otra cosa que no sea la predeterminada (que parece ser la iPhone Retina (4-inch)imagen de emulación). El resultado relevante de cordova helpproporciona la siguiente información:

run [--debug|--release]
    [--device|--emulator|--target=FOO]
    [PLATFORM] ............................ deploys app on specified platform devices / emulators

He probado cosas como las siguientes:

cordova run --debug --emulator=iPad iOS

Y muchas variaciones del mismo, pero sin suerte. Cada vez que se inicia en el mismo emulador.

La documentación de la herramienta de línea de comandos no ofrece ninguna información al respecto, y una búsqueda exhaustiva en Google tampoco encontró nada. ¿Me estoy perdiendo algo trivial? ¿O estoy intentando hacer algo raro? Realmente espero que alguien aquí tenga experiencia con esto y pueda proporcionar algunas respuestas.

¡Muchas gracias de antemano!

editar: olvidé mencionar explícitamente; Estoy haciendo todo esto en una Mac. Como se mencionó anteriormente, ejecutar la aplicación en diferentes emuladores / simuladores en Xcode funciona bien.

EggMeister
fuente

Respuestas:

335

Para averiguar cuáles son las imágenes del simulador disponibles, puede usar para enumerarlas

$ cordova emulate ios --list
Available iOS Virtual Devices:
    iPhone-4s, 9.3
    iPhone-5, 9.3
    iPhone-5s, 9.3
    iPhone-6, 9.3
    iPhone-6-Plus, 9.3
    iPhone-6s, 9.3
    iPhone-6s-Plus, 9.3
    iPad-2, 9.3
    iPad-Retina, 9.3
    iPad-Air, 9.3
    iPad-Air-2, 9.3
    iPad-Pro, 9.3

Luego use uno de los nombres del simulador en el parámetro --target:

cordova emulate ios --target="iPhone-4s, 9.3"
cordova emulate ios --target="iPad-Air-2, 9.3"
cordova emulate ios --target="iPhone-6s, 9.3"
cordova emulate ios --target="iPhone-6-Plus, 9.3"

Importante Salga del simulador antes de iniciar un simulador de destino diferente (en la barra de menú, seleccioneSimulator->Quit )

Tenga en cuenta que es posible que deba salir del simulador de iOS a través del menú para cambiar de iPhone de 3,5 a 4 pulgadas.

la lista dinámica está disponible en platforms/ios/cordova/lib/list-emulator-images

csantanapr
fuente
3
Gracias, esto ayudó. ¿Cuál fue tu fuente para esto? Me pregunto cómo pude haber descubierto esto yo mismo ... La respuesta a esta pregunta también ayudó mucho: stackoverflow.com/questions/13877840/… Aparentemente, 'cordova emulate' es un contenedor voor ios-sim, del que también puedes hablar a directamente. Esto es lo que terminé haciendo, por lo que puedo crear y lanzar mi código directamente desde mi IDE de elección.
EggMeister
Acabo de ejecutar este comando y puedo confirmar que los emuladores de 4.7 y 5.5 pulgadas no están en la lista, incluso con Xcode 6 instalado :-(
Ben Clayton
Hola, probé este comando "./platforms/ios/cordova/lib/list-emulator-images" pero no vi todas las opciones, NO iPhone 6, NO iPhone 6-Plus, NO iPad-Air que sería ¿el problema? Gracias
user2120121
10
Realmente no sé por qué, pero para mí, Cordova CLI arrojaría "Error: Cannot read property 'name' of undefined"al especificar el objetivo con comillas, solo podría hacer que funcione ejecutándolo de esta manera cordova run ios --target=iPhone-6. ¡Espero que esto le ahorre problemas a alguien más!
Gifford N.
1
Tengo el mismo resultado problemático que Gifford N.Estoy usando cordova 7.0.0
Terry Wilkinson
18

Como dice csantanapr , puede usar:

cordova emulate ios --target="iPhone-4s"

pero, en este caso, el proyecto cordova (o PhoneGap u otro) se lanzará en el simulador de iPhone 4s con iOS versión 7.0.3 .

¿Si desea lanzar el proyecto en el mismo simulador, pero con otra versión de iOS (7.1 u 8.0, si existen versiones en su sistema)?

Por supuesto, puedes hacer como decir cobberboy :

inicie un emulador específico y elija su versión de ios directamente usando ios-sim.

Pero puedes mejorar la --targetopción del runcomando cordova .

Al principio, debe asegurarse de qué versión de iOS de destino está disponible en su sistema.

Para ello use la respuesta de cobberboy :

$ ios-sim showdevicetypes

Luego, debe abrir el archivo your_project_dir/platforms/ios/cordova/lib/run.jsy encontrar líneas de código como a continuación:

// validate target device for ios-sim
// Valid values for "--target" (case sensitive):
var validTargets = ['iPhone-4s', 'iPhone-5', 'iPhone-5s', 'iPhone-6-Plus', 'iPhone-6',
    'iPad-2', 'iPad-Retina', 'iPad-Air', 'Resizable-iPhone', 'Resizable-iPad'];

Para usar iPhone-4s, 7.1(o algún otro), simplemente agréguelo a la matriz validTargets.

var validTargets = ['iPhone-4s', 'iPhone-4s, 7.1', 'iPhone-5', 'iPhone-5s', 'iPhone-6-Plus', 'iPhone-6',
    'iPad-2', 'iPad-Retina', 'iPad-Air', 'Resizable-iPhone', 'Resizable-iPad'];

Y en

cordova emulate ios --target="iPhone-4s, 7.1"

tu --target="iPhone-4s, 7.1"será válido.

Y función deployToSimde run.js:

function deployToSim(appPath, target) {
// Select target device for emulator. Default is 'iPhone-6'
if (!target) {
    target = 'iPhone-6';
    console.log('No target specified for emulator. Deploying to ' + target + ' simulator');
}
var logPath = path.join(cordovaPath, 'console.log');
var simArgs = ['launch', appPath,
    '--devicetypeid', 'com.apple.CoreSimulator.SimDeviceType.' + target,
    // We need to redirect simulator output here to use cordova/log command
    // TODO: Is there any other way to get emulator's output to use in log command?
    '--stderr', logPath, '--stdout', logPath,
    '--exit'];
return spawn('ios-sim', simArgs);
}

convertir iPhone-4s, 7.1en argumento válido com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1para ios-sim.

Ruslan Soldatenko
fuente
Esto funciona perfectamente y me permitió usarlo ionic run ios --target='iPhone-6, 9.0'cuando uso Ionic Framework.
jorisw
Buen hallazgo 👍. Simplemente comento a cabo el bloque que valida validTargetsy yo era capaz de especificar la plataforma completa, por ejemplo: "--target="iPhone-6, 8.4"". Sería realmente bueno si Cordova delegara la validación de destino a ios-sim.
Kyle Fox
Esto no me funciona. Escribí basura en run.js y fue ignorado. ¿Npm almacena en caché esto o algo? ¿Cómo puedo actualizar la caché de npm?
Randgalt
También puede ejecutar "ios de actualización de plataforma iónica" y podrá ejecutar los emuladores instalados recientemente
Benjamin Piette
10

TL; DR

Puede iniciar un emulador específico y elegir su versión de ios directamente usando ios-sim.

export appname="./platforms/ios/build/emulator/Hello World.app"
ios-sim launch "$appname" --devicetypeid "com.apple.CoreSimulator.SimDeviceType.iPad-2, 8.0" --stderr ./platforms/ios/cordova/console.log --stdout ./platforms/ios/cordova/console.log

Detalles

Cuando ejecuté esto:

cordova emulate ios --target="iPad"

y miré los procesos en ejecución, vi esto (en una sola línea):

ios-sim launch ./platforms/ios/build/emulator/HelloWorld.app 
        --stderr ./platforms/ios/cordova/console.log 
        --stdout ./platforms/ios/cordova/console.log 
        --family ipad 
        --exit

Investigando más en ios-sim , parece que hay algunas opciones más específicas, en particular:

--devicetypeid <device type>    The id of the device type that should be simulated (Xcode6+). Use 'showdevicetypes' to list devices.
  e.g "com.apple.CoreSimulator.SimDeviceType.Resizable-iPhone6, 8.0"

Así que hice lo que sugirió y ejecuté ios-sim con un argumento "showdevicetypes" y obtuve esto:

$ ios-sim showdevicetypes
com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1
com.apple.CoreSimulator.SimDeviceType.iPhone-5, 7.1
com.apple.CoreSimulator.SimDeviceType.iPhone-5s, 7.1
com.apple.CoreSimulator.SimDeviceType.iPad-2, 7.1
com.apple.CoreSimulator.SimDeviceType.iPad-Retina, 7.1
com.apple.CoreSimulator.SimDeviceType.iPad-Air, 7.1
com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 8.0
com.apple.CoreSimulator.SimDeviceType.iPhone-5, 8.0
com.apple.CoreSimulator.SimDeviceType.iPhone-5s, 8.0
com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus, 8.0
com.apple.CoreSimulator.SimDeviceType.iPhone-6, 8.0
com.apple.CoreSimulator.SimDeviceType.iPad-2, 8.0
com.apple.CoreSimulator.SimDeviceType.iPad-Retina, 8.0
com.apple.CoreSimulator.SimDeviceType.iPad-Air, 8.0
com.apple.CoreSimulator.SimDeviceType.Resizable-iPhone, 8.0
com.apple.CoreSimulator.SimDeviceType.Resizable-iPad, 8.0
cobberboy
fuente
¿Cómo funciona esto para cambiar el simulador predeterminado? Estás pasando por alto el bit cordova aquí y simplemente lanzando directamente, ¿verdad?
mix3d
7

No incluya el número de versión

cordova run ios --target="iPhone-6s"
Ariel Ibarra
fuente
4

A partir de Xcode 8.3.2 ...

Viejo hilo, lo sé, pero parece, quizás, que la respuesta ha cambiado ligeramente. Las sugerencias de publicaciones anteriores en este hilo ayudaron, pero también lo hizo leer la documentación incluida en el código,<cordova-project>/platforms/ios/cordova/lib/run.js

Ejecutar ./platforms/ios/cordova/lib/list-emulator-imagespara enumerar las imágenes de emulador disponibles. No incluya el número de versión al final cuando realice la llamada a cordova para que se ejecute en el emulador deseado.

cordova run ios --emulator --target="iPad-Air"

Ver más

David Vezzani
fuente
gracias a dios por tu comentario! No funcionó después de la última actualización y no pudo encontrar ninguna información. Acabo de recibir el mensaje de error: "Error: No se puede leer la propiedad 'nombre' de indefinido" que se corrigió después de NO incluir la versión ios.
Marco Rinck
@MarcoRinck verifique el comentario en la respuesta, hay una solución rápida escribiendo:cordova run ios --target=iPhone-6
Kira Hao
3

No puedo comentar sobre la respuesta anterior debido a mi baja reputación, pero la lista de objetivos está disponible en:

start-emulator 

debajo

your platform/ios/cordova/lib/

Habiendo dicho eso, no puedo hacer que el emulador de retina de ipad funcione ...

Sergio
fuente
3

salida más rápida de la lista de dispositivos: $ instruments -s devices

Simplemente use el nombre del dispositivo sin la versión.

Tino Rüb
fuente
0

Diferentes simuladores de iphone y ipad

  1. cordova ejecutar ios --list

  2. cordova emular ios --target "iPhone-7"

BIRJA KUMAR
fuente
0

La respuesta de @ Birja está funcionando en este momento, pero el comando de ejecución que usó finalmente sigue siendo incorrecto, así que aquí la respuesta correcta:

Para enumerar todos los dispositivos disponibles en el simulador cordova run ios --list

Dará como resultado algo como esto:

Available ios devices:
Available ios virtual devices:
Apple-TV-1080p, tvOS 12.2
Apple-Watch-Series-2-38mm, watchOS 5.2
iPhone-5s, 12.2
iPhone-6, 12.2
iPad-Air-2, 12.2
iPad--5th-generation-, 12.2
iPad-Pro--9-7-inch-, 12.2
iPad-Pro, 12.2
iPad-Pro--12-9-inch---2nd-generation-, 12.2
iPad-Pro--10-5-inch-, 12.2
iPad--6th-generation-, 12.2
iPad-Pro--11-inch-, 12.2
iPad-Pro--12-9-inch---3rd-generation-, 12.2

cordova run ios --target "iPad-Pro, 12.2"Utilice cualquier objetivo de los anteriores. Para ejecutar en simulador.

Mamba negro
fuente