Cordova: démarrer une image d'émulateur iOS spécifique

120

Je développe une application mobile multiplateforme utilisant Cordova, en me concentrant principalement sur iOS en phase de développement.

Pour mon processus de développement, ce serait idéal si je pouvais démarrer mon application Cordova directement à partir de la ligne de commande et la charger dans un émulateur spécifié. Je peux le faire en exécutant ce qui suit à partir du répertoire racine du projet:

$cordova run --debug --emulator iOS

Cela fonctionne bien et se traduit par un simulateur iOS exécutant mon application dans un iPhone 4 Retina simulé avec iOS 7.0.3

Outre cet appareil simulé, j'aimerais également tester (par exemple) un iPad. J'ai installé ces images d'émulation et je peux y démarrer mon application manuellement dans Xcode. En outre, la commande list-emulator-images(située dans project_dir/platforms/ios/cordova/lib) donne la sortie suivante:

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

Cependant, le problème est que je n'arrive pas à comprendre comment démarrer l'émulateur dans autre chose que la valeur par défaut (qui semble être l' iPhone Retina (4-inch)image d'émulation). La sortie correspondante de cordova helpdonne les informations suivantes:

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

J'ai essayé des choses comme les suivantes:

cordova run --debug --emulator=iPad iOS

Et de nombreuses variantes, mais pas de chance. Chaque fois qu'il démarre dans le même émulateur.

La documentation de l'outil de ligne de commande n'offre aucune information à cet égard, et une recherche approfondie sur Google n'a pas réussi à trouver quoi que ce soit. Est-ce que je rate quelque chose de trivial? Ou est-ce que j'essaye de faire quelque chose de bizarre? J'espère vraiment que quelqu'un ici a une expérience dans ce domaine et pourra fournir des réponses.

Merci d'avance!

modifier: oublié de mentionner explicitement; Je fais tout cela sur un Mac. Comme mentionné précédemment, exécuter l'application dans différents émulateurs / simulateurs dans Xcode fonctionne correctement.

OeufMeister
la source

Réponses:

335

Pour savoir quelles sont les images de simulateur disponibles, vous pouvez les répertorier

$ 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

Ensuite, utilisez l'un des noms de simulateur dans le paramètre --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"

Important Quittez le simulateur avant de lancer un autre simulateur de cible (dans la barre de menu, sélectionnez Simulator->Quit)

Tenez compte du fait que vous devrez peut-être quitter le simulateur iOS via le menu pour passer d'un iPhone de 3,5 à 4 pouces.

la liste dynamique est disponible dans platforms/ios/cordova/lib/list-emulator-images

csantanapr
la source
3
Merci, cela a aidé. Quelle était votre source pour cela? Je me demandais simplement comment j'aurais pu comprendre cela moi-même ... La réponse à cette question a également beaucoup aidé: stackoverflow.com/questions/13877840/... Apparemment, 'cordova émuler' est un wrapper voor ios-sim, dont vous pouvez également parler directement. C'est ce que j'ai fini par faire, donc je peux créer et lancer mon code directement à partir de mon IDE de choix.
EggMeister
Je viens d'exécuter cette commande et je peux confirmer que les émulateurs 4,7 et 5,5 pouces ne sont pas répertoriés, même avec Xcode 6 installé :-(
Ben Clayton
Bonjour, j'ai essayé cette commande "./platforms/ios/cordova/lib/list-emulator-images" mais je n'ai pas vu toutes les options ,, PAS d'iPhone 6, PAS d'iPhone 6-Plus, PAS d'iPad-Air ce que serait le problème? Merci
user2120121
10
Je ne sais pas vraiment pourquoi, mais pour moi, Cordova CLI lancerait "Error: Cannot read property 'name' of undefined"lors de la spécification de la cible avec des guillemets, je ne pouvais le faire fonctionner qu'en l'exécutant comme ça cordova run ios --target=iPhone-6. J'espère que cela évitera des ennuis à quelqu'un d'autre!
Gifford N.
1
J'ai le même résultat problématique que Gifford N.J'utilise cordova 7.0.0
Terry Wilkinson
18

Comme disons csantanapr, vous pouvez utiliser:

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

mais, dans ce cas, le projet cordova (ou PhoneGap ou autre) sera lancé sur le simulateur iPhone 4s avec la version iOS 7.0.3 .

Si vous souhaitez lancer un projet sur le même simulateur, mais avec une autre version iOS (7.1 ou 8.0, si des versions existent dans votre système)?

De corse, vous pouvez faire comme dire cobberboy :

démarrez un émulateur spécifique et choisissez votre version ios en utilisant directement ios-sim.

Mais vous pouvez améliorer l' --targetoption de la runcommande cordova .

Dans un premier temps, vous devez vous assurer de la version iOS cible disponible sur votre système.

Pour cela, utilisez la réponse de cobberboy :

$ ios-sim showdevicetypes

Ensuite, vous devez ouvrir le fichier your_project_dir/platforms/ios/cordova/lib/run.jset trouver des lignes de code comme ci-dessous:

// 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'];

Pour une utilisation iPhone-4s, 7.1(ou autre), ajoutez-le simplement au tableau 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'];

Et en

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

votre --target="iPhone-4s, 7.1"sera valide.

Et fonction 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 argument valide com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1pour ios-sim.

Ruslan Soldatenko
la source
Cela fonctionne parfaitement et m'a permis de l'utiliser ionic run ios --target='iPhone-6, 9.0'lors de l'utilisation de Ionic Framework.
jorisw
Bonne trouvaille 👍. J'ai simplement commenté le bloc qui valident validTargetset j'ai été en mesure de préciser la plate - forme complète, ex: "--target="iPhone-6, 8.4"". Ce serait vraiment bien si Cordova déléguait la validation de la cible à ios-sim.
Kyle Fox
Cela ne fonctionne pas pour moi. J'ai tapé garbage dans run.js et il a été ignoré. Npm cache-t-il ceci ou quelque chose? Comment puis-je actualiser le cache de npm?
Randgalt
Vous pouvez également exécuter "ios de mise à jour de plate-forme ionique" et vous pourrez exécuter les émulateurs récemment installés
Benjamin Piette
10

TL; DR

Vous pouvez démarrer un émulateur spécifique et choisir votre version ios en utilisant directement 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

Détails

Quand j'ai couru ceci:

cordova emulate ios --target="iPad"

et j'ai regardé les processus en cours d'exécution, j'ai vu ceci (sur une seule ligne):

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

En étudiant plus en détail ios-sim , il semble qu'il existe des options plus spécifiques, en particulier:

--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"

J'ai donc fait ce qu'il a suggéré et j'ai exécuté ios-sim avec un argument "showdevicetypes" et j'ai obtenu ceci:

$ 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
la source
Comment cela fonctionne-t-il pour changer le simulateur par défaut? Vous contournez le bit cordova ici et vous lancez simplement directement, non?
mix3d
7

N'incluez pas le numéro de version

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

À partir de Xcode 8.3.2 ...

Vieux fil, je sais, mais il semble, peut-être, que la réponse a légèrement changé. Les astuces des articles précédents dans ce fil ont aidé, mais la lecture de la documentation incluse dans le code a également aidé,<cordova-project>/platforms/ios/cordova/lib/run.js

Exécutez ./platforms/ios/cordova/lib/list-emulator-imagespour répertorier les images d'émulateur disponibles. N'incluez pas le numéro de version à la fin lorsque vous effectuez l'appel cordova pour l'exécuter dans l'émulateur souhaité.

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

En savoir plus

David Vezzani
la source
merci mon dieu pour ton commentaire! Cela n'a pas fonctionné après la dernière mise à jour et n'a trouvé aucune information. Je viens de recevoir le message d'erreur: "Erreur: impossible de lire la propriété 'nom' de l'indéfini" qui a été corrigé après avoir NON inclus la version ios.
Marco Rinck
@MarcoRinck vérifiez le commentaire sur la réponse, il y a une solution rapide en tapant:cordova run ios --target=iPhone-6
Kira Hao
3

Je ne peux pas commenter la réponse ci-dessus en raison de ma faible réputation, mais la liste des cibles est disponible sur:

start-emulator 

sous

your platform/ios/cordova/lib/

Cela dit, je ne peux pas faire fonctionner l'émulateur iPad Retina ...

Sergio
la source
3

sortie la plus rapide de la liste des appareils: $ instruments -s devices

Utilisez simplement le nom de l'appareil sans la version.

Tino Rüb
la source
0

Différents simulateurs iphone et ipad

  1. cordova run ios - liste

  2. cordova émule ios - cible "iPhone-7"

BIRJA KUMAR
la source
0

La réponse de @ Birja fonctionne en ce moment, mais la commande d'exécution qu'il a finalement utilisée est toujours fausse, alors voici la bonne réponse:

Pour lister tous les appareils disponibles dans le simulateur cordova run ios --list

Il en résultera quelque chose comme ceci:

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"Utilisez n'importe quelle cible ci-dessus. Pour exécuter dans le simulateur.

Black Mamba
la source