Cordova: uruchom określony obraz emulatora iOS

120

Tworzę wieloplatformową aplikację mobilną przy użyciu Cordova, koncentrując się głównie na iOS w fazie rozwoju.

Dla mojego procesu programowania byłoby idealnie, gdybym mógł uruchomić moją aplikację Cordova bezpośrednio z wiersza poleceń i załadować ją do określonego emulatora. Mogę to zrobić, uruchamiając następujące polecenie z katalogu głównego projektu:

$cordova run --debug --emulator iOS

Działa to dobrze i powoduje, że symulator iOS uruchamia moją aplikację na symulowanym telefonie iPhone 4 Retina z iOS 7.0.3

Oprócz tego symulowanego urządzenia chciałbym również przetestować (na przykład) iPada. Mam zainstalowane te obrazy emulacji i mogę ręcznie uruchomić w nich moją aplikację w Xcode. Ponadto polecenie list-emulator-images(znajdujące się w project_dir/platforms/ios/cordova/lib) daje następujący wynik:

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

Chodzi jednak o to, że nie mogę dowiedzieć się, jak uruchomić emulator w niczym innym niż domyślnym (który wydaje się być iPhone Retina (4-inch)obrazem emulacji). Odpowiednie dane wyjściowe programu cordova helpzawierają następujące informacje:

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

Próbowałem następujących rzeczy:

cordova run --debug --emulator=iPad iOS

I wiele odmian, ale bez powodzenia. Za każdym razem uruchamia się w tym samym emulatorze.

Dokumentacja narzędzia wiersza poleceń nie zawiera żadnych informacji w tym zakresie, a obszerna wyszukiwarka Google również niczego nie znalazła. Czy brakuje mi czegoś trywialnego? A może próbuję zrobić coś dziwnego? Naprawdę mam nadzieję, że ktoś tutaj ma z tym doświadczenie i może udzielić kilku odpowiedzi.

Z góry bardzo dziękuję!

edycja: zapomniałem wyraźnie wspomnieć; Robię to wszystko na Macu. Jak wspomniano wcześniej, uruchomienie aplikacji w różnych emulatorach / symulatorach w Xcode działa dobrze.

EggMeister
źródło

Odpowiedzi:

335

Aby dowiedzieć się, jakie są dostępne obrazy symulatora, możesz je wyświetlić

$ 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

Następnie użyj jednej z nazw symulatora w parametrze --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"

Ważne Wyjdź z symulatora przed uruchomieniem innego symulatora celu (wybierz z paska menu Simulator->Quit)

Weź pod uwagę, że może być konieczne zamknięcie symulatora iOS za pomocą menu, aby zmienić iPhone'a z 3,5 na 4-calowy.

lista dynamiczna jest dostępna w platforms/ios/cordova/lib/list-emulator-images

csantanapr
źródło
3
Dzięki, to pomogło. Jakie było twoje źródło tego? Zastanawiam się tylko, jak mogłem sam to rozgryźć ... Odpowiedź na to pytanie również bardzo pomogła: stackoverflow.com/questions/13877840/ ... Najwyraźniej 'cordova emulate' to opakowanie dla ios-sim, z którym można też rozmawiać bezpośrednio. To jest to, co ostatecznie zrobiłem, więc mogę zbudować i uruchomić kod bezpośrednio z wybranego IDE.
EggMeister
Właśnie uruchomiłem to polecenie i mogę potwierdzić, że emulatory 4,7 i 5,5 cala nie są wymienione, nawet z zainstalowanym Xcode 6 :-(
Ben Clayton,
Cześć, próbowałem tego polecenia "./platforms/ios/cordova/lib/list-emulator-images", ale nie widziałem wszystkich opcji ,, BEZ iPhone'a 6, BEZ iPhone'a 6-Plus, BEZ iPada-Air, co by było problem? Dzięki
user2120121
10
Naprawdę nie wiem dlaczego, ale dla mnie Cordova CLI rzuciłby "Error: Cannot read property 'name' of undefined"podczas określania celu za pomocą cudzysłowów, mogłem go tylko uruchomić, uruchamiając go w ten sposób cordova run ios --target=iPhone-6. Mam nadzieję, że zaoszczędzi to komuś kłopotów!
Gifford N.
1
Mam ten sam problematyczny wynik co Gifford N. Używam cordova 7.0.0
Terry Wilkinson
18

Jak mówi csantanapr , możesz użyć:

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

ale w tym przypadku projekt cordova (lub PhoneGap lub inny) zostanie uruchomiony na symulatorze iPhone'a 4s z iOS w wersji 7.0.3 .

Jeśli chcesz uruchomić projekt na tym samym symulatorze, ale z inną wersją iOS (7.1 lub 8.0, jeśli istnieją wersje w Twoim systemie)?

Oczywiście, możesz zrobić jak powiedz cobberboy :

uruchom określony emulator i wybierz swoją wersję ios bezpośrednio przy użyciu ios-sim.

Ale możesz ulepszyć --targetopcję runpolecenia cordova .

Najpierw musisz upewnić się, jaka docelowa wersja iOS jest dostępna w twoim systemie.

Do tego użyj odpowiedzi cobberboya :

$ ios-sim showdevicetypes

Następnie musisz otworzyć plik your_project_dir/platforms/ios/cordova/lib/run.jsi znaleźć linie kodu, jak poniżej:

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

Do użytku iPhone-4s, 7.1(lub innego) po prostu dodaj go do tablicy 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'];

I w

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

twoja --target="iPhone-4s, 7.1"wola będzie ważna.

I funkcja deployToSimz 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);
}

przekonwertować iPhone-4s, 7.1na prawidłowy argument com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1dla ios-sim.

Rusłan Soldatenko
źródło
Działa to doskonale i pozwoliło mi używać ionic run ios --target='iPhone-6, 9.0'podczas korzystania z Ionic Framework.
jorisw
Dobre znalezisko 👍. Po prostu zakomentowałem blok, który sprawdza poprawność validTargetsi mogłem określić pełną platformę, np "--target="iPhone-6, 8.4"". : . Byłoby naprawdę miło, gdyby Cordova przekazała walidację celu ios-sim.
Kyle Fox
To nie działa na mnie. W run.js wpisałem śmieci i zostało zignorowane. Czy npm buforuje to czy coś? Jak mogę odświeżyć pamięć podręczną npm?
Randgalt,
Możesz także uruchomić "ionic platform update ios" i będziesz mógł uruchomić ostatnio zainstalowane emulatory
Benjamin Piette
10

TL; DR

Możesz uruchomić określony emulator i wybrać swoją wersję ios bezpośrednio za pomocą 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

Detale

Kiedy to uruchomiłem:

cordova emulate ios --target="iPad"

i spojrzałem na uruchomione procesy, zobaczyłem to (w jednym wierszu):

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

Badając głębiej ios-sim , wygląda na to, że istnieje kilka bardziej szczegółowych opcji, w szczególności:

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

Zrobiłem więc zgodnie z sugestią i uruchomiłem ios-sim z argumentem „showdevicetypes” i otrzymałem to:

$ 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
źródło
Jak to działa w przypadku zmiany domyślnego symulatora? Pomijasz tutaj kawałek cordova i po prostu uruchamiasz bezpośrednio, prawda?
mix3d
7

Nie podawaj numeru wersji

cordova run ios --target="iPhone-6s"
Ariel Ibarra
źródło
4

Od Xcode 8.3.2 ...

Wiem, stary wątek, ale wydaje się, że być może odpowiedź nieco się zmieniła. Pomogły wskazówki z wcześniejszych postów w tym wątku, ale też przeczytanie dokumentacji zawartej w kodzie,<cordova-project>/platforms/ios/cordova/lib/run.js

Wykonaj, ./platforms/ios/cordova/lib/list-emulator-imagesaby wyświetlić listę dostępnych obrazów emulatora. Nie podawaj numeru wersji na końcu, gdy wywołujesz Cordova, aby działał w wybranym emulatorze.

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

Zobacz więcej

David Vezzani
źródło
dzięki Bogu za komentarz! Po ostatniej aktualizacji nie działało i nie można znaleźć żadnych informacji. Właśnie pojawił się komunikat o błędzie: „Błąd: nie można odczytać właściwości 'nazwa' niezdefiniowanej”, który został naprawiony po NIE dołączeniu wersji ios.
Marco Rinck
@MarcoRinck sprawdź komentarz do odpowiedzi, jest szybkie rozwiązanie, wpisując:cordova run ios --target=iPhone-6
Kira Hao
3

Nie mogę skomentować powyższej odpowiedzi ze względu na moją niską reputację, ale lista celów dostępna jest pod adresem:

start-emulator 

pod

your platform/ios/cordova/lib/

Powiedziawszy to, nie mogę uruchomić emulatora siatkówki iPada ...

Sergio
źródło
3

najszybsze wyjście listy urządzeń: $ instruments -s devices

Po prostu użyj nazwy urządzenia bez wersji.

Tino Rüb
źródło
0

Inny symulator iPhone'a i iPada

  1. cordova run ios --list

  2. cordova emuluje ios - docelowy „iPhone-7”

BIRJA KUMAR
źródło
0

Odpowiedź @ Birja działa teraz, ale polecenie uruchomienia, którego użył, w końcu jest nadal błędne, więc oto prawidłowa odpowiedź:

Lista wszystkich urządzeń dostępnych w symulatorze cordova run ios --list

Rezultatem będzie coś takiego:

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"Użyj dowolnego celu z powyższego. Aby uruchomić w symulatorze.

Czarna Mamba
źródło