Cordova: Starten Sie ein bestimmtes iOS-Emulator-Image

120

Ich entwickle eine plattformübergreifende mobile App mit Cordova, die sich in der Entwicklungsphase hauptsächlich auf iOS konzentriert.

Für meinen Entwicklungsprozess wäre es ideal, wenn ich meine Cordova-App direkt über die Befehlszeile starten und in einen bestimmten Emulator laden könnte. Ich kann dies tun, indem ich Folgendes aus dem Projektstammverzeichnis ausführe:

$cordova run --debug --emulator iOS

Dies funktioniert einwandfrei und führt dazu, dass ein iOS-Simulator meine App auf einem simulierten iPhone 4 Retina mit iOS 7.0.3 ausführt

Neben diesem simulierten Gerät möchte ich auch (zum Beispiel) auf einem iPad testen. Ich habe diese Emulationsimages installiert und kann meine App in Xcode manuell starten. Der Befehl list-emulator-images(befindet sich in project_dir/platforms/ios/cordova/lib) gibt außerdem die folgende Ausgabe aus:

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

Die Sache ist jedoch: Ich kann anscheinend nicht herausfinden, wie der Emulator in etwas anderem als der Standardeinstellung (die das iPhone Retina (4-inch)Emulationsbild zu sein scheint) gestartet wird . Die relevante Ausgabe von cordova helpgibt folgende Informationen:

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

Ich habe folgende Dinge ausprobiert:

cordova run --debug --emulator=iPad iOS

Und viele Variationen davon, aber kein Glück. Jedes Mal startet es im selben Emulator.

Die Dokumentation für das Befehlszeilentool enthält diesbezüglich keine Informationen, und eine umfangreiche Google-Suche hat auch nichts ergeben. Vermisse ich etwas Triviales? Oder versuche ich etwas Seltsames zu tun? Ich hoffe wirklich, dass jemand hier Erfahrung damit hat und einige Antworten geben kann.

Vielen Dank im Voraus!

bearbeiten: vergessen, explizit zu erwähnen; Ich mache das alles auf einem Mac. Wie bereits erwähnt, funktioniert das Ausführen der App in verschiedenen Emulatoren / Simulatoren in Xcode einwandfrei.

EggMeister
quelle

Antworten:

335

Um herauszufinden, welche Simulatorbilder verfügbar sind, können Sie sie auflisten

$ 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

Verwenden Sie dann einen der Simulatornamen im Parameter --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"

Wichtig Beenden Sie den Simulator, bevor Sie einen anderen Zielsimulator starten (Wählen Sie in der Menüleiste Simulator->Quit)

Beachten Sie, dass Sie den iOS-Simulator möglicherweise über das Menü beenden müssen, um vom 3,5- auf 4-Zoll-iPhone zu wechseln.

dynamische Liste ist verfügbar in platforms/ios/cordova/lib/list-emulator-images

csantanapr
quelle
3
Danke, das hat geholfen. Was war deine Quelle dafür? Ich frage mich nur, wie ich das selbst hätte herausfinden können ... Die Antwort auf diese Frage hat auch sehr geholfen: stackoverflow.com/questions/13877840/… Anscheinend ist 'cordova emulate' ein Wrapper für ios-sim, über den Sie auch sprechen können direkt. Dies ist, was ich letztendlich getan habe, damit ich meinen Code direkt von der IDE Ihrer Wahl erstellen und starten kann.
EggMeister
Ich habe gerade diesen Befehl ausgeführt und kann bestätigen, dass die 4,7- und 5,5-Zoll-Emulatoren nicht aufgelistet sind, auch wenn Xcode 6 installiert ist :-(
Ben Clayton
Hallo, ich habe diesen Befehl "./platforms/ios/cordova/lib/list-emulator-images" ausprobiert, aber ich habe nicht alle Optionen gesehen, KEIN iPhone 6, KEIN iPhone 6-Plus, KEIN iPad-Air, was wäre das Problem? Danke
user2120121
10
Ich weiß nicht genau warum, aber für mich würde Cordova CLI "Error: Cannot read property 'name' of undefined"bei der Angabe des Ziels mit Anführungszeichen werfen. Ich konnte es nur zum Laufen bringen, indem ich es so ausführte cordova run ios --target=iPhone-6. Hoffe, das erspart jemand anderem Ärger!
Gifford N.
1
Ich habe das gleiche problematische Ergebnis wie Gifford N. Ich benutze Cordova 7.0.0
Terry Wilkinson
18

Wie sagen Sie csantanapr können Sie verwenden:

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

In diesem Fall wird das Cordova-Projekt (oder PhoneGap oder ein anderes Projekt) auf dem iPhone 4s-Simulator mit iOS-Version 7.0.3 gestartet .

Wenn Sie das Projekt auf demselben Simulator starten möchten, jedoch mit einer anderen Version von iOS (7.1 oder 8.0, falls in Ihrem System Versionen vorhanden sind)?

Natürlich können Sie sagen, Cobberboy :

Starten Sie einen bestimmten Emulator und wählen Sie Ihre iOS-Version direkt mit ios-sim aus.

Sie können jedoch die --targetOption des Cordova- runBefehls verbessern .

Zunächst müssen Sie sicherstellen, welche Ziel-iOS-Version auf Ihrem System verfügbar ist.

Verwenden Sie dazu die Antwort von Cobberboy :

$ ios-sim showdevicetypes

Dann müssen Sie die Datei öffnen your_project_dir/platforms/ios/cordova/lib/run.jsund Codezeilen wie folgt finden:

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

Zur Verwendung iPhone-4s, 7.1(oder einer anderen) einfach zum Array hinzufügen 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'];

Und in

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

Ihr --target="iPhone-4s, 7.1"wird gültig sein.

Und Funktion deployToSimvon 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);
}

iPhone-4s, 7.1in gültiges Argument com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1für konvertieren ios-sim.

Ruslan Soldatenko
quelle
Dies funktioniert perfekt und ermöglichte mir die Verwendung ionic run ios --target='iPhone-6, 9.0'bei der Verwendung von Ionic Framework.
Jorisw
Guter Fund 👍. Ich habe einfach den Block auskommentiert, der validiert, validTargetsund konnte die vollständige Plattform angeben, z "--target="iPhone-6, 8.4"". Wäre sehr schön, wenn Cordova die Zielvalidierung an delegieren würde ios-sim.
Kyle Fox
Das funktioniert bei mir nicht. Ich habe Müll in run.js eingegeben und er wurde ignoriert. Zwischenspeichert npm dies oder etwas? Wie kann ich den Cache von npm aktualisieren?
Randgalt
Sie können auch "ionic platform update ios" ausführen und die kürzlich installierten Emulatoren
Benjamin Piette,
10

TL; DR

Sie können einen bestimmten Emulator starten und Ihre iOS-Version auswählen, indem Sie ios-sim direkt verwenden.

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

Einzelheiten

Als ich das lief:

cordova emulate ios --target="iPad"

und sah mir die laufenden Prozesse an, ich sah dies (in einer einzigen Zeile):

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

Bei näherer Betrachtung von ios-sim scheint es einige spezifischere Optionen zu geben, insbesondere:

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

Also habe ich getan, was vorgeschlagen wurde, und ios-sim mit dem Argument "showdevicetypes" ausgeführt und Folgendes erhalten:

$ 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
quelle
Wie funktioniert das zum Ändern des Standardsimulators? Sie umgehen hier das Cordova-Bit und starten direkt, oder?
mix3d
7

Geben Sie keine Versionsnummer an

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

Ab Xcode 8.3.2 ...

Alter Thread, ich weiß, aber es scheint, dass sich die Antwort leicht geändert hat. Die Hinweise aus früheren Beiträgen in diesem Thread haben geholfen, aber auch das Lesen der im Code enthaltenen Dokumentation.<cordova-project>/platforms/ios/cordova/lib/run.js

Ausführen, ./platforms/ios/cordova/lib/list-emulator-imagesum die verfügbaren Emulatorbilder aufzulisten. Geben Sie die Versionsnummer nicht am Ende an, wenn Sie den Cordova-Aufruf ausführen, um ihn im gewünschten Emulator auszuführen.

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

Mehr sehen

David Vezzani
quelle
Gott sei Dank für Ihren Kommentar! Es hat nach dem letzten Update nicht funktioniert und konnte keine Informationen finden. Ich habe gerade die Fehlermeldung erhalten: "Fehler: Eigenschaft 'Name' von undefined kann nicht gelesen werden", die behoben wurde, nachdem die ios-Version NICHT eingeschlossen wurde.
Marco Rinck
@ MarcoRinck überprüfen Sie den Kommentar zur Antwort, es gibt eine schnelle Lösung durch Eingabe von:cordova run ios --target=iPhone-6
Kira Hao
3

Ich kann die obige Antwort aufgrund meines schlechten Rufs nicht kommentieren, aber die Liste der Ziele ist verfügbar unter:

start-emulator 

unter

your platform/ios/cordova/lib/

Trotzdem kann ich den iPad Retina Emulator nicht zum Laufen bringen ...

Sergio
quelle
3

schnellste Ausgabe der Geräteliste: $ instruments -s devices

Verwenden Sie einfach den Gerätenamen ohne die Version.

Tino Rüb
quelle
0

Unterschiedlicher iPhone- und iPad-Simulator

  1. cordova run ios --list

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

BIRJA KUMAR
quelle
0

@ Birjas Antwort funktioniert gerade, aber der Befehl run, den er schließlich verwendet hat, ist immer noch falsch. Hier also die richtige Antwort:

Zum Auflisten aller im Simulator verfügbaren Geräte cordova run ios --list

Es wird so etwas ergeben:

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"Verwenden Sie ein beliebiges Ziel von oben. Im Simulator ausführen.

Schwarze Mamba
quelle