Xcode6: Execute duas instâncias do simulador

122

Tenho dois destinos diferentes para o meu aplicativo iOS. É possível executar simultaneamente os dois aplicativos em duas instâncias diferentes do simulador? Tudo bem se for necessário não se beneficiar do depurador do Xcode. Até agora, a única solução que encontrei foi instalar duas versões do XCode, mas essa é uma solução muito pesada / que consome espaço.

vintagexav
fonte
3
É uma pergunta duplicada, mas a resposta da @ i40west é realmente melhor.
vintagexav
Na verdade, a resposta aqui é ainda melhor stackoverflow.com/questions/896487/…
FlowUI. SimpleUITesting.com 02/06/2015

Respostas:

224

Você pode executar duas instâncias do simulador do iOS na linha de comando. Eles não serão anexados à depuração do Xcode - de fato, parece funcionar apenas se você fizer isso sem o Xcode em execução.

Primeiro, você precisa executar o aplicativo no simulador do Xcode, para instalá-lo no simulador. Verifique se você está executando os mesmos simuladores que usará

Agora abra uma janela do Terminal e faça isso.

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

Atualização para o Xcode 7: Com o Xcode 7, o nome do aplicativo do simulador mudou, então é isso:

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

Quando o segundo for iniciado, você receberá um alerta de erro. Apenas descarte-o e selecione um dispositivo diferente de "Hardware" »" Dispositivo ". Agora você tem dois simuladores em execução, e os aplicativos que você já instalou no Xcode estarão lá.

i40west
fonte
7
Ei Obrigado, é uma boa ideia, mas, infelizmente, diz "Não é possível inicializar o dispositivo no estado atual: Inicializado" para o segundo simulador. Eu vejo dois simuladores, mas a tela do segundo permanece preta mesmo depois de escurecer o alerta.
vintagexav
6
Talvez seja porque meu XCode esteja em execução no momento. Talvez você deve adicionar essa instrução para a sua resposta :) Também funciona somente se estiver usando dois hardwares diferentes simulado (por exemplo: iPhone 5 e iPhone 5s)
vintagexav
13
A propósito, para executar dois simuladores diferentes corretamente com dois hardwares simulados diferentes e evitar o "Não é possível inicializar o dispositivo no estado atual: Inicializado", você deve alterar a versão do primeiro simulador após iniciá-lo clicando em simulador> hardware. Mais informações: stackoverflow.com/questions/24023029/…
vintagexav
1
Obrigado! Estou usando 2 simuladores (um rodando o iPhone5 e o outro iPhone6) para testar a sincronização do iCloud. Para observar, a sincronização do Simulador é minuciosa, portanto, para fins práticos, você deve forçar a sincronização do iCloud usando Debug-> Trigger iCloud Sync. Portanto, com esses dois dispositivos executando meu aplicativo em suas janelas separadas do simulador, faço uma alteração no dispositivo1 (iphone5), forço a sincronização para o dispositivo1, clico no dispositivo2 (iPhone6) e forço a sincronização. E viola, agora você pode testar a sincronização do iCloud no simulador. Abrir o console do simulador é útil, pois você pode visualizar a atividade de sincronização em segundo plano quando isso acontece.
ObjectiveTC
3
Estou feliz por ter encontrado sua resposta, obrigado! Gostaria apenas de mencionar que, aparentemente, você PODE ter o XCode em execução ao mesmo tempo, com as seguintes advertências: 1. o segundo simulador precisa ter uma configuração diferente da primeira (após a reclamação pop-up, é necessário alterar a versão do dispositivo do simulador no menu Hardware). 2. sempre que você parar e reiniciar o primeiro simulador de XCode, a segunda também será interrompido e reiniciado (e você precisa alterá-lo da versão do dispositivo novamente)
Alex
26

Xcode 9+

O Xcode 9 agora suporta o lançamento de vários simuladores. Isso foi anunciado na WWDC 2017.

Basta mudar o simulador no Xcode, Cmd + R e você verá um novo simulador aparecendo.

insira a descrição da imagem aqui

Guy Daher
fonte
9

Testou com êxito que a solução da i40west funciona para iniciar manualmente o simulador, mas parece tolo que atualmente, um simulador iOS exija diferentes versões do Xcode E diferentes tipos de dispositivos ao executar testes simultâneos na linha de comando (caso de uso ligeiramente diferente, mas relacionado à pergunta original na parte superior) )

Consulte o artigo da Apple aqui que é mais relevante para compilações e testes de linha de comando: https://developer.apple.com/library/ios/technotes/tn2339/_index.html

Vários testes simultâneos funcionaram bem para nós ao passar --args - corretos para 'iOS simulator.app' antes de executar o comando 'xcodebuild test' com o valor correto '-destination' correspondente ao lançamento do simulador com o valor de UUID da saída de 'xcrun lista simctl 'e definindo a variável de ambiente DEVELOPER_DIR para selecionar binários diferentes da versão do XCode (ou seja, caminho base para o Xcode 6.1 e 6.4)

O motivo para a necessidade de testes de unidade simultâneos na mesma máquina física e no mesmo dispositivo simulador iOS, como iPad ou iPhone e a mesma versão do Xcode, é principalmente para dar suporte ao IC (integração contínua) de qualquer projeto iOS, pelo qual o mesmo sistema de compilação pode executar mais de uma compilação de vários aplicativos (nossa empresa possui mais ou menos 30 aplicativos) por vez no check-in, os ramos de recursos são verificados e construídos automaticamente pelo agente Bamboo sem a necessidade de aguardar a conclusão de outras Builds em execução - o Bamboo suporta esse tipo de criação automática em ramificações de recurso descobertas, se ativadas.

Quanto ao que acontece ao executar vários testes simultâneos, executamos vários comandos 'xcodebuild test' duas vezes seguidas em diferentes janelas Terminal.app, o resultado é apenas uma janela do simulador e os testes falham no teste mais simples.

Quando complicamos os critérios de entrada para nosso lançamento de teste, versões diferentes do Xcode para cada sim e lançamento de teste, ao usar DEVELOPER_DIR de acordo com as páginas de manual (teste do xcodebuild), estamos especificando um dispositivo diferente que se abre em duas janelas separadas, mas o resultado é que todos os testes em execução na primeira janela são interrompidos pela segunda janela do simulador do iOS.

Parece haver um recurso compartilhado comum oculto que está atrapalhando, não tenho certeza de que ele se destina ou apenas um novo recurso que requer mais de alguns dias de reflexão séria sobre como implementar melhor as execuções simultâneas de testes sem impactos adversos.

Não queremos usar VMs para solucionar as restrições do sim, pois nossa experiência e outras em geral é que o iOS constrói desempenho em VMs com grande número de arquivos pequenos e é mais lento que o hardware físico. As VMs geralmente diminuem bastante a compilação devido a problemas de E / S na combinação do software VMware e hardware e / ou firmware da Apple. Desculpe, virtualmente, mas para nós, as VMs não têm um bom desempenho - o site do virtghetto nos forneceu instruções sobre como instalar o ESXi 5.5 nos Mac Mini para nosso farm de criação.

Ocorreu um problema no desempenho da compilação, com o ESXi 5.5 no Mac Mini sendo mais lento que o bare metal, mesmo com SSD por um fator de 2 ou mais (ou seja, uma compilação baremetal de 10 minutos leva 20 na VM). Consulte o artigo abaixo sobre o motivo.

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

A restrição de um dispositivo SIM por vez para testes de unidade xcodebuild reduz drasticamente a produtividade e adiciona exponencialmente custos significativos à Apple e ao ecossistema.

O custo para a Apple de não oferecer suporte à concorrência para justificar mais compras de hardware deve ser pensado com cuidado, ponderando os riscos de perda da velocidade do desenvolvedor contra outros concorrentes que têm menos restrições em termos de sims e EULA.

A vantagem de testes simultâneos no mesmo login de usuário (como a maioria dos sistemas ci funciona) é a qualidade dos aplicativos da loja de aplicativos da marca Apple, que por sua vez é em parte o que leva as pessoas a comprar os dispositivos iOS em primeiro lugar. A má qualidade do software torna toda a marca um pouco mais lenta e o suporte simultâneo nos simuladores iOS definitivamente parece ser o caminho inteligente a seguir para apoiar o ecossistema. Um pouco do corolário do problema em questão são as melhorias recentes, como o servidor Xcode da Apple para CI, a funcionalidade automatizada de testes de interface do usuário do Xcode no Xcode 7.

Incentivar despesas desnecessárias para levar as pessoas a comprar grandes quantidades de hardware, instalação, configuração, sem mencionar várias pessoas necessárias para suportar todas as máquinas, pontos de rede e pontos de energia etc., potencialmente prejudicará os lucros da Apple no final, pois nem todos são como a Apple e capaz de comprar racks de MacPro ou Mac Mini apenas para suportar testes simultâneos em simuladores. O objetivo de um simulador é evitar o uso do hardware e também acelerar os testes.

Além disso, as limitações do EULA em VMs tornam o caso das VMs no Mac Pro bastante fraco. Esse tipo de hardware seria atraente se vários simuladores pudessem ser executados, mas como testes de unidade simultâneos não são suportados (exceto nas duas condições acima - versão XCode diferente e dispositivo simulador diferente), provavelmente ficaremos com os Mac Mini para criar infraestrutura.

Essas limitações de sim e EULA da Apple não apenas tornam o pipeline de construção mais lento, mas também adicionam complexidade e custo desnecessários. Pode não ser tão preocupante para aplicativos pequenos, mas como os aplicativos aumentam em tamanho e complexidade, a compilação pode levar mais de uma hora (ouvi dizer que as compilações do Facebook iOS podem levar tanto tempo). Ninguém quer esperar uma hora para saber se uma compilação foi aprovada.

Conhecemos soluções de hackers, como a execução de VMs ESXI no Mac Minis, que não apresentam bom desempenho com o OS X e o xcodebuild em grandes projetos com builds que levam mais de 10 minutos em um moderno Mac Book Pro ou Mac Mini ou em contas de login diferentes na máquina bare metal para o ambiente apenas para poder executar testes simultâneos na mesma versão do Xcode e no mesmo dispositivo simulador.

O ESXi não é oficialmente suportado, embora funcione muito bem. Uma das razões pelas quais a VMware pode não oferecer suporte ao hardware do Mac Mini ainda é a falta de memória ECC, embora o Mac Pro seja suportado por possuir memória ECC, provavelmente tem os mesmos problemas que os do Mac Mini em termos de compilações do iOS mais lentas em comparação com o bare metal testes na mesma configuração de hardware e software (apenas a alteração é VM versus bare metal executando o OS X). O MacPro ainda não foi testado por nós. Em nossa experiência, o VMware Fusion também é bastante lento em termos de desempenho.

Mais importante ainda, os desenvolvedores precisarão esperar mais quando os problemas mencionados forem combinados, a menos que o conjunto de máquinas seja grande o suficiente para suportar várias linhas de mudanças (uma compilação de IC para cada 2 desenvolvedores, proporção muito alta de máquinas para desenvolvedor). As máquinas de criação de IC devem poder executar mais compilações simultâneas e testes simultâneos que 1.

Uma das outras observações sobre os simuladores do iOS é que eles parecem ser um trabalho em andamento e completamente inacabado, mesmo após 7 versões principais. O subcomando 'xcrun simctl' possui uma opção --set que pode permitir algum tipo de flexibilidade, mas não tem certeza de qual valor possível é válido e o mesmo com --noxpc. Ninguém precisa adivinhar valores apropriados e, além disso, deve haver uma página de manual que cubra essa opção e, talvez, exemplo. Quais são alguns casos de uso dessas duas opções interessantes?

Você pode dizer que, bem, nenhum aplicativo deve ser projetado para ter uma área ocupada que justifique a execução simultânea de testes e o uso de uma arquitetura melhor baseada no XPC, pois os aplicativos monolíticos são o problema. Isso pode muito bem estar correto, não é uma solução pragmática como poderíamos esperar, e o problema permanece se você tiver mais de 20 aplicativos para construir na mesma infraestrutura.

Tornar a configuração e os processos da máquina o mais genérico e escalável possível para maior produtividade exigirá algum trabalho no simulador (app + desenvolvedores principais). Também requer um alto nível de colaboração entre todos os desenvolvedores de simuladores da Apple e o (s) proprietário (s) do produto, solicitando o backlog do produto corretamente para que esse problema receba atenção :-)

Patrick D
fonte
5

Você pode executar várias instâncias do simulador para diferentes perfis de hardware e depurá-los. Primeiro, você precisa executar o aplicativo no XCode para cada tipo de hardware (iPhone 6, iPad etc.) para instalá-lo nas instâncias do simulador. Em seguida, execute instâncias do simulador e seu aplicativo, conforme explicado acima. Para depurá-lo, você pode anexar o depurador aos processos em execução no menu "XCode-> Debug-> Anexar ao Processo". Você pode verificar esta entrada do blog para obter um exemplo: http://oguzdemir.dualware.com/?p=43

Oguz Demir
fonte
5

aqui um pequeno script em .sh para listar o UDID de simuladores no seu computador e executá-lo. Copie o código abaixo em um arquivo com a extensão ".sh" e execute-o no terminal.

Como:

Etapa 1. Liste os dispositivos com a opção 1 e copie o UDID desejado

Etapa 2. Execute a opção 2 e cole o UDID e pressione a tecla Enter

Cuidado: verifique se o caminho que contém seus simuladores está ok (se não for substituído pelo seu caminho)

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

Obrigado,

O. Boujaouane
fonte
0

Este é o 2020, xCode 11.4: Arquivo -> Abrir dispositivo -> iOs 13.4 -> e escolha a versão do iPhone que não estava sendo executada primeiro e o segundo emulador será executado.

vvolkov
fonte