Cordova: iniciar imagem específica do emulador iOS

120

Estou desenvolvendo um aplicativo móvel multiplataforma usando Cordova, focando principalmente em iOS na fase de desenvolvimento.

Para meu processo de desenvolvimento, seria ideal se eu pudesse iniciar meu aplicativo Cordova diretamente da linha de comando e carregá-lo em um emulador especificado. Posso fazer isso executando o seguinte no diretório raiz do projeto:

$cordova run --debug --emulator iOS

Isso funciona bem e resulta em um simulador de iOS executando meu aplicativo em um iPhone 4 Retina simulado com iOS 7.0.3

Além desse dispositivo simulado, também gostaria de testar (por exemplo) um iPad. Eu tenho essas imagens de emulação instaladas e posso iniciar meu aplicativo nelas manualmente no Xcode. Além disso, o comando list-emulator-images(localizado em project_dir/platforms/ios/cordova/lib) fornece a seguinte saída:

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

No entanto, a questão é: não consigo descobrir como iniciar o emulador em outra coisa senão o padrão (que parece ser a iPhone Retina (4-inch)imagem de emulação). A saída relevante de cordova helpfornece as seguintes informações:

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

Eu tentei coisas como o seguinte:

cordova run --debug --emulator=iPad iOS

E muitas variações disso, mas sem sorte. Toda vez que ele inicia no mesmo emulador.

A documentação da ferramenta de linha de comando não oferece nenhuma informação a esse respeito, e uma extensa pesquisa no Google também não encontrou nada. Estou perdendo algo trivial? Ou estou tentando fazer algo estranho? Eu realmente espero que alguém aqui tenha experiência com isso e possa fornecer algumas respostas.

Muito obrigado antecipadamente!

editar: esqueci de mencionar explicitamente; Estou fazendo tudo isso em um Mac. Como mencionado anteriormente, executar o aplicativo em diferentes emuladores / simuladores no Xcode funciona bem.

EggMeister
fonte

Respostas:

335

Para descobrir quais são as imagens do simulador disponíveis, você pode usar para listá-las

$ 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

Em seguida, use um dos nomes do simulador no parâmetro --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 Saia do simulador antes de iniciar um simulador de alvo diferente (selecione na barra de menu Simulator->Quit)

Leve em consideração que pode ser necessário sair do simulador iOS por meio do menu para alternar do iPhone de 3,5 para 4 polegadas.

lista dinâmica está disponível em platforms/ios/cordova/lib/list-emulator-images

csantanapr
fonte
3
Obrigado, isso ajudou. Qual foi a sua fonte para isso? Apenas me perguntando como eu poderia ter descoberto isso sozinho ... A resposta a esta pergunta também ajudou muito: stackoverflow.com/questions/13877840/… Aparentemente, 'cordova emulate' é um wrapper voor ios-sim, que você também pode falar para diretamente. Isso é o que acabei fazendo, para que possa construir e iniciar meu código diretamente do IDE de minha escolha.
EggMeister
Acabei de executar este comando e posso confirmar que os emuladores de 4,7 e 5,5 polegadas não estão listados, mesmo com o Xcode 6 instalado :-(
Ben Clayton
Olá, tentei este comando "./platforms/ios/cordova/lib/list-emulator-images" mas não vi todas as opções, SEM iPhone 6, SEM iPhone 6-Plus, SEM iPad-Air, o que seria o problema? Obrigado
user2120121
10
Eu realmente não sei por que, mas para mim, Cordova CLI lançaria "Error: Cannot read property 'name' of undefined"ao especificar o destino com aspas, eu só poderia fazê-lo funcionar executando-o assim cordova run ios --target=iPhone-6. Espero que isso evite problemas para alguém!
Gifford N.
1
Estou tendo o mesmo resultado problemático que Gifford N. Estou usando cordova 7.0.0
Terry Wilkinson
18

Como csantanapr, você pode usar:

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

mas, neste caso, o projeto cordova (ou PhoneGap ou outro) será lançado no simulador do iPhone 4s com iOS versão 7.0.3 .

Quer lançar o projeto no mesmo simulador, mas com outra versão iOS (7.1 ou 8.0, caso existam no seu sistema)?

Claro, você pode fazer como dizer cobberboy :

inicie um emulador específico e escolha sua versão do ios usando diretamente o ios-sim.

Mas você pode melhorar a --targetopção de runcomando cordova .

Em primeiro lugar, você deve garantir a versão alvo do iOS disponível em seu sistema.

Para isso use a resposta de cobberboy :

$ ios-sim showdevicetypes

Então você precisa abrir o arquivo your_project_dir/platforms/ios/cordova/lib/run.jse encontrar linhas de código como abaixo:

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

Para uso iPhone-4s, 7.1(ou algum outro), basta adicioná-lo ao 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 em

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

sua --target="iPhone-4s, 7.1"vontade será válida.

E função deployToSimde 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);
}

converter iPhone-4s, 7.1em argumento válido com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1para ios-sim.

Ruslan Soldatenko
fonte
Isso funciona perfeitamente e me permitiu usar ionic run ios --target='iPhone-6, 9.0'ao usar o Ionic Framework.
jorisw de
Bom achado 👍. Eu simplesmente comentou o bloco que valida validTargetse eu era capaz de especificar a plataforma completa, ex: "--target="iPhone-6, 8.4"". Seria muito bom se Cordova delegasse a validação de destino para ios-sim.
Kyle Fox,
Isso não funciona para mim. Digitei lixo em run.js e ele foi ignorado. O npm armazena isso em cache ou algo assim? Como posso atualizar o cache do npm?
Randgalt
Você também pode executar o "ios de atualização da plataforma iônica" e poderá executar os emuladores instalados recentemente
Benjamin Piette,
10

TL; DR

Você pode iniciar um emulador específico e escolher sua versão do ios usando diretamente o 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

Detalhes

Quando eu executei isto:

cordova emulate ios --target="iPad"

e olhei os processos em execução, vi o seguinte (em uma única linha):

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

Investigando mais profundamente o ios-sim , parece que existem algumas opções mais específicas, particularmente:

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

Então eu fiz como sugerido e executei o ios-sim com um argumento "showdevicetypes" e consegui isso:

$ 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
fonte
Como isso funciona para alterar o simulador padrão? Você está contornando a parte do Cordova aqui e apenas lançando diretamente, certo?
mix3d
7

Não inclua o número da versão

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

A partir do Xcode 8.3.2 ...

Tópico antigo, eu sei, mas parece, talvez, que a resposta mudou ligeiramente. As dicas de posts anteriores neste tópico ajudaram, mas também a leitura da documentação incluída no código,<cordova-project>/platforms/ios/cordova/lib/run.js

Execute ./platforms/ios/cordova/lib/list-emulator-imagespara listar as imagens do emulador disponíveis. Não inclua o número da versão no final ao fazer a chamada cordova para executar no emulador desejado.

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

Ver mais

David Vezzani
fonte
agradeço a Deus pelo seu comentário! Não funcionou após a última atualização e não foi possível encontrar nenhuma informação. Acabei de receber a mensagem de erro: "Erro: Não é possível ler a propriedade 'nome' de undefined" que foi corrigida após NÃO incluir a versão ios.
Marco Rinck
@MarcoRinck verifique o comentário na resposta, há uma solução rápida digitando:cordova run ios --target=iPhone-6
Kira Hao
3

Não posso comentar a resposta acima devido à minha baixa reputação, mas a lista de alvos está disponível em:

start-emulator 

debaixo

your platform/ios/cordova/lib/

Dito isso, não consigo fazer o emulador de retina do ipad funcionar ...

Sergio
fonte
3

saída mais rápida da lista de dispositivos: $ instruments -s devices

Basta usar o nome do dispositivo sem a versão.

Tino Rüb
fonte
0

Simulador de iphone e ipad diferente

  1. cordova run ios --list

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

BIRJA KUMAR
fonte
0

A resposta de @Birja está funcionando agora, mas o comando run que ele finalmente usou ainda está errado, então aqui está a resposta certa:

Listar todos os dispositivos disponíveis no simulador cordova run ios --list

Isso resultará em algo assim:

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"Use qualquer alvo acima. Para rodar no simulador.

Mamba negra
fonte