Cordova: avvia un'immagine specifica dell'emulatore iOS


120

Sto sviluppando un'app mobile multipiattaforma utilizzando Cordova, concentrandomi principalmente su iOS in fase di sviluppo.

Per il mio processo di sviluppo sarebbe l'ideale se potessi avviare la mia app Cordova direttamente dalla riga di comando e caricarla in un emulatore specificato. Posso farlo eseguendo quanto segue dalla directory principale del progetto:

$cordova run --debug --emulator iOS

Funziona bene e si traduce in un simulatore iOS che esegue la mia app su un iPhone 4 Retina simulato con iOS 7.0.3

Oltre a questo dispositivo simulato, vorrei anche provare (ad esempio) un iPad. Ho queste immagini di emulazione installate e posso avviare la mia app manualmente in Xcode. Inoltre, il comando list-emulator-images(situato in project_dir/platforms/ios/cordova/lib) fornisce il seguente output:

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

Tuttavia, il fatto è: non riesco a capire come avviare l'emulatore in qualcosa di diverso da quello predefinito (che sembra essere l' iPhone Retina (4-inch)immagine di emulazione). Il relativo output di cordova helpfornisce le seguenti informazioni:

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

Ho provato cose come le seguenti:

cordova run --debug --emulator=iPad iOS

E molte varianti, ma senza fortuna. Ogni volta che si avvia nello stesso emulatore.

La documentazione per lo strumento da riga di comando non offre alcuna informazione al riguardo e anche un'estesa ricerca su Google non è riuscita a trovare nulla. Mi manca qualcosa di banale? O sto cercando di fare qualcosa di strano? Spero davvero che qualcuno qui abbia esperienza con questo e possa fornire alcune risposte.

Grazie mille in anticipo!

modifica: dimenticato di menzionare esplicitamente; Sto facendo tutto questo su un Mac. Come accennato in precedenza, l'esecuzione dell'app in diversi emulatori / simulatori in Xcode funziona correttamente.

Risposte:


335

Per scoprire quali sono le immagini del simulatore disponibili puoi utilizzare per elencarle

$ 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

Quindi utilizza uno dei nomi del simulatore nel parametro --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 Esci dal simulatore prima di avviare un simulatore di destinazione diverso (nella barra dei menu seleziona Simulator->Quit)

Tieni presente che potresti dover chiudere il simulatore iOS tramite il menu per passare da un iPhone da 3,5 a 4 pollici.

l'elenco dinamico è disponibile in platforms/ios/cordova/lib/list-emulator-images


3
Grazie, questo ha aiutato. Qual è stata la tua fonte per questo? Mi chiedevo solo come avrei potuto capirlo da solo ... Anche la risposta a questa domanda ha aiutato molto: stackoverflow.com/questions/13877840/… Apparentemente 'cordova emulate' è un wrapper voor ios-sim, di cui puoi anche parlare direttamente. Questo è quello che ho finito per fare, quindi posso creare e lanciare il mio codice direttamente dal mio IDE preferito.
EggMeister

Ho appena eseguito questo comando e posso confermare che gli emulatori da 4,7 e 5,5 pollici non sono elencati, anche con Xcode 6 installato :-(
Ben Clayton

Ciao, ho provato questo comando "./platforms/ios/cordova/lib/list-emulator-images" ma non ho visto tutte le opzioni, NO iPhone 6, NO iPhone 6-Plus, NO iPad-Air cosa sarebbe il problema? Grazie
user2120121

10
Non so davvero perché, ma per me Cordova CLI avrebbe lanciato "Error: Cannot read property 'name' of undefined"quando si specificava l'obiettivo tra virgolette, potevo farlo funzionare solo eseguendolo in questo modo cordova run ios --target=iPhone-6. Spero che questo faccia risparmiare a qualcun altro qualche problema!
Gifford N.

1
Sto avendo lo stesso risultato problematico di Gifford N. Sto usando cordova 7.0.0
Terry Wilkinson

18

Come dire csantanapr puoi usare:

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

ma, in questo caso, il progetto cordova (o PhoneGap o altro) verrà lanciato sul simulatore di iPhone 4s con iOS versione 7.0.3 .

Se vuoi avviare il progetto sullo stesso simulatore, ma con un'altra versione iOS (7.1 o 8.0, se esistono versioni nel tuo sistema)?

Certo, puoi fare come dire Cobberboy :

avvia un emulatore specifico e scegli la tua versione ios utilizzando direttamente ios-sim.

Ma puoi migliorare l' --targetopzione del runcomando cordova .

All'inizio devi assicurarti quale versione iOS di destinazione disponibile sul tuo sistema.

Per usare la risposta di Cobberboy :

$ ios-sim showdevicetypes

Quindi è necessario aprire il file your_project_dir/platforms/ios/cordova/lib/run.jse trovare righe di codice come di seguito:

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

Per l'uso iPhone-4s, 7.1(o qualche altro) aggiungilo semplicemente all'array 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'];

E in

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

la tua --target="iPhone-4s, 7.1"sarà valida.

E funzione deployToSimdi 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);
}

converti iPhone-4s, 7.1in un argomento valido com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1per ios-sim.


Questo funziona perfettamente e mi ha permesso di utilizzare ionic run ios --target='iPhone-6, 9.0'quando si utilizza Ionic Framework.
jorisw

Buona scoperta 👍. Ho semplicemente commentato il blocco che convalida validTargetse sono stato in grado di specificare la piattaforma completa, es: "--target="iPhone-6, 8.4"". Sarebbe davvero bello se Cordova delegasse la convalida del target a ios-sim.
Kyle Fox

Questo non funziona per me. Ho digitato spazzatura in run.js ed è stato ignorato. Npm memorizza questo o qualcosa del genere? Come posso aggiornare la cache di npm?
Randgalt

Puoi anche eseguire "ionic platform update ios" e sarai in grado di eseguire gli emulatori installati di recente
Benjamin Piette

10

TL; DR

Puoi avviare un emulatore specifico e scegliere la tua versione ios utilizzando direttamente 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

Dettagli

Quando ho eseguito questo:

cordova emulate ios --target="iPad"

e ho guardato i processi in esecuzione, ho visto questo (su una sola riga):

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

Indagando ulteriormente su ios-sim , sembra che ci siano alcune opzioni più specifiche, in particolare:

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

Quindi ho fatto come suggerito e ho eseguito ios-sim con un argomento "showdevicetypes" e ho ottenuto questo:

$ 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

Come funziona per modificare il simulatore predefinito? Stai aggirando il bit di cordova qui e lo stai avviando direttamente, giusto?
mix3d

7

Non includere il numero di versione

cordova run ios --target="iPhone-6s"

4

A partire da Xcode 8.3.2 ...

Vecchio filo, lo so, ma sembra, forse, che la risposta sia leggermente cambiata. I suggerimenti dei post precedenti in questo thread hanno aiutato, ma anche la lettura della documentazione inclusa nel codice,<cordova-project>/platforms/ios/cordova/lib/run.js

Esegui ./platforms/ios/cordova/lib/list-emulator-imagesper elencare le immagini dell'emulatore disponibili. Non includere il numero di versione alla fine quando si effettua la chiamata a cordova da eseguire nell'emulatore desiderato.

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

Vedi altro


grazie a dio per il tuo commento! Non ha funzionato dopo l'ultimo aggiornamento e non è stato possibile trovare alcuna informazione. Ho appena ricevuto il messaggio di errore: "Errore: impossibile leggere la proprietà 'nome' di undefined" che è stato corretto dopo NON aver incluso la versione ios.
Marco Rinck

@MarcoRinck controlla il commento sulla risposta, c'è una soluzione rapida digitando:cordova run ios --target=iPhone-6
Kira Hao

3

Non posso commentare la risposta sopra a causa della mia scarsa reputazione, ma l'elenco degli obiettivi è disponibile da:

start-emulator 

sotto

your platform/ios/cordova/lib/

Detto questo, non riesco a far funzionare l'emulatore retina dell'ipad ...


3

output più veloce dell'elenco dei dispositivi: $ instruments -s devices

Usa semplicemente il nome del dispositivo senza la versione.



0

Diverso simulatore di iphone e ipad

  1. cordova eseguire ios --list

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


0

La risposta di @ Birja sta funzionando in questo momento ma il comando di esecuzione che ha usato alla fine è ancora sbagliato, quindi ecco la risposta giusta:

Per elencare tutti i dispositivi disponibili nel simulatore cordova run ios --list

Risulterà in qualcosa del genere:

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"Usa qualsiasi bersaglio da quanto sopra. Da eseguire nel simulatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.