Xcode6: esegui due istanze del simulatore


122

Ho due obiettivi diversi per la mia app iOS. È possibile eseguire contemporaneamente le due app su due differenti istanze del simulatore? Va bene se richiederebbe di non beneficiare del debugger di Xcode. Finora l'unica soluzione che ho trovato è stata installare due versioni di XCode, ma è una soluzione molto pesante / che richiede molto spazio.



3
È una domanda duplicata, ma la risposta di @ i40west è effettivamente migliore.
vintagexav

In realtà, la risposta qui è ancora meglio stackoverflow.com/questions/896487/...
FlowUI. SimpleUITesting.com

Risposte:


224

Puoi eseguire due istanze del simulatore iOS dalla riga di comando. Non saranno collegati al debug di Xcode, anzi, sembra funzionare solo se lo fai senza che Xcode sia in esecuzione.

Innanzitutto, è necessario eseguire l'app nel simulatore da Xcode, per installarla nel simulatore. Assicurati di eseguire gli stessi simulatori che utilizzerai alla fine

Ora apri una finestra di Terminale e fallo.

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

Aggiornamento per Xcode 7: con Xcode 7 il nome dell'applicazione del simulatore è cambiato, quindi è invece questo:

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

Quando viene avviato il secondo, riceverai un avviso di errore. Basta chiuderlo e selezionare un dispositivo diverso da "Hardware" »" Dispositivo ". Ora hai due simulatori in esecuzione e tutte le app che hai già installato in essi da Xcode saranno lì.


7
Ehi, grazie, è una buona idea, ma sfortunatamente dice "Impossibile avviare il dispositivo nello stato corrente: avviato" per il secondo simulatore. Vedo due simulatori ma lo schermo del secondo rimane nero anche dopo aver disattivato l'allarme.
vintagexav

6
Forse è perché il mio XCode è attualmente in esecuzione. Forse dovresti aggiungere quell'istruzione alla tua risposta :) Inoltre funziona solo se si utilizzano due diversi hardware simulati (ad esempio: iPhone 5 e iPhone 5s)
vintagexav

13
A proposito, per eseguire correttamente due diversi simulatori con due diversi hardware simulati ed evitare il messaggio "Impossibile avviare il dispositivo nello stato corrente: Booted", è necessario modificare la versione del primo simulatore dopo averlo avviato facendo clic su simulatore> hardware. Maggiori informazioni: stackoverflow.com/questions/24023029/...
vintagexav

1
Grazie! Sto usando 2 simulatori (uno con iPhone5, l'altro iPhone6) per testare la sincronizzazione di iCloud. Da notare, la sincronizzazione del simulatore è complicata, quindi per scopi pratici è necessario forzare la sincronizzazione di iCloud utilizzando Debug-> Trigger iCloud Sync. Quindi, con questi due dispositivi che eseguono la mia applicazione nelle rispettive finestre del simulatore, apporto una modifica al dispositivo1 (iphone5), forzo la sincronizzazione per il dispositivo1, faccio clic su dispositivo2 (iPhone6) e forza la sincronizzazione. E viola, ora puoi testare la sincronizzazione di iCloud nel simulatore. L'apertura della console del simulatore è utile, poiché puoi visualizzare l'attività di sincronizzazione in background quando si verifica.
ObjectiveTC

3
Sono contento di aver trovato la tua risposta, grazie! Volevo solo menzionare che apparentemente PUOI avere XCode in esecuzione contemporaneamente, con i seguenti avvertimenti: 1. il secondo simulatore deve avere una configurazione diversa dal primo (dopo il popup che si lamenta, devi cambiare la versione del dispositivo del simulatore dal menu Hardware). 2. ogni volta che si arresta e si riavvia il primo simulatore da XCode, verrà arrestato e riavviato anche il secondo (e sarà necessario modificare nuovamente la versione del dispositivo)
Alex

26

Xcode 9+

Xcode 9 ora supporta l'avvio di più simulatori. Questo è stato annunciato nel WWDC 2017.

Vai e cambia il simulatore in Xcode, Cmd + R e vedrai spuntare un nuovo simulatore.

inserisci qui la descrizione dell'immagine


9

Testato con successo che la soluzione di i40west funziona per avviare manualmente il simulatore, ma sembra sciocco che in questo giorno ed età, un simulatore iOS richiede diverse versioni di Xcode E diversi tipi di dispositivi quando si eseguono test simultanei dalla riga di comando (caso d'uso leggermente diverso ma correlato alla domanda originale in alto ).

Fare riferimento all'articolo Apple qui che è più rilevante per build e test da riga di comando: https://developer.apple.com/library/ios/technotes/tn2339/_index.html

Più test simultanei hanno funzionato bene per noi se si passa il corretto --args - a 'iOS simulator.app' prima di eseguire il comando 'xcodebuild test' con il valore corretto di '-destination' che corrisponde al lancio del simultizzatore con il valore dell'UUID dall'output di 'xcrun simctl list 'e impostando la variabile d'ambiente DEVELOPER_DIR per selezionare diversi binari della versione XCode (cioè il percorso di base per Xcode 6.1 e 6.4)

La ragione per la necessità di test di unità simultanei sulla stessa macchina fisica e sullo stesso dispositivo simulatore iOS come iPad o iPhone e la stessa versione di Xcode è principalmente per supportare CI (integrazione continua) di qualsiasi progetto iOS in cui lo stesso sistema di build può eseguire più di 1 build di più build le app (la nostra azienda ha circa 30 app) alla volta al momento del check-in sui rami delle funzionalità vengono automaticamente scansionate e costruite dall'agente Bamboo senza dover attendere il completamento di altre build in esecuzione - Bamboo supporta questo tipo di build automatica su auto- scoperti i rami delle funzionalità se abilitati.

Per quanto riguarda ciò che accade quando si eseguono più test simultanei, eseguiamo più comandi 'xcodebuild test' due volte in successione in diverse finestre Terminal.app, il risultato è che viene visualizzata solo una finestra del simulatore e i test falliscono nel test più semplice.

Quando complichiamo i criteri di accesso per il nostro lancio di prova, diverse versioni di Xcode per ogni simulazione e lancio di prova, quando usiamo DEVELOPER_DIR come da pagine man (xcodebuild test) stiamo specificando un dispositivo diverso che si apre in due finestre separate, ma il risultato è quello eventuali test in esecuzione nella prima finestra vengono interrotti dalla seconda finestra del simulatore iOS.

Sembra esserci una risorsa comune condivisa sotto il cofano che si sta intromettendo, non sono sicuro che sia intenzionale o solo una nuova funzionalità che richiede più di qualche giorno di seria riflessione su come implementare al meglio le esecuzioni di test simultanee senza impatti negativi.

Non vogliamo utilizzare le VM per aggirare le limitazioni della simulazione poiché la nostra esperienza e di altri in generale è che iOS costruisce le prestazioni su VM con un numero elevato di piccoli file è più lento dell'hardware fisico. Le VM generalmente rallentano notevolmente la creazione a causa di problemi di I / O nella combinazione di software VMware e hardware e / o firmware Apple. Scusa virtualmenteghetto ma per noi le VM non funzionano bene - il sito virtualmenteghetto ci ha fornito le istruzioni su come installare ESXi 5.5 su Mac Mini per la nostra build farm.

Abbiamo riscontrato il problema delle prestazioni di build con ESXi 5.5 su Mac Mini che è più lento del bare metal anche con SSD di un fattore 2 o più (cioè una build baremetal di 10 minuti richiede 20 su VM). Fare riferimento all'articolo squareup di seguito sul perché.

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

La limitazione di 1 dispositivo sim alla volta per i test di unità xcodebuild riduce notevolmente la produttività e aggiunge in modo esponenziale costi significativi ad Apple e all'ecosistema.

Il costo per Apple di non supportare la concorrenza per giustificare più acquisti di hardware dovrebbe essere valutato attentamente, soppesando i rischi di perdere velocità di sviluppo rispetto ad altri concorrenti che hanno meno restrizioni in termini di sim e EULA.

Il vantaggio di test simultanei nello stesso accesso utente (come funziona la maggior parte dei sistemi ci) è quella qualità delle app di app store a marchio Apple che a sua volta è in parte ciò che fa sì che le persone acquistino i dispositivi iOS in primo luogo. La scarsa qualità del software rende l'intero marchio un po 'più lento e il supporto della concorrenza nei simulatori iOS sembra sicuramente il modo intelligente per supportare l'ecosistema. Un po 'un corollario al problema in questione sono i recenti miglioramenti come il server Xcode di Apple per CI, la funzionalità di test dell'interfaccia utente automatizzata di Xcode in Xcode 7.

Incoraggiare inutili spese generali per far sì che le persone acquistino grandi quantità di hardware, installazione, configurazione, per non parlare di numerose persone necessarie per supportare tutte le macchine, la rete e i punti di alimentazione, ecc., Alla fine, potenzialmente danneggerà i profitti di Apple poiché non tutti sono come Apple e in grado di permettersi rack di MacPro o Mac Mini solo per supportare test simultanei su simulatori. Il punto centrale di un simulatore è evitare di utilizzare l'hardware e anche velocizzare i test.

Inoltre, le limitazioni dell'EULA sulle VM rendono il caso per le VM su Mac Pro piuttosto debole. Questo tipo di hardware sarebbe interessante se potessero essere eseguiti più sim, ma poiché i test di unità simultanei non sono supportati (tranne nelle due condizioni precedenti - diversa versione di XCode e diverso dispositivo di simulazione) probabilmente rimarremo con Mac Mini per l'infrastruttura di build.

Queste limitazioni di sim e EULA di Apple non solo rallentano la pipeline di compilazione, ma aggiungono anche complessità e costi non necessari. Potrebbe non essere così preoccupante per le piccole app, ma man mano che le app crescono in dimensioni e complessità, la build può richiedere fino a un'ora (ho sentito che le build iOS di Facebook possono richiedere così tanto tempo). Nessuno vuole aspettare un'ora per sapere se una build è stata superata.

Conosciamo soluzioni di hacking come l'esecuzione di VM ESXI su Mac Mini che non funzionano bene in termini di prestazioni con OS X e xcodebuild su progetti di grandi dimensioni con build che richiedono più di 10 minuti su un moderno Mac Book Pro o Mac Mini o diversi account di accesso sulla macchina bare metal nell'ambiente solo per poter eseguire test simultanei sulla stessa versione di Xcode e sullo stesso dispositivo simulatore.

ESXi non è ufficialmente supportato anche se funziona abbastanza bene. Uno dei motivi per cui VMware potrebbe non supportare l'hardware Mac Mini è ancora la mancanza di memoria ECC, sebbene Mac Pro sia supportato in quanto ha memoria ECC, probabilmente ha gli stessi problemi del Mac Mini in termini di build iOS che rallenta rispetto al bare metal test sulla stessa configurazione hardware e software (l'unica modifica è la VM rispetto al bare metal con OS X). MacPro non è stato testato da noi in questo momento. Nella nostra esperienza VMware Fusion è piuttosto lento anche in termini di prestazioni.

Ancora più importante, gli sviluppatori dovranno attendere più a lungo quando i problemi sopra menzionati vengono combinati insieme a meno che il pool di macchine non sia abbastanza grande da supportare la pipleline di modifiche (una build CI per ogni 2 sviluppatori, rapporto molto alto tra macchine e sviluppatore). Le macchine di compilazione CI dovrebbero essere in grado di eseguire più build simultanee e più test simultanei di 1.

Una delle altre osservazioni sui simulatori iOS è che sembrano essere un work in progress e completamente incompiuti anche dopo 7 versioni principali. Il sottocomando 'xcrun simctl' ha un'opzione --set che può consentire una certa flessibilità di qualche tipo ma non è sicuro di quale possibile valore sia valido, e lo stesso con --noxpc. Nessuno dovrebbe aver bisogno di indovinare valori appropriati e inoltre, dovrebbe esserci una pagina man che copre questa opzione e forse un esempio. Quali sono alcuni casi d'uso per queste 2 interessanti opzioni?

Potresti dire, beh, nessuna app dovrebbe essere progettata per avere un ampio footprint che garantisca l'esecuzione di test simultanei e l'utilizzo di un'architettura migliore basata su XPC, poiché il problema sono le app monolitiche. Questo potrebbe essere corretto, non è una soluzione così pragmatica come potremmo sperare e il problema rimane se hai più di 20 app da costruire sulla stessa infrastruttura.

Rendere la configurazione e i processi della macchina il più generici e scalabili possibile per un throughput più elevato richiederà del lavoro sul simulatore (app + core devs). Richiede anche un alto livello di collaborazione tra tutti gli sviluppatori del simulatore Apple e il proprietario del prodotto del simulatore deve ordinare correttamente il backlog del prodotto affinché questo problema attiri l'attenzione :-)



5

È possibile eseguire più istanze del simulatore per diversi profili hardware ed eseguirne il debug. Innanzitutto, devi eseguire la tua app da XCode per ogni tipo di hardware (iPhone 6, iPad ecc.) Per installarla nelle istanze del simulatore. Quindi esegui le istanze del simulatore e la tua app come spiegato sopra. Per eseguire il debug, puoi collegare il debugger ai processi in esecuzione dal menu "XCode-> Debug-> Allega al processo". Puoi controllare questo post del blog per un esempio: http://oguzdemir.dualware.com/?p=43


5

qui un piccolo script in .sh per elencare l'UDID dei simulatori sul tuo computer ed eseguirlo. Copia il codice sottostante in un file con estensione ".sh" ed eseguilo nel terminale.

Come:

Passaggio 1. Elenca i dispositivi con l'opzione 1 e copia l'UDID desiderato

Passaggio 2. Eseguire l'opzione 2 e incollare l'UDID, quindi premere il tasto Invio

Attenzione: verifica che il percorso che contiene i tuoi simulatori sia ok (se non lo sostituisci con il tuo percorso)

#!/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

Grazie,


0

Questo è il 2020, xCode 11.4: File -> Apri dispositivo -> iOs 13.4 -> e scegli la versione per iPhone che non era in esecuzione per prima e otterrai il secondo emulatore in esecuzione.

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.