Подтвердить что ты не робот

Ошибка: не удается прочитать свойство "replace" из undefined при создании iOS Cordova

Я создал проект cordova, используя cordova create project hello com.hello Hello.

И добавлена ​​платформа iOS с использованием cordova platform add iOS. И попытался сделать cordova run ios после cordova build ios.

Но это показывает мне эту ошибку (я использовал --d/--verbose, чтобы получить детали).

/usr/bin/codesign --force --sign - --timestamp = none /Volumes/Untitled/Plot/PlotReel/platforms/ios/build/emulator/PlotReel.app /Volumes/Untitled/Plot/PlotReel/platforms/ios/build/emulator/PlotReel.app: заменяя существующую подпись

** BUILD SUCCEEDED **

Не найдено никаких скриптов для hook "before_deploy". Ошибка: TypeError: Can not read свойство "replace" из undefined

at remove (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/ios-sim/src/lib.js:282:70)
at Array.forEach (native)
at Object.getdevicetypes (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/ios-sim/src/lib.js:292:22)
at Object.listEmulatorImages [as run] (/Volumes/Untitled/Plot/test/platforms/ios/cordova/lib/list-emulator-images:34:29)
at deployToSim (/Volumes/Untitled/Plot/test/platforms/ios/cordova/lib/run.js:146:50)
at /Volumes/Untitled/Plot/test/platforms/ios/cordova/lib/run.js:88:20
at _fulfilled (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/q/q.js:834:54)
at self.promiseDispatch.done (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/q/q.js:863:30)
at Promise.promise.promiseDispatch (/Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/q/q.js:796:13)
at /Volumes/Untitled/Plot/test/platforms/ios/cordova/node_modules/q/q.js:604:44

Я попытался удалить и установить кордову снова, но проблема все еще остается.

Пожалуйста, помогите мне.

4b9b3361

Ответ 1

Новое решение

Эта проблема исправлена ​​в последней версии пакета "ios-sim" (так что теперь это, вероятно, более простое решение - по сравнению со старым, которое приведено ниже). Чтобы обновить пакет "ios-sim" до последней версии, запустите это в своем терминале /cmd:

cd platforms/ios/cordova/node_modules/
sudo npm install -g [email protected]

Старое решение

Проблема заключается в том, что name_id_map[deviceName] возвращает undefined для iPad Pro (12,9-дюймовый) и iPad Pro (10,5-дюймовый).

Вы можете проверить его с помощью console.log('name_id_map[ deviceName ]: ' + name_id_map[ deviceName ]);.

Я исправил эту ошибку, добавив операторы if, которые проверяют, определено ли устройство на " платформах /ios/cordova/ node_modules/ios-sim/src/lib.js:282".

Я заменил это:

list = [];
        var remove = function(runtime) {
            // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id
            list.push(util.format('%s, %s', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
        };

с этим:

list = [];
        var remove = function(runtime) {
            // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id
            if (name_id_map[deviceName] && runtime) {
                list.push(util.format('%s, %s', name_id_map[deviceName].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
            }
        };

"Проигрыватель iPad Pro (10,5-дюймовый)" не будет в списке (но он, вероятно, не работает в любом случае - не проверял).

Отчет об ошибках в github: https://github.com/phonegap/ios-sim/issues/210

Ответ 2

в корне папки проекта, cd platforms/ios/cordova && npm install ios-sim

Ответ 3

У меня была такая же ошибка. Для меня я проследил это в ошибке на платформах /ios/cordova/ node_modules/ios-sim/src/lib.js

getdevicetypes: function(args) {
...
    list.devicetypes.forEach(function(device) {
        name_id_map[ filterDeviceName(device.name) ] = device.id;
    });

    list = [];
    var remove = function(runtime) {
        // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id
        list.push(util.format('%s, %s', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
    };

Ошибка всегда происходила как "TypeError: невозможно прочитать свойство" replace "из undefined" в lib.js: 289

list.push(util.format('%s, %s', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));

Итак, я вставил код отладки:

    list.devicetypes.forEach(function(device) {
        console.log('test 1 ' + device.name);
        console.log('test 2 ' + filterDeviceName(device.name));
        name_id_map[ filterDeviceName(device.name) ] = device.id;
    });

Это сработало для меня. Удачи.

    list = [];
    var remove = function(runtime) {
        // remove "iOS" prefix in runtime, remove prefix "com.apple.CoreSimulator.SimDeviceType." in id
        console.log('remove 1 ' + runtime);
        console.log('remove 2 ' + deviceName);
        console.log('remove 3 ' + name_id_map[ deviceName ]);
        list.push(util.format('%s, %s', name_id_map[ deviceName ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));
    };

и получил следующий вывод:

test 1 iPhone 5
test 2 iPhone 5
test 1 iPad Pro (9.7-inch)
test 2 iPad Pro (9.7 inch)
remove 1 iOS 10.2
remove 2 iPhone 5
remove 3 com.apple.CoreSimulator.SimDeviceType.iPhone-5
remove 1 iOS 10.2
remove 2 iPad Pro (9.7-inch)
remove 3 undefined

Обратите внимание, что filterDeviceName удалял символ минус во время заполнения хэша. Когда значение снова будет восстановлено, фильтр не будет применен, и программа завершится с ошибкой.

Исправить ошибку: примените фильтр во время записи и чтения из хеша.

 list.push(util.format('%s, %s', name_id_map[ filterDeviceName(deviceName) ].replace(/^com.apple.CoreSimulator.SimDeviceType./, ''), runtime.replace(/^iOS /, '')));

Ответ 5

Недавно я обновился до xcode 8.3.3 and ionic 3.4.0

Я удалил каталог ios-sim из myApp/platform/ios/cordova/ node_modules, и теперь он работает.

Ответ 6

Другой вариант - использовать версию cordova-ios с уже реализованным патчем ios-sim

cordova platform add https://github.com/apache/cordova-ios.git#4.4.0-ios-sim

Помните, что это не официальная версия Apache Cordova, это будет включено в следующую версию 4.4.1.

Ответ 7

Я просто столкнулся с этим и подумал, что добавлю что-то, что сработало для меня - решение npm install ios-sim не было.

Все, что я сделал, это открыть XCode, и он указывал на Generic iOS Device, когда я в последний раз использовал его при тестировании приложения на физическом устройстве. Я просто изменил iOS Simulator, чтобы быть в списке iOS Simulator, повторил его, и это сработало как шарм!

Надеюсь, это может помочь кому-то еще в той же ситуации.

Ответ 8

Обновление версии ios-sim с помощью npm install [email protected] не сработало для меня. Но если найти хорошее и простое решение на Github.

  • Открыть /platforms/ios/cordova/node_modules/ios-sim/src/lib.js
  • Поиск deviceName с помощью редактора кода
  • Замените name_id_map[ deviceName ] на name_id_map[filterDeviceName(deviceName)]

Вы можете найти сообщение Github здесь

Ответ 9

Я выполнил следующие команды, и он решает мою проблему:

cd project_dir

sudo npm установить ios-sim @latest