Xcode6: Führen Sie zwei Instanzen des Simulators aus

122

Ich habe zwei verschiedene Ziele für meine iOS-App. Ist es möglich, die beiden Apps gleichzeitig auf zwei verschiedenen Instanzen des Simulators auszuführen? Es ist in Ordnung, wenn der Debugger des Xcodes nicht genutzt werden muss. Bisher habe ich nur zwei Versionen von XCode installiert, aber das ist eine sehr schwere / platzraubende Lösung.

vintagexav
quelle
3
Es ist eine doppelte Frage, aber die Antwort von @ i40west ist tatsächlich besser.
Vintagexav
Tatsächlich ist die Antwort hier sogar noch besser stackoverflow.com/questions/896487/…
FlowUI. SimpleUITesting.com

Antworten:

224

Sie können zwei Instanzen des iOS-Simulators über die Befehlszeile ausführen. Sie werden nicht an das Xcode-Debugging angehängt - tatsächlich scheint es nur zu funktionieren, wenn Sie dies tun, ohne dass Xcode überhaupt ausgeführt wird.

Zuerst müssen Sie die App im Simulator von Xcode aus ausführen, um sie im Simulator zu installieren. Stellen Sie sicher, dass Sie dieselben Simulatoren verwenden, die Sie letztendlich verwenden werden

Öffnen Sie nun ein Terminalfenster und führen Sie dies aus.

cd /Applications/Xcode.app/Contents/Developer/Applications
open -n iOS\ Simulator.app
open -n iOS\ Simulator.app

Update für Xcode 7: Mit Xcode 7 hat sich der Anwendungsname des Simulators geändert.

cd /Applications/Xcode.app/Contents/Developer/Applications
open -n Simulator.app
open -n Simulator.app

Beim Start des zweiten wird eine Fehlermeldung angezeigt. Schließen Sie es einfach und wählen Sie ein anderes Gerät unter "Hardware" »" Gerät ". Jetzt laufen zwei Simulatoren, und alle Apps, die Sie bereits von Xcode in ihnen installiert haben, sind dort.

i40west
quelle
7
Hey, danke, das ist eine gute Idee, aber leider heißt es für den zweiten Simulator "Gerät kann im aktuellen Zustand nicht gestartet werden: Booted". Ich sehe zwei Simulatoren, aber der Bildschirm des zweiten bleibt schwarz, auch nachdem der Alarm verringert wurde.
Vintagexav
6
Vielleicht liegt das daran, dass mein XCode gerade läuft. Vielleicht sollten Sie diese Anweisung zu Ihrer Antwort hinzufügen :) Auch funktioniert es nur, wenn Sie zwei verschiedene simulierte Hardware verwenden (z. B. iPhone 5 und iPhone 5s)
vintagexav
13
Übrigens müssen Sie die Version des ersten Simulators nach dem Start ändern, indem Sie auf Simulator> Hardware klicken, um zwei verschiedene Simulatoren ordnungsgemäß mit zwei verschiedenen simulierten Hardwares auszuführen und zu vermeiden, dass das Gerät im aktuellen Status nicht gestartet werden kann: Booten. Weitere Informationen: stackoverflow.com/questions/24023029/…
vintagexav
1
Vielen Dank! Ich verwende 2 Simulatoren (einer mit iPhone5, der andere mit iPhone6), um die iCloud-Synchronisierung zu testen. Zu beachten ist, dass die Synchronisierung des Simulators schwierig ist. Aus praktischen Gründen müssen Sie die iCloud-Synchronisierung mit Debug-> Trigger iCloud Sync erzwingen. Wenn diese beiden Geräte meine Anwendung in ihren separaten Simulatorfenstern ausführen, ändere ich Gerät1 (iPhone5), erzwinge die Synchronisierung für Gerät1, klicke auf Gerät2 (iPhone6) und erzwinge die Synchronisierung. Und Viola, Sie können jetzt die iCloud-Synchronisierung im Simulator testen. Das Öffnen der Konsole des Simulators ist hilfreich, da Sie die Hintergrundsynchronisierungsaktivitäten anzeigen können, wenn dies geschieht.
ObjectiveTC
3
Ich bin froh, dass ich deine Antwort gefunden habe, danke! Ich wollte nur erwähnen, dass XCode anscheinend gleichzeitig ausgeführt werden kann, mit den folgenden Einschränkungen: 1. Der zweite Simulator muss eine andere Konfiguration haben als der erste (nachdem sich das Popup beschwert hat, müssen Sie die Geräteversion des Simulators ändern aus dem Hardware-Menü). 2. Wenn Sie den ersten Simulator von XCode aus stoppen und neu starten, wird auch der zweite Simulator gestoppt und neu gestartet (und Sie müssen die Geräteversion erneut ändern)
Alex
26

Xcode 9+

Xcode 9 unterstützt jetzt das Starten mehrerer Simulatoren. Dies wurde in der WWDC 2017 angekündigt.

Gehen Sie einfach und ändern Sie den Simulator in Xcode, Cmd + R und Sie werden sehen, dass ein neuer Simulator auftaucht.

Geben Sie hier die Bildbeschreibung ein

Guy Daher
quelle
9

Erfolgreich getestet, dass die Lösung von i40west zum manuellen Starten des Simulators funktioniert, aber es scheint albern, dass ein iOS-Simulator heutzutage unterschiedliche Xcode-Versionen UND unterschiedliche Gerätetypen benötigt, wenn gleichzeitige Tests über die Befehlszeile ausgeführt werden (etwas anderer Anwendungsfall, aber im Zusammenhang mit der ursprünglichen Frage oben) ).

Lesen Sie hier den Apple-Artikel, der für Befehlszeilenerstellungen und -tests am relevantesten ist: https://developer.apple.com/library/ios/technotes/tn2339/_index.html

Mehrere gleichzeitige Tests haben für uns gut funktioniert, wenn korrekte --args - an 'iOS simulator.app' übergeben wurden, bevor der Befehl 'xcodebuild test' mit korrektem '-destination'-Wert ausgeführt wurde, der dem Simultator-Start mit dem Wert von UUID aus der Ausgabe von' xcrun entspricht simctl list 'und Festlegen der Umgebungsvariablen DEVELOPER_DIR zur Auswahl verschiedener Binärdateien der XCode-Version (dh Basispfad zu Xcode 6.1 und 6.4)

Der Grund für die Notwendigkeit gleichzeitiger Komponententests auf demselben physischen Computer und demselben iOS-Simulatorgerät wie iPad oder iPhone und derselben Xcode-Version ist in erster Linie die Unterstützung der CI (kontinuierliche Integration) eines iOS-Projekts, bei der dasselbe Build-System mehr als einen Build von mehreren ausführen kann Apps (unser Unternehmen verfügt über ca. 30 Apps) werden beim Einchecken in Feature-Zweige automatisch vom Bamboo-Agenten gescannt und erstellt, ohne auf den Abschluss anderer laufender Builds warten zu müssen. Bamboo unterstützt diese Art des automatischen Build-on-Auto-Builds. erkannte Feature-Zweige, falls aktiviert.

Was passiert, wenn mehrere Tests gleichzeitig ausgeführt werden? Wir führen mehrere "xcodebuild test" -Befehle zweimal hintereinander in verschiedenen Terminal.app-Fenstern aus. Das Ergebnis ist, dass nur ein Simulatorfenster angezeigt wird und die Tests im einfachsten Test fehlschlagen.

Wenn wir die Eingabekriterien für unseren Teststart, unterschiedliche Xcode-Versionen für jede Sim und jeden Teststart, komplizieren, geben wir bei Verwendung von DEVELOPER_DIR gemäß Manpages (xcodebuild-Test) ein anderes Gerät an, das in zwei separaten Fenstern geöffnet wird. Das Ergebnis ist jedoch das folgende Alle laufenden Tests im ersten Fenster werden durch das zweite iOS-Simulatorfenster unterbrochen.

Unter der Haube scheint sich eine gemeinsame Ressource zu befinden, die im Weg steht, nicht sicher ist, ob sie beabsichtigt ist, oder nur eine neue Funktion, die mehr als ein paar Tage lang ernsthafte Überlegungen erfordert, wie gleichzeitige Testläufe ohne nachteilige Auswirkungen besser implementiert werden können.

Wir möchten keine VMs verwenden, um die Simulationsbeschränkungen zu umgehen, da unsere Erfahrung und die anderer im Allgemeinen darin besteht, dass die Leistung beim Erstellen von iOS auf VMs mit einer großen Anzahl kleiner Dateien langsamer ist als bei physischer Hardware. VMs verlangsamen den Aufbau im Allgemeinen aufgrund von E / A-Problemen in der Kombination von VMware-Software und Apple-Hardware und / oder -Firmware erheblich. Es tut uns leid, virtuelles Ghetto, aber für uns funktionieren VMs nicht gut. Auf der virtuellen Ghetto-Website finden Sie Anweisungen zur Installation von ESXi 5.5 auf Mac Mini für unsere Buildfarm.

Wir haben festgestellt, dass das Problem mit der Build-Leistung mit ESXi 5.5 auf Mac Mini selbst mit SSD um den Faktor 2 oder mehr langsamer als Bare Metal ist (dh ein 10-minütiger Baremetal-Build dauert 20 auf VM). Lesen Sie den folgenden Squareup-Artikel, warum.

https://corner.squareup.com/2015/07/ios-build-infrastructure.html

Die Beschränkung von jeweils einem Sim-Gerät für xcodebuild-Komponententests verringert die Produktivität erheblich und führt zu erheblichen Kosten für Apple und das Ökosystem.

Die Kosten für Apple, keine Parallelität zu unterstützen, um mehr Hardwarekäufe zu rechtfertigen, sollten sorgfältig abgewogen werden, um das Risiko eines Verlusts der Entwicklergeschwindigkeit gegenüber anderen Wettbewerbern abzuwägen, die weniger Einschränkungen in Bezug auf Sims und EULA haben.

Der Vorteil gleichzeitiger Tests bei derselben Benutzeranmeldung (wie die meisten ci-Systeme funktionieren) besteht in der Qualität der App Store-Apps der Marke Apple, die zum Teil dazu führt, dass Benutzer die iOS-Geräte überhaupt erst kaufen. Eine schlechte Softwarequalität macht die gesamte Marke etwas träger und die Unterstützung von Parallelität in iOS-Simulatoren scheint definitiv der kluge Weg zu sein, um das Ökosystem zu unterstützen. Eine kleine Folge des vorliegenden Problems sind die jüngsten Verbesserungen wie der Xcode-Server für CI von Apple, die automatisierten UI-Testfunktionen von Xcode in Xcode 7.

Die Ermutigung zu unnötigen Gemeinkosten, um Menschen dazu zu bringen, massenhaft Hardware, Setup, Konfiguration und zahlreiche Personen zu kaufen, die für die Unterstützung aller Maschinen, Netzwerke und Steckdosen usw. erforderlich sind, kann letztendlich die Gewinne von Apple beeinträchtigen, da nicht jeder wie Apple und Apple ist Sie können sich Racks mit MacPro oder Mac Mini leisten, um gleichzeitige Tests auf Simulatoren zu unterstützen. Der Sinn eines Simulators besteht darin, die Verwendung der Hardware zu vermeiden und die Tests zu beschleunigen.

Außerdem machen die EULA-Beschränkungen für VMs die Argumente für VMs auf Mac Pro recht schwach. Dieser Hardwaretyp wäre attraktiv, wenn mehrere Sims ausgeführt werden könnten. Da jedoch gleichzeitige Komponententests nicht unterstützt werden (außer unter den beiden oben genannten Bedingungen - unterschiedliche XCode-Version und unterschiedliches Simulatorgerät), werden wir uns wahrscheinlich an Mac Minis für die Build-Infrastruktur halten.

Diese Sim- und EULA-Einschränkungen von Apple verlangsamen nicht nur die Build-Pipeline, sondern erhöhen auch die Komplexität und die Kosten. Für kleine Apps mag dies nicht so wichtig sein, aber wenn die Apps an Größe und Komplexität zunehmen, kann der Build bis zu einer Stunde dauern (ich habe gehört, dass Facebook iOS-Builds so lange dauern können). Niemand möchte eine Stunde warten, um zu wissen, ob ein Build bestanden hat.

Wir kennen Hack-Lösungen wie das Ausführen von ESXI-VMs auf Mac Minis, die unter OS X und xcodebuild bei großen Projekten mit Builds, die auf einem modernen Mac Book Pro oder Mac Mini länger als 10 Minuten dauern, oder anderen Anmeldekonten keine gute Leistung bringen auf einer Bare-Metal-Maschine an die Umgebung, um gleichzeitig Tests mit derselben Xcode-Version und demselben Simulatorgerät ausführen zu können.

ESXi wird offiziell nicht unterstützt, obwohl es ziemlich gut funktioniert. Einer der Gründe, warum VMware Mac Mini-Hardware möglicherweise noch nicht unterstützt, ist der Mangel an ECC-Speicher. Obwohl Mac Pro unterstützt wird, da es über ECC-Speicher verfügt, hat es wahrscheinlich dieselben Probleme wie die Mac Minis in Bezug auf iOS-Builds, die im Vergleich zu Bare Metal langsamer werden Tests auf derselben Hardware- und Softwarekonfiguration (nur Änderung gegenüber VM gegenüber Bare Metal unter OS X). MacPro wurde zu diesem Zeitpunkt noch nicht von uns getestet. Nach unserer Erfahrung ist VMware Fusion auch in Bezug auf die Leistung recht langsam.

Noch wichtiger ist, dass Entwickler länger warten müssen, wenn die oben genannten Probleme zusammengefügt werden, es sei denn, der Maschinenpool ist groß genug, um eine Vielzahl von Änderungen zu unterstützen (ein CI-Build pro 2 Entwickler, sehr hohes Verhältnis von Maschinen zu Entwickler). CI-Build-Maschinen sollten in der Lage sein, mehr gleichzeitige Builds und mehr gleichzeitige Tests als 1 auszuführen.

Eine weitere Beobachtung zu den iOS-Simulatoren ist, dass sie noch in Arbeit zu sein scheinen und auch nach 7 Hauptversionen noch nicht fertig sind. Der Unterbefehl 'xcrun simctl' verfügt über die Option --set, die möglicherweise eine gewisse Flexibilität zulässt, jedoch nicht sicher ist, welcher mögliche Wert gültig ist, und dies gilt auch für --noxpc. Niemand sollte geeignete Werte erraten müssen, und außerdem sollte es eine Manpage geben, die diese Option und möglicherweise ein Beispiel behandelt. Was sind einige Anwendungsfälle für diese 2 interessanten Optionen?

Sie können sagen, dass keine App so konzipiert sein sollte, dass sie einen großen Platzbedarf hat, der die gleichzeitige Ausführung von Tests und die Verwendung einer besseren Architektur auf XPC-Basis rechtfertigt, da monolithische Apps das Problem sind. Dies mag sehr wohl richtig sein, es ist keine so pragmatische Lösung, wie wir es uns erhoffen könnten, und das Problem bleibt bestehen, wenn Sie über 20 Apps haben, die auf derselben Infrastruktur aufbauen können.

Um eine Maschinenkonfiguration und Prozesse so allgemein und skalierbar wie möglich für einen höheren Durchsatz zu gestalten, muss der Simulator (App + Core-Entwickler) bearbeitet werden. Es erfordert auch ein hohes Maß an Zusammenarbeit zwischen allen Apple-Simulator-Entwicklern und den Simulator-Produktbesitzern, die das Product Backlog korrekt bestellen müssen, damit dieses Problem Beachtung findet :-)

Patrick D.
quelle
5

Sie können mehrere Simulatorinstanzen für verschiedene Hardwareprofile ausführen und diese debuggen. Zunächst müssen Sie Ihre App für jeden Hardwaretyp (iPhone 6, iPad usw.) über XCode ausführen, um sie in Simulatorinstanzen zu installieren. Führen Sie dann die Simulatorinstanzen und Ihre App wie oben erläutert aus. Zum Debuggen können Sie den Debugger über das Menü "XCode-> Debug-> An Prozess anhängen" an laufende Prozesse anhängen. In diesem Blogeintrag finden Sie ein Beispiel: http://oguzdemir.dualware.com/?p=43

Oguz Demir
quelle
5

Hier ein kleines Skript in .sh, um die UDID der Simulatoren auf Ihrem Computer aufzulisten und auszuführen. Kopieren Sie den folgenden Code in eine Datei mit der Erweiterung ".sh" und führen Sie ihn im Terminal aus.

Wie man:

Schritt 1. Listen Sie Geräte mit Option 1 auf und kopieren Sie die gewünschte UDID

Schritt 2. Führen Sie Option 2 aus, fügen Sie die UDID ein und drücken Sie die Eingabetaste

Seien Sie vorsichtig: Stellen Sie sicher, dass der Pfad, der Ihre Simulatoren enthält, in Ordnung ist (falls nicht durch Ihren Pfad ersetzt).

#!/bin/sh
PS3='Type the number of your choice (1, 2 or 3) and press Enter: '
options=("List Devices" "Run Simulator" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "List Devices")
            xcrun simctl list devices
            echo "\033[1m\n\nCopy the UDID in parentheses of the device which you want run and launch option 2 (Run Simulator)\033[0m"
            ;;
        "Run Simulator")
            read -p 'Type device UDID which you want launch: ' currentDeviceUDID
            open -n /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/ --args -CurrentDeviceUDID $currentDeviceUDID
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

Danke dir,

O. Boujaouane
quelle
0

Dies ist 2020, xCode 11.4: Datei -> Gerät öffnen -> iOs 13.4 -> und wählen Sie die iPhone-Version, die nicht zuerst ausgeführt wurde, und Sie erhalten den zweiten Emulator.

vvolkov
quelle