Кордова: запуск определенного образа эмулятора iOS

121

Я разрабатываю кроссплатформенное мобильное приложение с помощью Cordova, ориентируясь в основном на iOS на стадии разработки.

Для моего процесса разработки было бы идеально, если бы я мог запустить свое приложение Cordova непосредственно из командной строки и загрузить его в указанный эмулятор. Я могу сделать это, запустив следующее из корневого каталога проекта:

$cordova run --debug --emulator iOS

Это отлично работает и приводит к тому, что мое приложение запускается в симуляторе iOS на смоделированном iPhone 4 Retina с iOS 7.0.3.

Помимо этого смоделированного устройства, я также хотел бы протестировать (например) на iPad. У меня установлены эти изображения эмуляции, и я могу запустить в них свое приложение вручную в Xcode. Кроме того, команда list-emulator-images(расположенная внутри project_dir/platforms/ios/cordova/lib) дает следующий вывод:

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

Однако дело в том, что я не могу понять, как запустить эмулятор в чем-либо, кроме значения по умолчанию (которое, похоже, является iPhone Retina (4-inch)изображением эмуляции). Соответствующий вывод cordova helpдает следующую информацию:

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

Я пробовал следующее:

cordova run --debug --emulator=iPad iOS

И много оных вариаций, но не повезло. Каждый раз запускается в одном и том же эмуляторе.

Документация к инструменту командной строки не предлагает никакой информации по этому поводу, и обширный поиск в Google также ничего не нашел. Я упустил что-то тривиальное? Или я пытаюсь сделать что-то странное? Я действительно надеюсь, что у кого-то из присутствующих есть опыт в этом вопросе, и он может дать некоторые ответы.

Большое спасибо заранее!

изменить: забыл упомянуть явно; Я все это делаю на Mac. Как упоминалось ранее, запуск приложения в разных эмуляторах / симуляторах в Xcode работает нормально.

EggMeister
источник

Ответы:

336

Чтобы узнать, какие изображения для симуляторов доступны, вы можете их перечислить.

$ 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

Затем используйте одно из имён симулятора в параметре --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"

Важно Выйдите из симулятора перед запуском другого симулятора цели (выберите в строке меню Simulator->Quit)

Учтите, что вам может потребоваться выйти из симулятора iOS через меню, чтобы переключиться с 3,5 на 4-дюймовый iPhone.

динамический список доступен в platforms/ios/cordova/lib/list-emulator-images

csantanapr
источник
3
Спасибо, это помогло. Что было вашим источником для этого? Просто интересно, как я мог сам это понять ... Ответ на этот вопрос тоже очень помог: stackoverflow.com/questions/13877840/… Очевидно, «cordova emulate» - это оболочка для ios-sim, о которой вы также можете поговорить прямо. Это то, чем я закончил, поэтому я могу собрать и запустить свой код прямо из выбранной среды IDE.
EggMeister
Я только что запустил эту команду и могу подтвердить, что эмуляторы 4,7 и 5,5 дюймов не указаны в списке, даже если установлен Xcode 6 :-(
Бен Клейтон
Привет, я пробовал эту команду "./platforms/ios/cordova/lib/list-emulator-images", но я не видел всех вариантов, НЕТ iPhone 6, НЕТ iPhone 6-Plus, НЕТ iPad-Air, что бы эта проблема? Спасибо
user2120121
10
Я действительно не знаю почему, но для меня Cordova CLI бросал бы "Error: Cannot read property 'name' of undefined"при указании цели в кавычках, я мог заставить его работать, только запустив его вот так cordova run ios --target=iPhone-6. Надеюсь, это избавит кого-то от неприятностей!
Гиффорд Н.
1
У меня такой же проблемный результат, что и у Гиффорда Н. Я использую Cordova 7.0.0
Терри Уилкинсон
18

Как говорят csantanapr, вы можете использовать:

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

но в этом случае проект cordova (или PhoneGap, или другой) будет запущен на симуляторе iPhone 4s с версией iOS 7.0.3 .

Если вы хотите запустить проект на том же симуляторе, но с другой версией iOS (7.1 или 8.0, если эти версии существуют в вашей системе)?

Конечно, вы можете сказать, как коббербой :

запустите конкретный эмулятор и выберите свою версию ios, напрямую используя ios-sim.

Но вы можете улучшить --targetвариант команды cordova run.

Сначала вы должны убедиться, какая целевая версия iOS доступна в вашей системе.

Для этого воспользуйтесь ответом cobberboy :

$ ios-sim showdevicetypes

Затем вам нужно открыть файл your_project_dir/platforms/ios/cordova/lib/run.jsи найти строки кода, как показано ниже:

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

Для использования iPhone-4s, 7.1(или другого) просто добавьте его в массив 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'];

И в

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

ваша --target="iPhone-4s, 7.1"будет действительна.

А функция deployToSimиз 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);
}

преобразовать iPhone-4s, 7.1в допустимый аргумент com.apple.CoreSimulator.SimDeviceType.iPhone-4s, 7.1для ios-sim.

Руслан Солдатенко
источник
Это отлично работает и позволило мне использовать ionic run ios --target='iPhone-6, 9.0'Ionic Framework.
jorisw
Хорошая находка 👍. Я просто закомментировать блок , который проверяет validTargetsи я был в состоянии указать полные платформы, пример: "--target="iPhone-6, 8.4"". Было бы здорово, если бы Кордова делегировала проверку цели ios-sim.
Кайл Фокс,
У меня это не работает. Я набрал мусор в run.js, но его проигнорировали. Кеширует ли это npm что ли? Как я могу обновить кеш npm?
Randgalt
Вы также можете запустить «обновление ионной платформы ios», и вы сможете запускать недавно установленные эмуляторы
Бенджамин Пьетт
10

TL; DR

Вы можете запустить конкретный эмулятор и выбрать свою версию ios напрямую с помощью 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

подробности

Когда я запустил это:

cordova emulate ios --target="iPad"

и посмотрел на запущенные процессы, увидел это (в одной строке):

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

При дальнейшем изучении ios-sim , похоже, есть несколько более конкретных вариантов, в частности:

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

Итак, я сделал, как было предложено, и запустил ios-sim с аргументом showdevicetypes и получил следующее:

$ 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
источник
Как это работает для изменения симулятора по умолчанию? Вы здесь обходите кордову и просто запускаете прямо, верно?
mix3d
7

Не указывайте номер версии

cordova run ios --target="iPhone-6s"
Ариэль Ибарра
источник
4

Начиная с Xcode 8.3.2 ...

Старая ветка, я знаю, но кажется, возможно, ответ немного изменился. Подсказки из более ранних сообщений в этой теме помогли, но также помогло чтение документации, включенной в код,<cordova-project>/platforms/ios/cordova/lib/run.js

Выполнить, ./platforms/ios/cordova/lib/list-emulator-imagesчтобы вывести список доступных образов эмулятора. Не включайте номер версии в конце при вызове cordova для запуска в нужном эмуляторе.

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

Узнать больше

Дэвид Веццани
источник
слава богу за комментарий! Он не работал после последнего обновления и не мог найти никакой информации. Только что получено сообщение об ошибке: «Ошибка: не удается прочитать свойство« имя »неопределенного», которое было исправлено после НЕ включения версии для iOS.
Марко Ринк
@MarcoRinck проверьте комментарий к ответу, есть быстрое исправление, набрав:cordova run ios --target=iPhone-6
Кира Хао
3

Я не могу комментировать ответ выше из-за моей низкой репутации, но список целей доступен по адресу:

start-emulator 

под

your platform/ios/cordova/lib/

Сказав это, я не могу заставить работать эмулятор ipad retina ...

Sergio
источник
3

самый быстрый вывод списка устройств: $ instruments -s devices

Просто используйте имя устройства без версии.

Тино Руб
источник
0

Другой симулятор iphone и ipad

  1. Кордова запустить ios --list

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

БИРДЖА КУМАР
источник
0

Ответ @Birja работает прямо сейчас, но команда запуска, которую он использовал, наконец, все еще неверна, поэтому вот правильный ответ:

Чтобы перечислить все устройства, доступные в симуляторе cordova run ios --list

В результате получится что-то вроде этого:

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"Используйте любую цель из вышеперечисленного. Бежать в симуляторе.

Черная мамба
источник